วิธีการเริ่มต้นหลัก 1,2,3 ใน Raspberry Pi 2


10

ฉันได้เขียนตัวอย่างโลหะหลายแกนที่เปลือยเปล่า

รหัสแผนภาพวงจรอยู่ที่นี่ - https://github.com/jeffreyantony/multipi/tree/master/Example_01

ในตัวอย่างของฉันมี LED 3 ดวงเชื่อมต่อกับ GPIO ของราสเบอร์รี่ Pi ราสเบอร์รี่ Pi 2 มีทั้งหมด 4 คอร์แต่ละคอร์ได้รับมอบหมายให้กระพริบ LED ที่สอดคล้องกัน

ฉันเขียนที่อยู่ของรหัสที่จะดำเนินการโดยแต่ละแกนในที่อยู่ด้านล่าง 0x4000009C สำหรับแกน 1 0x400000AC สำหรับแกน 2 0x400000BC สำหรับแกน 3

หลังจากรวบรวมรหัสเฉพาะ LED ที่กำหนดให้กับคอร์ 1 เท่านั้นที่จะกระพริบ (ตามตัวอย่างนี้คือ LED สีเหลือง) คนอื่นไม่ได้

ซึ่งหมายความว่ารหัสสำหรับ Core 2 และ 3 ไม่ทำงาน (เนื่องจาก LED อื่นไม่กะพริบ) ฉันก็พบว่ารหัสหลังจากที่เริ่มต้นแกนทั้งหมดก็ยังไม่ทำงานเช่น core0_submain () - ฟังก์ชั่นนี้ควรกระพริบ ACT ACT บน Raspberry Pi

ใครช่วยให้ฉันรู้ว่าปัญหาคืออะไร? เป็นเพราะคอร์ทั้ง 4 พยายามที่จะเขียนลงทะเบียน GPIO เดียวกันและ Core 1 เท่านั้นที่ชนะในการเขียนหรือไม่

ฉันพยายามเพิ่ม " attribute ((naked));" สำหรับ core0_submain () แต่ไม่มีประโยชน์

ฉันใช้ toolchain จากhttps://launchpad.net/gcc-arm-embedded

รหัสอีกครั้ง - https://github.com/jeffreyantony/multipi/blob/master/Example_01/main.c

makefile - https://github.com/jeffreyantony/multipi/blob/master/Example_01/Makefile

อัปเดต 20 ต.ค. 2558 : ฉันได้เพิ่มการสนับสนุนสำหรับ JTAG แต่ไม่ประสบความสำเร็จในการรับส่วนต่อการดีบัก
อัปเดต 25 ต.ค. 2558 : ปัญหาได้รับการแก้ไข ดูคำตอบ

แผนภูมิวงจรรวม ป้อนคำอธิบายรูปภาพที่นี่


ดูเหมือนจะเจ๋งจริงๆ ฉันจะดูมัน ฉันหมายถึงอาจมีซอฟต์แวร์บางอย่างใน raspbian ที่ใช้ 1 คอร์เท่านั้นเว้นแต่ว่าซอฟต์แวร์อื่นต้องการประหยัดพลังงานหรือบางสิ่งบางอย่าง ...
Kachamenus

คำตอบ:


6

อัปเดต 25 ต.ค. 2558:

ฟอรั่มราสเบอร์รี่ Pi ให้คำตอบกับฉัน

  1. ไม่มีแนวคิดของ _start เมื่อใช้ -nostdlib

  2. รหัสที่จะดำเนินการครั้งแรกควรเป็นไฟล์แรกที่จะส่งผ่านไปยังลิงเกอร์

  3. หากจำเป็นต้องมีการควบคุมที่ดีกว่าจะต้องวางโค้ดในส่วน init และขอให้ลิงเกอร์ทำการคัดลอกส่วนนี้ไป 0x8000

ขอบคุณทุกท่านที่ให้การสนับสนุน เรียนรู้มากมายเกี่ยวกับ GNU C Compiler

อัปเดต 24 ตุลาคม 2558:

เมื่อฉันเปลี่ยนลำดับของไฟล์ที่กำหนดไว้สำหรับการคอมไพล์ใน Makefile ฉันได้รับการสั่งซื้อที่ถูกต้อง (เช่นที่0x8000เรามี_startฟังก์ชั่น) พร้อม-O2การเพิ่มประสิทธิภาพ แต่คำถามด้านล่างสแต็คโฟลว์ของฉันเกี่ยวกับ_startสัญลักษณ์ยังไม่ได้รับการแก้ไข มีการเช็คอินรหัสใหม่

ฉันประสบความสำเร็จ รหัสใหม่จะถูกตรวจสอบเข้าไปใน GitHub

ตัวอย่างทำงานไม่สมบูรณ์ มีปัญหาบางอย่างกับการรวบรวม ฉันจะอธิบายแต่ละข้อ:

  1. ที่จริงฉันคาดหวังว่าจะได้รับ_startสัญลักษณ์จากการเริ่มต้นที่กำหนดเองของฉัน แต่มันไม่ใช่กรณี ด้วยเหตุนี้ตัวชี้สแต็กจึงไม่ถูกกำหนดค่าและการข้ามไปยังหลักไม่เกิดขึ้น

ฉันได้ถามคำถามเกี่ยวกับเรื่องนี้แล้ว แต่ฉันไม่ก้าวหน้ามากนัก ดังนั้นฉันจึงเพิ่มชุดประกอบแบบอินไลน์เพื่อโหลดตัวชี้สแต็กในฟังก์ชั่นหลัก

  1. แต่ยังคงรหัสไม่ทำงาน เมื่อตรวจสอบรายชื่อการชุมนุมผมพบว่าที่อยู่0x8000(ที่การดำเนินการเริ่มต้น) ของราสเบอร์รี่ Pi เป็นรหัสสำหรับแกน 1 void core1_main(void)- ข้อสันนิษฐานของฉันคือที่0x8000จะมี_start(ซึ่งไม่ใช่ตั้งแต่ไฟล์ start.S ไม่ได้ถูกรวบรวมไว้) หรืออย่างน้อยฟังก์ชัน void main (void) สิ่งนี้เกิดขึ้นเนื่องจากการ-O2เพิ่มประสิทธิภาพของ GCC ใน GCC ที่มีระดับสูงกว่าการเพิ่มประสิทธิภาพของฟังก์ชั่นที่มีการจัดลำดับใหม่ .. เมื่อผมปิดการเพิ่มประสิทธิภาพ ( -O0) แล้วที่อยู่ที่0x8000หลักในปัจจุบัน

คุณสามารถอ่านเกี่ยวกับฟังก์ชั่นการเรียงลำดับใหม่ได้ที่นี่

สรุป: รหัสปัจจุบันเป็นเพียงการแก้ไข ปัญหาหลักที่ต้องแก้ไข - ทำไม _start ไม่ถูกเรียกใช้ตั้งแต่เริ่มต้น? หากได้รับการแก้ไขแล้วที่อยู่0x8000 _startจะมา ด้วยสิ่งนี้เราไม่ต้องกังวลเกี่ยวกับการสั่งซื้อฟังก์ชั่นที่ทำโดย GCC ระหว่างการเพิ่มประสิทธิภาพที่สูงขึ้น

นอกจากนี้ยังมีวิดีโอตัวอย่างจากด้านข้างของฉันเพื่อเป็นหลักฐาน แม้ว่าอัตราการกะพริบของไฟ LED จะแตกต่างกันและเป็นระยะ ๆ ในรหัสเนื่องจากแกนทั้งหมดพยายามเขียนลงทะเบียน GPIO เดียวกันมีข้อขัดแย้งบางประการที่ทำให้ไฟ LED กะพริบในช่วงเวลาสุ่ม


ลองดูที่รหัสแหล่ง htop ว่าทำอย่างไรเพื่อแสดงข้อมูลหลายคอร์ต่อหน้าจอ
Piotr Kula

3
@ppumkin นั่นไร้สาระ htopเป็นเครื่องมือ * userix ตาม * บน Linux /procก็แค่ได้รับข้อมูลจากเมล็ดผ่าน นี่คือสิ่งที่โลหะเปลือย ไม่มีเคอร์เนลที่จะสืบค้น
goldilocks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.