реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC2368, VIC и полтергейст, вешаюсь
Kitsok
сообщение Mar 3 2010, 20:47
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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 и после.

Ткните пожалуйста носом, что я упускаю?
Заранее спасибо!
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 3 2010, 20:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kitsok @ Mar 3 2010, 23:47) *
Одновременно стоит watch на адрес 0xffffff00, по этому вызову (после останова по брейку) - правильный адрес.
Жму F11 (step) - и улетаю на reset (0x00000000).

Естественно - VIC считает, что вектор уже прочитан. И ему все равно, сделало это ядро, или кто другой.
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Mar 3 2010, 20:53
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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, который позволяет два раза прочитать регистр как раз на случай отладки.
В любом случае, сейчас попробую брейк поставить на обработчик.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 3 2010, 21:01
Сообщение #4


Гуру
******

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



Цитата(Kitsok @ Mar 3 2010, 23:47) *
Ставлю брейкпоинт на вектор вызова IRQ, там у меня:
ldr pc, [PC, #-0xFF0] ;; IRQ

Жертва отладчиков sad.gif.
Так какой, говорите у Вас контроллер LPC23xx? и КАКОЙ ЕГО РЕГИСТР Вы в таком случае пытаетесь считать
вышеупомянутой командой sad.gif?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Mar 3 2010, 21:04
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(zltigo @ Mar 4 2010, 00:01) *
Жертва отладчиков sad.gif.

Не без того....
Цитата
Так какой, говорите у Вас контроллер LPC23xx? и КАКОЙ ЕГО РЕГИСТР Вы в таком случае пытаетесь считать
вышеупомянутой командой?

Я сначала подумал, что вы имеете в виду PC Vs. pc, но ассемблеру пофигу.
Поэтому я намека не понял.

Этой инструкцией я хочу взять содержимое PC, вычесть из него 0xff0 (а не 0x240, уже мозг закипает) (получив в результате 0xffffff00), и загрузить это значение назад в pc.

Где облом?

Update: проверил, стоит у меня брейк и на входе в вызываемый обработчик, так что накосячил я где-то тут...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 3 2010, 21:09
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 3 2010, 21:14
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Mar 3 2010, 21:18
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(aaarrr @ Mar 4 2010, 00:09) *
-0xFF0 и -0x240

Я жертва копипаста, а не отладчика wink.gif

Помогите пожалуйста посчитать, я не догоняю...
PC=18, 18-240 = FFFFFDD8.
Впрочем,
18-ff0=fffff028....

Update: Все, догнал.
В какой-то момент я результирующий адрес проверял, но, видимо, заметался, и не обратил внимания.

Спасибо, что посмотрели свежим взглядом wink.gif

P.S. А документацию я читал, и продолжаю читать, так что не надо меня уж прямо так мордой-то в грязь.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 3 2010, 21:21
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kitsok @ Mar 4 2010, 00:18) *
Помогите пожалуйста посчитать, я не догоняю...
PC=18, 18-240 = FFFFFDD8.
Впрочем,
18-ff0=fffff028....

PC в контексте команды равен не текущему адресу, а текущему адресу + 8. Правильное число уже огласили - это -0x120.
0x18 + 0x08 - 0x120 = 0xffffff00
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Mar 3 2010, 21:29
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(aaarrr @ Mar 4 2010, 00:21) *
PC в контексте команды равен не текущему адресу, а текущему адресу + 8.

Да, это я не учел, потом вспомнил.
Спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.0145 секунд с 7
ELECTRONIX ©2004-2016