Получение программного обеспечения прерывает работу в голом металле Beaglebone Black

Я использую CCS 5.5 для программирования Beaglebone Black. Я могу успешно начать работать с JTAG.

Я сейчас пытаюсь начать мигать светодиодами. Для этого мне нужно настроить GPIO1. При попытке настроить этот порт я обнаружил, что среда выполнения C TI немедленно переходит в пользовательский режим (4 инструкции из автозагрузки). Когда я пытаюсь прочитать или записать ячейки памяти управления, я получаю ошибку, которая, по нашему мнению, вызвана отсутствием режима супервизора.

Чтобы перейти в режим супервизора, я пытаюсь написать программный обработчик прерываний, а затем выполнить необходимую настройку оттуда. Я могу написать обработчик, и я могу получить main() для вызова программного прерывания, но я изо всех сил пытаюсь заставить мой обработчик прерываний работать.

#pragma SWI_ALIAS(7);
int function(int i);

#pragma INTERRUPT(SWI);
int function(int i)
{
return i + 1;
}

int main(void) {
int i = function(5);
while(1);
}

Звонки в function производить SWI 7 в разборке, как и следовало ожидать, но function никогда не называется. Я написал файл intvecs.asm, но это не помогло.

    .global _c_int00
.global _Z8functioni

.retain ".intvecs".sect ".intvecs"B _c_int00 ; reset interrupt
.word 0 ; undefined instruction interrupt
B _Z8functioni ; software interrupt
.word 0 ; abort (prefetch) interrupt
.word 0 ; abort (data) interrupt
.word 0 ; reserved
.word 0 ; IRQ interrupt
.word 0 ; FIQ interrupt

Буду признателен за любые предложения о том, как заставить это работать.


Похоже, что .gel файл, который поставляется с CCS 5.5, на самом деле не разрешает запись в 0x00000000, который, на мой взгляд, является расположением векторов прерываний. Таким образом, адаптер JTAG не обновляет вектор прерывания.

2

Решение

Если вы занимаетесь программированием, то можете переписать код запуска asm, чтобы НЕ входить в режим пользователя и оставаться в режиме SVC.

1

Другие решения

Наконец, я нашел в Техническом справочном руководстве в разделе 26.1.3.2 Карта памяти общего ОЗУ следующий абзац:

Векторы исключений в ОЗУ обеспечивают простое средство для перенаправления
исключения из пользовательских обработчиков. Таблица 26-3 показывает содержимое ОЗУ
место зарезервировано для векторов RAM. Первые семь адресов ARM
инструкции, которые загружают значение, расположенное в последующих семи
адреса в реестре ПК. Тезисы инструкции выполняются при
возникает исключение, так как они вызываются из исключения ПЗУ
векторы. Неопределенные, SWI, Unused и FIQ исключения перенаправляются в
жестко закодированная мертвая петля. Прерывание предварительной выборки, прерывание данных и исключение IRQ
перенаправляются на предопределенные обработчики ПЗУ. Пользовательский код может перенаправить любой
исключение для пользовательского обработчика, либо записав его адрес в
соответствующее местоположение от 4030CE24h до 4030CE3Ch или путем переопределения
инструкция перехода (загрузки в ПК) между адресами от 4030CE04h до
4030CE1Ch.

Основой для таблицы обработчиков исключений на этом микроустройстве является 0x4030CE24, а не 0x00000000 или 0xffff0000, как указано в руководстве ARM.

0