Полная версия этой страницы:
ARM7 вопрос
emerg_reanimator
May 26 2005, 07:03
Добрый день
Подскажите при каких условиях ЦПУ попдает в этот режим? Углубление в описание на архитектуру (DDI0210B ARM7TDMI Rev.4) ясности не прибавило.
как правило ЦПУ состоит из ядра(в данном случае это arm7tdmi) и обвязки (генераторы чип селектов внешней памяти, менеджеры памяти и периферии). Ну так вот, когда обвязка определяет, что ядро планирует цикл обмена по адресу памяти, который данная обвязка не поддерживает иди адрес попадает в "запрещенный" регион(это решение принимает как правило MMU)обвязка генерирует сигнал abort для ядра. Вот цитата из пдф-ки от AT91M40XXX:
Abort Control The abort signal providing a Data Abort or a Prefetch Abort exception to the ARM7TDMI
is asserted in the following cases:
• When accessing an undefined address in the EBI address space
• When writing to a write-protected internal memory area on the AT91R40807
Здесь четко определены два случая при каких может возникнуть аборт:
1. Когда доступ происходит по неизвесному для EBI (обвязка) адресным пространствам.
2. Когда запись происходит в защищенный от записи регион AT91R40807...
emerg_reanimator
May 26 2005, 09:09
Точно!
Вспомнил. В описании на LPC2124 тоже указывается в каких ситуациях ЦПУ попадает в это исключения.
Но вопрос возник по другому поводу.
На Olimex LPC E2124 происходит ошибочное измениение указателя стэка.
Код
...
OSStartHighRdy
MSR CPSR_cxsf,#0xDF ; Switch to SYS mode with IRQ and FIQ disabled
BL OSTaskSwHook ; OSTaskSwHook();
...
После выполнения инструкции загрузки CPSR происходит обновление R14(SP). В стэк записывается значение адресса который указывает на несуществующую область памяти. И в итоге я попдаю в исключение по данным.
Такая ситуация происходит когда ЦПУ не нагрелся до рабочей температуры
Наверняка имеет место недопонимание некоторых особенностей архитектуры платформы ARM. Всегда необходимо помнить что для каждого режима работы процессора необходимо проинициализировать отдельную область стека и КАЖДЫЙ указатель стека, а они разные для каждого режима работы. Если этого не выполнить, тогда и появляются вышеописанные глюки...
emerg_reanimator
May 27 2005, 11:30
Именно так уважаемый d__
Не инициализировался стэк в режиме System. После добавления инициализации ситуация исчезла.
Но обнаружилась другая фича. Под IAR 3.21a на Olimex LPC E2124 пытается крутится uCOS-II 2.76 + uCOS-View 1.10. Помаргивает диодами до момента пока я не открываю в отладчике C-spy окошко с регистрами контроллера прерываний (КП, VIC). После этого дейтвия, прерывания ЦПУ игнорируются (прерывания в ЦПУ разрешены, флаг готовности в регистре статуса КП установлен). Установленны два прерывания от TIMER0 и UART0.
Не могу сказать ничего хорошего. Скорее всего если отладчик влезает в регистры управления контроллером прерывания, то возможно нарушение нормальной работы изза того что некоторые регистры во время считывания могут изменить состояние контроллера прерывания(сдвиг приоритетов или сброс каких-либо битов состояния). Другая версия звучит примерно так, при вводе процессора в режим отладки процессор прекращает выполнение программы...
emerg_reanimator
May 28 2005, 09:41
Я не совсем правильно описал проблему.
Отладка с использованием внутрисхемного эмулятора проходит норамально (тоесть я могу смотреть состояние регистров, делать пошаговае выполнение и т.п., но после того как я ознакомился с содержанием регистров КП, ЦПУ не воспринимает прерывания хотя выполнение инструкций продолжается). Я думаю это скрое связано с самим ЦПУ нежели с отладчиком. Надо попрбывать что-нибудь подобное в другой среде.
Цитата(emerg_reanimator @ May 28 2005, 12:41)
Я не совсем правильно описал проблему.
Отладка с использованием внутрисхемного эмулятора проходит норамально (тоесть я могу смотреть состояние регистров, делать пошаговае выполнение и т.п., но после того как я ознакомился с содержанием регистров КП, ЦПУ не воспринимает прерывания хотя выполнение инструкций продолжается). Я думаю это скрое связано с самим ЦПУ нежели с отладчиком. Надо попрбывать что-нибудь подобное в другой среде.
Навряд-ли. Скорее C-SPY после режима отладки "забывает" вновь рзарешить прерывания в ячейке Embedded ICE. Для выяснения попробуйте другой отладчик.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.