Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2368, VIC и полтергейст
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Kitsok
Добрый день!

Наверное, глаз уже замылился.
Пытаюсь оживить порт 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 и после.

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

Естественно - VIC считает, что вектор уже прочитан. И ему все равно, сделало это ядро, или кто другой.
Kitsok
Цитата(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, который позволяет два раза прочитать регистр как раз на случай отладки.
В любом случае, сейчас попробую брейк поставить на обработчик.
zltigo
Цитата(Kitsok @ Mar 3 2010, 23:47) *
Ставлю брейкпоинт на вектор вызова IRQ, там у меня:
ldr pc, [PC, #-0xFF0] ;; IRQ

Жертва отладчиков sad.gif.
Так какой, говорите у Вас контроллер LPC23xx? и КАКОЙ ЕГО РЕГИСТР Вы в таком случае пытаетесь считать
вышеупомянутой командой sad.gif?
Kitsok
Цитата(zltigo @ Mar 4 2010, 00:01) *
Жертва отладчиков sad.gif.

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

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

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

Где облом?

Update: проверил, стоит у меня брейк и на входе в вызываемый обработчик, так что накосячил я где-то тут...
aaarrr
Цитата(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.
zltigo
Цитата(Kitsok @ Mar 4 2010, 00:04) *
Поэтому я намека не понял.

Для того, что-бы что-то отладить, нужно сначала что-то написать. Вы решили документацию не читать, не писать а скопипастить и заняться отладкой.
Цитата
Где облом?

Облом в том, что контролеры прерываний у LPC21xx и LPC23xx разные. И по адресу 0xFFFFF030 который Вы в результате получите
(кстати, а причем тут 0x240 если у Вас 0xFF0) не найдете желаемого. Правильное число вдвое меньше 0x240, тогда получите 0xFFFFFF00 - VICAddress
Kitsok
Цитата(aaarrr @ Mar 4 2010, 00:09) *
-0xFF0 и -0x240

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

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

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

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

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

PC в контексте команды равен не текущему адресу, а текущему адресу + 8. Правильное число уже огласили - это -0x120.
0x18 + 0x08 - 0x120 = 0xffffff00
Kitsok
Цитата(aaarrr @ Mar 4 2010, 00:21) *
PC в контексте команды равен не текущему адресу, а текущему адресу + 8.

Да, это я не учел, потом вспомнил.
Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.