|
|
  |
LPC2368, VIC и полтергейст, вешаюсь |
|
|
|
Mar 3 2010, 20:47
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Добрый день! Наверное, глаз уже замылился. Пытаюсь оживить порт FreeRTOS + IAR + LPC2368. Всякое было, но наткнулся, и не помню, было со мной такое на SAM7, или нет. Суть вот в чем: настроен Timer0, на нем разрешено прерывание, VIC настроен на вызов некой функции. Кроме этого разрешено SWI, с ним все хорошо. Ставлю брейкпоинт на вектор вызова IRQ, там у меня: ldr pc, [PC, #-0xFF0] ;; IRQ Одновременно стоит watch на адрес 0xffffff00, по этому вызову (после останова по брейку) - правильный адрес. Жму F11 (step) - и улетаю на reset (0x00000000). IAR - 5.41, отлаживаю через MT-Link, отладка в RAM, командный файл отладчика: Код execUserReset() { __writeMemory32(0x00000002, 0xE01FC040, "Memory"); // MEMMAP = 2; }
execUserPreload() { __writeMemory32(0x00000002, 0xE01FC040, "Memory"); // MEMMAP = 2; } Ниже - скриншоты до F11 и после. Ткните пожалуйста носом, что я упускаю? Заранее спасибо!
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 3 2010, 20:53
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(aaarrr @ Mar 3 2010, 23:50)  Естественно - VIC считает, что вектор уже прочитан. И ему все равно, сделало это ядро, или кто другой. Минуточку, а разве по этому "адресу" это "значение" не висит, пока мы не сделаем фиктивную запись? Выдержка из мануала: Contains the address of the ISR for the currently active interrupt. This register must be written (with any value) at the end of an ISR, to update the VIC priority hardware. Writing to the register at any other time can cause incorrect operation. Ничего не сказано про то, что читать можно только один раз. Это (если правильно помню) в SAMовском AICе есть режим Debug, который позволяет два раза прочитать регистр как раз на случай отладки. В любом случае, сейчас попробую брейк поставить на обработчик.
|
|
|
|
|
Mar 3 2010, 21:01
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Kitsok @ Mar 3 2010, 23:47)  Ставлю брейкпоинт на вектор вызова IRQ, там у меня: ldr pc, [PC, #-0xFF0] ;; IRQ Жертва отладчиков  . Так какой, говорите у Вас контроллер LPC23xx? и КАКОЙ ЕГО РЕГИСТР Вы в таком случае пытаетесь считать вышеупомянутой командой  ?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 3 2010, 21:04
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(zltigo @ Mar 4 2010, 00:01)  Жертва отладчиков  . Не без того.... Цитата Так какой, говорите у Вас контроллер LPC23xx? и КАКОЙ ЕГО РЕГИСТР Вы в таком случае пытаетесь считать вышеупомянутой командой? Я сначала подумал, что вы имеете в виду PC Vs. pc, но ассемблеру пофигу. Поэтому я намека не понял. Этой инструкцией я хочу взять содержимое PC, вычесть из него 0xff0 (а не 0x240, уже мозг закипает) (получив в результате 0xffffff00), и загрузить это значение назад в pc. Где облом? Update: проверил, стоит у меня брейк и на входе в вызываемый обработчик, так что накосячил я где-то тут...
|
|
|
|
|
Mar 3 2010, 21:09
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Kitsok @ Mar 4 2010, 00:04)  Где облом? -0xFF0 и -0x240 Если инструкция расположена по адресу 0x18, то для чтения 0xFFFFFF00 должно быть LDR PC, [PC, #-0x120]. Но ставить watch на VICADDRESS в любом случае не комильфо, т.к.: Цитата Reading or writing to this register at other times can cause incorrect operation.
|
|
|
|
|
Mar 3 2010, 21:14
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Kitsok @ Mar 4 2010, 00:04)  Поэтому я намека не понял. Для того, что-бы что-то отладить, нужно сначала что-то написать. Вы решили документацию не читать, не писать а скопипастить и заняться отладкой. Цитата Где облом? Облом в том, что контролеры прерываний у LPC21xx и LPC23xx разные. И по адресу 0xFFFFF030 который Вы в результате получите (кстати, а причем тут 0x240 если у Вас 0xFF0) не найдете желаемого. Правильное число вдвое меньше 0x240, тогда получите 0xFFFFFF00 - VICAddress
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 3 2010, 21:18
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(aaarrr @ Mar 4 2010, 00:09)  -0xFF0 и -0x240 Я жертва копипаста, а не отладчика Помогите пожалуйста посчитать, я не догоняю... PC=18, 18-240 = FFFFFDD8. Впрочем, 18-ff0=fffff028.... Update: Все, догнал. В какой-то момент я результирующий адрес проверял, но, видимо, заметался, и не обратил внимания. Спасибо, что посмотрели свежим взглядом P.S. А документацию я читал, и продолжаю читать, так что не надо меня уж прямо так мордой-то в грязь.
|
|
|
|
|
Mar 3 2010, 21:29
|
Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136

|
Цитата(aaarrr @ Mar 4 2010, 00:21)  PC в контексте команды равен не текущему адресу, а текущему адресу + 8. Да, это я не учел, потом вспомнил. Спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|