|
|
  |
IAR + FreeRTOS + SAM7X неожиданно заглючило... |
|
|
|
Jan 16 2008, 22:35
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Сабж. Ничего принципиального в проекте не правил. Дописывал код, до которого теперь даже не доходит выполнение. Сразу же после запуска шулдера вылетает или в дата-аборт или в undefined instruction. Начал ходить по шагам. Дошел до запуска первой задачи. Код void LogTask(void *par) { LogTask: 00004CA0 E92D4FF0 STMDB SP!, {R4,R5,R6,R7,R8,R9,R10,R11,LR} 00004CA4 E24DD014 SUB SP, SP, #0x14 xLastFlashTime = xTaskGetTickCount(); 00004CA8 EB0018C2 BL xTaskGetTickCount ; 0xAFB8 00004CAC E58D0000 STR R0, [SP, #+0] Делаю один шаг (step jver) по асемблерному тексту после чего код чудесным образом превращается в Код void LogTask(void *par) { LogTask: 00004CA0 F0 DC8 0xF0 00004CA1 4F DC8 0x4F 00004CA2 D014E92D ANDLES LR, R4, SP, LSR #18 00004CA6 4D DC8 0x4D 00004CA7 E2 DC8 0xE2 xLastFlashTime = xTaskGetTickCount(); 00004CA8 EB0018C2 BL xTaskGetTickCount ; 0xAFB8 00004CAC E58D0000 STR R0, [SP, #+0] Следующим шагом вылетает с инструкции ANDLES (???) в undef. Если не ходить по шагам, то иногда вылетает в дата-аборт вроде бы из memcpy при копировании из ОЗУ в странные адреса типа 0xFEAFFFFE... Что бы это значило?
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Jan 17 2008, 09:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Dron_Gus @ Jan 17 2008, 02:04)  2 Сергей Борщ, я тоже вначале так подумал. Но нигде в настройках нет и слова о thumb. Все же завтра обязательно проверю под отладчиком CPSR. В настройках его может и не быть. А вот на стеке вполне может оказаться что угодно - если стека не хватает или указатель на контекст попортился и вы восстанавливаете совсем не оттуда, откуда должны. По вашему листингу это видно. В момент, когда попадаете в задачу - отладчик знает, что с этой метки идет ARM-код и показывает его дизассемблер. Сделав шаг он обнаруживает, что процессор находится в THUMB и дальше показывает вам дизассемблер в THUMB режиме. Много раз получал такой эффект  Поздравляю. Смотрите, какое значение заносится на стек при создании контекста (portable/iar/AtmelSam7S64/port.c): Код #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ об эти грабли я спотыкался три года назад. А они там, оказывается, до сих пор лежат!  сделайте так: Код #if __CPU_MODE__ == 1 #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ #else #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ #endif "И сразу польется вода!"
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 17 2008, 10:32
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
2 Сергей Борщ спасибо! Только в дата аборт все равно валится.  Но хоть все задачи стартуют... З.Ы. и как это у меня раньше проект работал???...
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Jan 17 2008, 10:39
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(Сергей Борщ @ Jan 17 2008, 12:41)  Поздравляю. Смотрите, какое значение заносится на стек при создании контекста (portable/iar/AtmelSam7S64/port.c): Код #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ об эти грабли я спотыкался три года назад. А они там, оказывается, до сих пор лежат!  сделайте так: Код #if __CPU_MODE__ == 1 #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ #else #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ #endif "И сразу польется вода!" В версии 4.6.1 Код /* Constants required to setup the task context. */ #define portINITIAL_SPSR ( ( portSTACK_TYPE ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ #define portTHUMB_MODE_BIT ( ( portSTACK_TYPE ) 0x20 ) . . . . /* The last thing onto the stack is the status register, which is set for system mode, with interrupts enabled. */ *pxTopOfStack = ( portSTACK_TYPE ) portINITIAL_SPSR;
#ifdef THUMB_INTERWORK { /* We want the task to start in thumb mode. */ *pxTopOfStack |= portTHUMB_MODE_BIT; } #endif Так что похоже грабли исправленны аффтаром
|
|
|
|
|
Jan 17 2008, 13:38
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(xelax @ Jan 17 2008, 12:56)  А ещё во FreeRTOS есть грабли присыпанные листьями? Так для общего развития, а заодно, чтобы в своём проекте проверить?  Не могу сказать - один проект тогда сделал, больше не приходилось с ней работать. zltigo у нас большой фанат этой ОСи Цитата(Dron_Gus @ Jan 17 2008, 13:32)  Функции работы с очередями не проверяют указатель на очередь. (!=0) Спорный момент. "А нефиг подсовывать что ни попадя". А если бы в указателе случайно оказался не 0, а 1, помогла бы проверка? Нет. А время при каждом обращении отнимала бы. Логичнее, если программист, получив указатель из процедуры создания очереди проверит его один раз сам и дальше предпримет нужные действия.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 17 2008, 18:47
|

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

|
Цитата(Сергей Борщ @ Jan 17 2008, 16:38)  zltigo у нас большой фанат этой ОСи Я как-бы давно уже в своей ветке живу взяв FreeRTOS, как отправную точку. На грабли не наступал - в том числе и на описанные  ибо прежде чем собирать под ARM почитал исходники  и подправил. Минут 15 заняло. http://electronix.ru/forum/index.php?act=S...%2B__CPU_MODE__А вот несуразностей - несуразностей хватает. Причем Автор по поводу явных указаний на оные и решений предпочитает отмалчиваться в тряпочку. Потом втихаря полгода-год кое-что по абсолютной мелочи появляется. В общем отправился я в свое плавание, но за основной веткой приглядываю регулярно, особенно за форумом - там иногда появляются идеи и реализации традиционно игнорируемые автором  , но интересные.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|