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

 
 
> Прерывания в AT91SAM7X256, проблема с отладкой
Dimmy
сообщение Aug 21 2007, 08:32
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503



Господа!
Помогите разобраться. С АРМ - в начале пути.
Происходят непонятки с прерываниями. Используемое оборудование:
IAR 4.41 + H-JTAG V0.4.4 + Wiggler
В качестве основы приложения взял пример AT91SAM7X-Getting Started. Происходит слелующее.
При отработке кода cstartup.s79 в момент инициализации стека для режима SUPERVISOR на
последней строчке (mov r13, r0) программа "улетает" на default-обработчик прерывания IRQ, где, соответственно,
и остается.

Код
#define TOP_OF_MEMORY    (AT91C_ISRAM + AT91C_ISRAM_SIZE)
#define IRQ_STACK_SIZE   (3*8*4) ; 3 words to be saved per interrupt priority level

#define ARM_MODE_IRQ     0x12
#define ARM_MODE_SVC     0x13
#define I_BIT     0x80
#define F_BIT     0x40

                .....

;- Retrieve end of RAM address
    EXTERN   lowlevel_init
    ldr     r13,=TOP_OF_MEMORY             ;- Temporary stack in internal RAM for Low Level Init execution
    ldr     r0,=lowlevel_init
    mov     lr, pc
    bx      r0                         ;- Branch on C function (with interworking)

;------------------------------------------------------------------------------
;- Setup the stack for each mode
;------------------------------------------------------------------------------
    ldr     r0, =TOP_OF_MEMORY

;- Set up Interrupt Mode and set IRQ Mode Stack
    msr     CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
    mov     r13, r0                    ; Init stack IRQ
    sub     r0, r0, #IRQ_STACK_SIZE
    msr     CPSR_c, #ARM_MODE_SVC | F_BIT
    mov     r13, r0


вот код процедуры lowlevel_init:

Код
void lowlevel_init(void){
    unsigned char i = 0;
    // EFC Init
    AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS; // 1 Wait State to work at 48MHz
    // Init PMC Step 1. Enable Main Oscillator
    AT91C_BASE_PMC->PMC_MOR = (((AT91C_CKGR_OSCOUNT & (0x40 << 8)) | AT91C_CKGR_MOSCEN));
    // Wait Main Oscillator stabilization
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
    // Init PMC Step 2.
    AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1           |
                               AT91C_CKGR_OUT_0              |
                               (16 << 8)                     |
                               (AT91C_CKGR_MUL & (72 << 16)) |
                               (AT91C_CKGR_DIV & 14);
    // Wait for PLL stabilization
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
    // Wait until the master clock is established for the case we already
    // turn on the PLL
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
    // Init PMC Step 3.
    AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
    // Wait until the master clock is established
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
    AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
    // Wait until the master clock is established
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
    //инициализация AIC
    AT91C_BASE_AIC->AIC_SVR[0] = (int) default_fiq_handler;
    for (i = 1; i < 31; i++) {
        AT91C_BASE_AIC->AIC_SVR[i] = (int) default_irq_handler;
    }
    AT91C_BASE_AIC->AIC_SPU = (unsigned int) default_spurious_handler;
    // Perform 8 IT acknoledge (write any value in EOICR)
    for (i = 0; i < 8; i++) {
        AT91C_BASE_AIC->AIC_EOICR = 0;
    }
    // Enable the Debug mode
    AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT;
    // Disable Watchdog
    AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
}


В симуляторе все работает нормально.

Перед выполнением команды [mov r13, r0] состояние AIC в дебаггере в режиме СИМУЛЯТОА
следующее:
AIC_SVR = 0x00000315
AIC_SPU = 0x00000305
AIC_DCR = 0x00000001
остальные - 0x00000000

Перед выполнением команды [mov r13, r0] состояние AIC в дебаггере в режиме RDI + H-JTAG
следующее:
AIC_SVR = 0x00000315
AIR_IVR = 0x00000325
AIR_FVR = 0x00000305
AIR_IPR = 0x00000002
AIR_IMR = 0x00000006
AIR_CISR = 0x00000002
AIC_SPU = 0x00000305
AIC_DCR = 0x00000001

НО:
1. При отключенном wiggler'е при пересбросе питания система работает нормально! О чем сужу
по поведению светодиодов.
2. Один раз из 100 в дебаггере все-таки добираюсь до точки main
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Vinterman
сообщение Nov 26 2008, 03:10
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 3-03-08
Из: г.Томск
Пользователь №: 35 572



Эньдя.... Ну и система отладки .... ППЦ! smile.gif ЗАПУСТИЛ !!!! УРАААА!!!! Я таки запустил прерывания ! И IAR-овские и свои! smile.gif
Трабла была в том, что действительно нельзя смотреть регистр AIC_IVR... ЖЕСТЬ! Естественно в предыдущие свои попытки я никуда без него деться не мог.... Ну и запись в регистр конца прерывания AIC_EOICR оказалось так же необходимой, без нее прерывания тоже не работали. Запись в AIC_EOICR поставил сразу после всех инициализаций, перед началом основного тела программы.

Обнаружились следующие глюки, по которым надо разобраться. нужон ХЕЛП! smile.gif
В моей программе отладчик входит в прерывания только в том случае, если я смотрю регистры того устройства, от которого жду прерывание. Т.е. если у меня запущен таймер, то когда кликаеш кнопку запуска программы "в постоянку"(запамятовал как она обзывается) в прерывание программа заходит всего один раз, а далее выполняется основное тело программы, даже если я ставлю курсор в обработчик прерывания и нажимаю кнопку запуска "выполнить до текущей позиции курсора", то контроллер в прерывания даже не заходит. А вот если я при этом просматриваю регистры таймера и делаю все те же операции, то в прерывания МК заходит. Пошагово все отрабатывается вроде нормально. В самом обработчике прерываний у меня прога меняет состояние светодиода- горит/негорит. И вот даже если я запускаю, просматривая при этом регистры таймера, то светодиод не моргает. Но когда останавливаю/запускаю программу, то состояние светодиода меняется в момент очередного запуска только. Тобиш программа получается заходит в прерывание всего один раз после того как я нажал на кнопку "запуска программы".
В Главном примере от яра такой баг отстутствует. Там я тоже дописал прогу, чтобы при заходе в прерывание менялось состояние светодиода. В основном теле программы так же стоит код - меняющий состояние другого светодиода. И вот тут то все в точности до наоборот. Запускаеш программу (но тут уже не важно смотрю я регистр таймера или не смотрю) - мигает светодиод "прерываний", а основной программы моргнет раза 3-4 и остановится. Пошагово когда смотриш работу, то видно, что только программа вышла из прерывания и сразу же заходит в него обратно. (Хотя до этого же основное тело программы выполнялось параллельно с прерываниями).
Правда один раз случилось чудо и программа заработала нормально после энного программного резета из окна дебугера, т.е. мигали и светодиод основной программы и светодиод прерывания.
В чем может быть баг?

В случае моей программы я использую чутка модифицированный асмовский файл cstartup того же примера яра, только lowinit процедуру я "убил" и вынес ее в другой-отдельный файл инициализации, где так же проходит инициализация нужной мне периферии. В обработчике прерываний между моим и яровским примером имеется следующее отличие в начале :

AT91PS_TC TC_pt = AT91C_BASE_TC0;
unsigned int dummy;
//* Acknowledge interrupt status
dummy = TC_pt->TC_SR;
//* Suppress warning variable "dummy" was set but never used
dummy = dummy;
count_timer0_interrupt++;

- что они этим хотели сделать ?

Но в защиту програмки яра надо сказать, что я припоминаю, что у меня там 2 таймера работают. МОжет это они друг другу толком работать не дают.? Хотя с другой стороны время обработки прерываний много меньше, чем время вызова этих прерываний....


А вообще всем огромное спасибо за то что помогаете новичку !!!! a14.gif
beer.gif

help.gif
Пробовал отладку и в РАМ и во ФЛЭШ и там и там отлаживается везде все одинаково sad.gif
Как теперь мне загрузить програмку в контроллер, чтобы она выполнялась на отладочной плате сразу после включения питания, автономно, не зависимо от дебугера ? А то у меня этот фокус так и не вышел. Подскажите правильные настройки для кристалла AT91SAM7S64 в IAR для Wiggler, чтобы во флэш залить для выполнения автономно....
Пробовал как советовал Сергей:

1) Запускаем IAR, создаем новый workspace или используем текущий.

2) Project->Create new project, выбираем C -> main или C++ -> main по вкусу, жмем ОК, указываем имя проекта.

3) Идем Project -> Options -> General Options
3.1)вкладка Target
--- Ставим крыжик на Device, выбираем в списке тип процессора. Это заставит IAR правильно указывать компилятору/ассемблеру архитектуру (ARM7TDMI, ARM9E и т.д.), правильно выбрать библиотеку, указать симулятору подходящий файл описания sfr (.ddf).
--- Выбираем Processor Mode Arm Или Thumb

4) Project -> Options -> С/С++ Compiler
4.1)вкладка Language
--- В разделе Language галочка уже стоит где надо в зависимости от того, что мы выбрали в п.2. Можно переставиь ее на Automatic(extension based).
4.2)вкладка Optimization
--- Для начала оставляем Size Low или Size none, позволит легко отлаживаться. По мере возрастания опыта можно будет увеличить до максимума.
4.3)вкладка List
--- ставим галочку Output list file
--- Ставим галочку Assembler mnemonics

5) Project -> Options -> Assembler
5.1) Вкладка List
--- ставим галочку Output list file

6) Project -> Options -> Linker
6.1) Вкладка Output
--- Если делаем проект для RAM оставляем все как есть, если для Flash - ставим галочку Allow C-SPY-specific output file и на вкладке Extra output ставим галочки Generate Extra output file и выбираем Output Format -> simple-code
6.2) Вкладка List
--- ставим галочку Generate linker listing
6.3) Вкладка Config
Копируем из папки примеров компилятора в папку проекта подходящий .xcl
--- Link command file ставим галочку Override default, указываем $PROJ_DIR$\файл.xcl
7) Project -> Options -> Debugger
7.1) Вкладка Setup
--- Выбираем Driver (Simulator/J-Link/Macraigor и т.д.)
Копируем из папки примеров .mac в папку проекта
--- Ставим галочку Use Macro File, указываем $PROJ_DIR$\файл.mac
7.2) Если отлаживаемся в Flash: Вкладка Download
--- Если отлаживаемся в Flash, ставим галочки Verify download, Use flash loader(s)
--- Жмем Edit, в появившейся форме New..., в появившемся окне настроек ничего не трогая жмем OK., Жмем ОК в форме выбора загрузчиков.
8) Если используем Wiggler, Project -> Options -> Macraigor
--- Выбираем Wiggler в списке OCD interface device.

Остальное можно не трогать.

9) File->Save all.


В качестве .xcl файла был выбран at91SAM7S64_NoRemap.xcl - стандартный яра а макросовый - SAM7.mac, так же стандартный от яра. Может там чего поменять так же необходимо? Или те настройки что я сделал - это только для дебуга во флэше? Но не автономная работа контроллера ?
еще раз повторюсь - отладочная плата SAM7-P64

Сообщение отредактировал Vinterman - Nov 26 2008, 03:11
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 26 2008, 06:32
Сообщение #3


Гуру
******

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



Цитата(Vinterman @ Nov 26 2008, 06:10) *
- что они этим хотели сделать ?

Прочитать TC_SR для сброса флага прерывания.

Судя по тому, что программа у Вас продолжает выполняться, а прерывание срабатывает один раз, настроено оно на срабатывание по фронту, что может подкинуть еще грабли в будущем.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dimmy   Прерывания в AT91SAM7X256   Aug 21 2007, 08:32
- - AlexBoy   1. Стек желательно инициализировать до вызова lowl...   Aug 21 2007, 10:12
|- - Dimmy   Цитата1. Стек желательно инициализировать до вызов...   Aug 21 2007, 10:52
- - Vinterman   Всем добрый день! Решил поднять тему ибо преры...   Nov 24 2008, 05:36
- - aaarrr   Выхода два: 1. Не отлаживать прерывания под эмулят...   Nov 24 2008, 09:54
|- - Vinterman   Цитата(aaarrr @ Nov 24 2008, 12:54) Выход...   Nov 24 2008, 11:01
|- - Сергей Борщ   Цитата(Vinterman @ Nov 24 2008, 13:01) В ...   Nov 24 2008, 13:36
|- - Vinterman   Цитата(Сергей Борщ @ Nov 24 2008, 16:36) ...   Nov 25 2008, 03:43
- - Dron_Gus   3. ходя по шагам Вы не попадете в прерывание.   Nov 24 2008, 10:45
- - Dron_Gus   Еще блок AIC имеет специальный режим отладки. Тогд...   Nov 24 2008, 14:37
- - Vinterman   Еще вопрос, где есть ветка про то как загрузить че...   Nov 25 2008, 05:43
- - Vinterman   Цитата(aaarrr @ Nov 26 2008, 09:32) Прочи...   Nov 26 2008, 09:42
- - aaarrr   Цитата(Vinterman @ Nov 26 2008, 12:42) Гм...   Nov 26 2008, 09:47
- - Vinterman   Цитата(aaarrr @ Nov 26 2008, 12:47) Чтобы...   Nov 27 2008, 04:47


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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 01:29
Рейтинг@Mail.ru


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