|
|
  |
TI AM1808, разные вопросы |
|
|
|
Jul 14 2014, 08:50
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Если можно поясните здесь подробнее. Что-то не могу понять, что прописано в приведённом выше векторе прерываний. Счас читаю доки, но пока не нахожу ничего по данной теме. Entry - понятно, адрес заданной точки входа, UndefInstHandler, SWIHandler, AbortHandler, IRQHandler, FIQHandler - адреса соответствующих обработчиков. Константы выше Entry - 4 одинаковые 0xE59FF018, ещё 0xE59FF014, 0xE24FF008 и две одинаковые 0xE59FF010 - это всё JUMP? Это ведь должна быть таблица адресов по которым происходит переход при том или ином событии, каким боком здесь JUMP? Описание вектора прерываний из даташита на рисунке, всё практически как в описанной выше таблице за исключением "констант". Попробовал удалять или менять на нули эти константы, процессор запускается и работает, но при срабатывании прерывания вылетает.
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 14 2014, 09:11
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(doom13 @ Jul 14 2014, 14:50)  Если можно поясните здесь подробнее. Что-то не могу понять, что прописано в приведённом выше векторе прерываний. Счас читаю доки, но пока не нахожу ничего по данной теме. Entry - понятно, адрес заданной точки входа, UndefInstHandler, SWIHandler, AbortHandler, IRQHandler, FIQHandler - адреса соответствующих обработчиков. Константы выше Entry - 4 одинаковые 0xE59FF018, ещё 0xE59FF014, 0xE24FF008 и две одинаковые 0xE59FF010 - это всё JUMP? Это ведь должна быть таблица адресов по которым происходит переход при том или ином событии, каким боком здесь JUMP? Что такое дизассемблер знаете? Даже без него могу предположить, что первые 8 строк - команды типа: LDR PC,[PC,#N] а следующие 8 строк - это собственно таблица адресов, которая считывается первыми 8-ю командами.
|
|
|
|
|
Jul 14 2014, 11:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(jcxz @ Jul 14 2014, 12:11)  Цитата(DmitryM @ Jul 14 2014, 13:12)  Спасибо, так и есть, если дизассм сделать, то получаем следующее: Код address | --------------------------------------------------------- 80010000: | E59FF018 LDR PC, 0x80010020 80010004: | E59FF018 LDR PC, 0x80010024 80010008: | E59FF018 LDR PC, 0x80010028 8001000c: | E59FF018 LDR PC, 0x8001002C 80010010: | E59FF014 LDR PC, 0x8001002C 80010014: | E24FF008 SUB PC, PC, #0x8 80010018: | E59FF010 LDR PC, 0x80010030 8001001c: | E59FF010 LDR PC, 0x80010034 80010020: | XXXXXXX1 Entry_Adddress 80010024: | XXXXXXX2 UndefInstHandler_Adddress 80010028: | XXXXXXX3 SWIHandler_Adddress 8001002c: | XXXXXXX4 AbortHandler_Adddress 80010030: | XXXXXXX5 IRQHandler_Adddress 80010034: | XXXXXXX6 FIQHandler_Adddress , что соответствует таблице векторов прерываний из даташита. Неверно посчитал - это должна быть таблица переходов на адреса обработчиков, а не просто их адресов. Ещё не совсем понятна необходимость её переноса в ARM RAM? Получится ли сделать кусок кода на ассме, который отвечает за эти переходы, разместить его в секцию vectors, а её через CMD-файл прикрутить к ARM RAM? Или поскольку к ARM RAM имеет доступ только сам ARM, то с эмулятором такой вариант точно не прокатит, а если это будет загрузчик, то подход тоже неверный, т.е. при старте программы всегда необходимо перебросить твблицу векторов прерываний в ARM RAM?
|
|
|
|
|
Nov 11 2014, 09:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Приветствую! Помогите разобраться, куда копать. Проблема следующая. Есть программа, заливаю её в процессор всё работает. В CCS v5.5 останавливаю процессор нажимаю "Suspend", далее нажимаю "CPU Reset", "Restart", "Resume", всё заново запускается и работает. Добавляю кусок кода, который настраивает и использует прерывария от McBSP и тогда всё работает только один раз после включения питания либо Hard Reset-a. В начале программы использую настройку прерываний, все функции из AM1808_StarterWare: Код IntAINTCInit(); //Enable IRQ for ARM (in CPSR)*/ IntMasterIRQEnable(); // Enable AINTC interrupts in GER */ IntGlobalEnable(); // Enable IRQ in AINTC */ IntIRQEnable(); при инициализации McBSP выполняется следующий кусок кода: Код IntRegister((device_num ? SYS_INT_MCBSP1_RINT : SYS_INT_MCBSP0_RINT), isr); IntChannelSet((device_num ? SYS_INT_MCBSP1_RINT : SYS_INT_MCBSP0_RINT), (device_num ? AINTC_CHANNEL_5_MCBSP1RX : AINTC_CHANNEL_4_MCBSP0RX)); IntSystemEnable((device_num ? SYS_INT_MCBSP1_RINT : SYS_INT_MCBSP0_RINT)); Если поставить точку останова на IntIRQEnable(), дойдёт до неё, далее при нажатии на "Resume" опять попадает на эту же строку (каким-то образом само перезапустилось). Если убираем из программы настройку прерываний McBSP, всё будет работать нормально. UPP: Хочу уточнить. Ещё раз всё посмотрел, получается, программа сбрасывается на самое начало. Ещё нашёл, что в CCS можно выбирать кнопку сброса "CPU Reset (SW)", "CPU Reset (HW)" и "System Reset". Так вот, если для программы с "глючным куском кода" делать "CPU Reset", то перезапустить её не получится, выполнение доходит до определённого места, а потом каким-то образом происходит сброс на начало. Если выполнить "System Reset" и "Restart", то программа запустится нормально. Для программы без использования прерывания от McBSP можно использовать любой вариант сброса. В чём отличие? И как сделать правильно, чтоб запускалось в любом случае?
|
|
|
|
|
Mar 27 2015, 05:40
|
Группа: Новичок
Сообщений: 2
Регистрация: 26-03-15
Пользователь №: 85 892

|
Помогите найти пример для работы с SD картой на AM1808
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|