Я использую 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 не обновляет вектор прерывания.
Если вы занимаетесь программированием, то можете переписать код запуска asm, чтобы НЕ входить в режим пользователя и оставаться в режиме SVC.
Наконец, я нашел в Техническом справочном руководстве в разделе 26.1.3.2 Карта памяти общего ОЗУ следующий абзац:
Векторы исключений в ОЗУ обеспечивают простое средство для перенаправления
исключения из пользовательских обработчиков. Таблица 26-3 показывает содержимое ОЗУ
место зарезервировано для векторов RAM. Первые семь адресов ARM
инструкции, которые загружают значение, расположенное в последующих семи
адреса в реестре ПК. Тезисы инструкции выполняются при
возникает исключение, так как они вызываются из исключения ПЗУ
векторы. Неопределенные, SWI, Unused и FIQ исключения перенаправляются в
жестко закодированная мертвая петля. Прерывание предварительной выборки, прерывание данных и исключение IRQ
перенаправляются на предопределенные обработчики ПЗУ. Пользовательский код может перенаправить любой
исключение для пользовательского обработчика, либо записав его адрес в
соответствующее местоположение от 4030CE24h до 4030CE3Ch или путем переопределения
инструкция перехода (загрузки в ПК) между адресами от 4030CE04h до
4030CE1Ch.
Основой для таблицы обработчиков исключений на этом микроустройстве является 0x4030CE24, а не 0x00000000 или 0xffff0000, как указано в руководстве ARM.