Я написал голый металлический многоядерный пример.
Код, принципиальная схема здесь - 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 : проблема устранена. Смотри ответ.
источник
Ответы:
Обновление 25 октября 2015 г .:
Форум Raspberry Pi дал мне ответ .
Нет понятия _start при использовании -nostdlib
код, который должен быть выполнен первым, должен быть первым файлом, передаваемым компоновщику.
Если требуется лучший контроль, код необходимо поместить в раздел инициализации и попросить компоновщика скопировать этот раздел в
0x8000
Спасибо всем за поддержку. Много узнал о компиляторе GNU C.
Обновление 24 октября 2015 г .:
Когда я изменил порядок файлов, предоставляемых для компиляции в Makefile, я получил правильный порядок (т. Е. У
0x8000
нас есть_start
функция) с-O2
оптимизацией. Но все же мой нижеуказанный вопрос, связанный с_start
символом stackoverflow, еще не решен. Новый код зарегистрирован.У меня был некоторый успех. Новый код проверен в github .
Пример не полностью запущен. Есть некоторые проблемы с компиляцией. Я объясню каждый:
_start
символ с моего пользовательского запуска. S будет взят. Но это был не тот случай. Из-за этого указатель стека не был настроен, и переход к основному не произошел.Я уже задавал вопрос по этому поводу. Но я не очень прогрессировал. Поэтому я добавил встроенную сборку для загрузки указателя стека в основную функцию.
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
пользовательский инструмент на основе * nix. В Linux он просто получает информацию от ядра через/proc
. Это голый металлический материал. Нет ядра для запроса.