Как запустить ядро ​​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 : проблема устранена. Смотри ответ.

Принципиальная электрическая схема введите описание изображения здесь

robomon
источник
Это кажется действительно классным. Я посмотрю на это. Я имею в виду, что в 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, существуют некоторые конфликты, которые заставляют светодиоды мигать через случайные интервалы.

robomon
источник
Попробуйте взглянуть на исходный код htop, как они это делают, чтобы показать многоядерные данные на экране.
Петр Кула
3
@ppumkin Это бессмысленно. htopпользовательский инструмент на основе * nix. В Linux он просто получает информацию от ядра через /proc. Это голый металлический материал. Нет ядра для запроса.
Златовласка