Як запустити ядро ​​1,2,3 в Raspberry Pi 2


10

Я написав багатоядерний приклад з голого металу.

Код, схема схема тут - https://github.com/jeffreyantony/multipi/tree/master/Example_01

У моєму прикладі є 3 світлодіоди, підключені до штифтів GPIO малинового Пі. В Raspberry Pi 2. всього 4 ядра. Кожному ядру призначено блимати відповідний світлодіод.

Я написав адресу коду, який повинен бути виконаний кожним ядром, у нижчезазначені адреси 0x4000009C для core 1 0x400000AC для core 2 0x400000BC для core 3

Після складання коду блимає лише світлодіод, призначений для серцевини 1 (відповідно до цього прикладу, жовтий світлодіод). Інші - ні.

Це означає, що коди для Core 2 і 3 не працюють (оскільки інші світлодіоди не блимають). Також я виявив, що код після запуску всіх ядер також не працює, тобто core0_submain () - ця функція повинна блимати індикатор ACT на Raspberry Pi

Чи міг би хтось повідомити мені, у чому проблема? Це тому, що всі 4 ядра намагаються записати в один і той же реєстр GPIO, і тільки Core 1 виграє в записі?

Я спробував додати " атрибут ((голий));" для core0_submain (), але використання не було.

Я використовую ланцюжок інструментів з 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 жовтня 2015 р . Я додав підтримку JTAG. Але не вдалося отримати інтерфейс налагодження
Оновлення 25 жовтня 2015 : Виправлена ​​проблема. Дивіться відповідь.

Кругова діаграма введіть тут опис зображення


Це здається дійсно крутим. Я розберуся в це. Я маю на увазі, може бути якесь програмне забезпечення в raspbian, яке використовує лише 1 ядро, якщо інші не потрібні для економії енергії чи чогось іншого ...
Kachamenus

Відповіді:


6

Оновлення 25 жовтня 2015 року:

Raspberry Pi форум дав мені відповідь .

  1. При використанні -nostdlib не існує концепції _start

  2. код, який повинен бути виконаний першим, повинен бути першим файлом, який буде переданий посилання.

  3. Якщо потрібен кращий контроль, код потрібно розмістити в розділі init і попросити лінкер скопіювати цей розділ 0x8000

Дякую всім за підтримку. Дізнався багато про компілятор GNU C.

Оновлення 24 жовтня 2015 року:

Коли я змінив порядок файлів, наданих для компіляції в Makefile, я отримав правильне впорядкування (тобто у 0x8000нас _startфункція) з -O2оптимізацією. Але все ще моє нижче питання про stackoverflow щодо _startсимволу ще не вирішене. Увімкнено новий код.

Я мав певний успіх. Новий код перевіряється в github .

Приклад не повністю працює. Є деякі проблеми зі складанням. Я поясню кожному:

  1. Насправді я очікував, що _startсимвол з мого користувальницького старту буде взято. Але це було не так. Через це покажчик стека не був налаштований, і перехід до основного не відбувся.

Я вже задавав питання з цього приводу. Але я не дуже прогресував. Тож я додав вбудовану збірку для завантаження покажчика стека в основну функцію.

  1. Але все-таки код не запустився. Перевіривши список складання, я виявив, що за адресою 0x8000(де починається виконання) Raspberry Pi є кодом для Core 1 - void core1_main(void). Моє припущення полягало в тому, що в 0x8000ньому буде _startфункція (що не з моменту start.S для компіляції не приймається) або принаймні недійсна основна (недійсна) функція. Це відбувається через -O2оптимізацію GCC. У GCC з більш високими рівнями оптимізації функції переупорядковуються .. Коли я вимкнув оптимізацію ( -O0), то за адресою 0x8000, головна була присутня.

Про переупорядкування функцій ви можете прочитати тут

Підсумок: Поточний код - це лише виправлення. Основна проблема, яку потрібно вирішити - Чому _start не викликається з початку.S? Якщо це зафіксовано, 0x8000 _startприйде адреса . З цим нам не потрібно піклуватися про порядок функцій, виконаний GCC під час вищої оптимізації.

Є також демонстраційне відео з мого боку як доказ. Хоча частота мигання світлодіодів у коді різна і періодична, оскільки всі ядра намагаються записати в одні і ті ж регістри GPIO, є деякі конфлікти, через які світлодіоди блимають у випадкових інтервалах.


Спробуйте і подивіться на вихідний код htop, як вони це роблять для відображення на екрані багатоядерних даних.
Пьотр Кула

3
@ppumkin Це безглуздо. htopє інструментом для користування на основі * nix. У Linux він просто отримує свою інформацію з ядра через /proc. Це голі металеві речі. Немає жодного ядра для запиту.
золотинок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.