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


10

Я написал голый металлический многоядерный пример.

Код, принципиальная схема здесь - https://github.com/jeffreyantony/multipi/tree/master/Example_01

В моем примере есть 3 светодиода, подключенных к выводам GPIO Raspberry Pi. В Raspberry Pi 2 всего 4 ядра. Каждому ядру назначено мигать соответствующим светодиодом.

Я написал адрес кода, который будет выполняться каждым ядром, по адресам ниже 0x4000009C для ядра 1 0x400000AC для ядра 2 0x400000BC для ядра 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. Нет понятия _start при использовании -nostdlib

  2. код, который должен быть выполнен первым, должен быть первым файлом, передаваемым компоновщику.

  3. Если требуется лучший контроль, код необходимо поместить в раздел инициализации и попросить компоновщика скопировать этот раздел в 0x8000

Спасибо всем за поддержку. Много узнал о компиляторе GNU C.

Обновление 24 октября 2015 г .:

Когда я изменил порядок файлов, предоставляемых для компиляции в Makefile, я получил правильный порядок (т. Е. У 0x8000нас есть _startфункция) с -O2оптимизацией. Но все же мой нижеуказанный вопрос, связанный с _startсимволом stackoverflow, еще не решен. Новый код зарегистрирован.

У меня был некоторый успех. Новый код проверен в github .

Пример не полностью запущен. Есть некоторые проблемы с компиляцией. Я объясню каждый:

  1. На самом деле я ожидал, что _startсимвол с моего пользовательского запуска. S будет взят. Но это был не тот случай. Из-за этого указатель стека не был настроен, и переход к основному не произошел.

Я уже задавал вопрос по этому поводу. Но я не очень прогрессировал. Поэтому я добавил встроенную сборку для загрузки указателя стека в основную функцию.

  1. Но все равно код не запускался. Когда я проверил список сборок, я обнаружил, что по адресу 0x8000(где начинается выполнение) Raspberry Pi находится код для Core 1 - void core1_main(void). Мое предположение было, что 0x8000там будет _start(что не так, поскольку файл start.S не берется для компиляции) или, по крайней мере, функция void main (void). Это произошло из-за -O2оптимизации GCC. В GCC, с более высокими уровнями оптимизации, функции переупорядочиваются. Когда я отключил оптимизацию ( -O0), то по адресу 0x8000, присутствовал основной.

Вы можете прочитать о переупорядочении функций здесь

Резюме: текущий код - это просто исправление. Основная проблема, которая должна быть решена - почему _start не вызывается из start.S? Если это будет исправлено, по адресу 0x8000 _startпридет. При этом нам не нужно заботиться о порядке выполнения функций, выполняемом GCC во время более высокой оптимизации.

В качестве доказательства также есть демонстрационное видео с моей стороны. Хотя частота мигания светодиодов различна и периодична в коде, поскольку все ядра пытаются записывать в одни и те же регистры GPIO, существуют некоторые конфликты, которые заставляют светодиоды мигать через случайные интервалы.


Попробуйте взглянуть на исходный код htop, как они это делают, чтобы показать многоядерные данные на экране.
Петр Кула

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