Dron_Gus 2 16 января, 2008 Опубликовано 16 января, 2008 · Жалоба Сабж. Ничего принципиального в проекте не правил. Дописывал код, до которого теперь даже не доходит выполнение. Сразу же после запуска шулдера вылетает или в дата-аборт или в 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... Что бы это значило? :07: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 16 января, 2008 Опубликовано 16 января, 2008 · Жалоба Что бы это значило? :07: Скорее всего то же, что и у меня в проекте, над которым работаю - не выровненые структуры данных :05: . Иногда, при добавлении в структуру НЕ 32-бит поля, задача летит к чертям собачим :) IAR for ARM 4.42A Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 16 января, 2008 Опубликовано 16 января, 2008 · Жалоба Что бы это значило? :07:Очень похоже, что при запуске задачи из ее контекста прописывается T(THUMB) бит в CPSR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба 2 prottoss, и как с этим бороться? У меня множество "упакованных" структур и никуда от них не деться. Оч похоже, что это и есть причина - последнее, что делал - это добавлял описания новых пакетов. а они все никак не расчитаны на АРМы. 2 Сергей Борщ, я тоже вначале так подумал. Но нигде в настройках нет и слова о thumb. Все же завтра обязательно проверю под отладчиком CPSR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба 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 "И сразу польется вода!" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба 2 Сергей Борщ спасибо! :beer: Только в дата аборт все равно валится. :( Но хоть все задачи стартуют... З.Ы. и как это у меня раньше проект работал???... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xelax 0 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Поздравляю. Смотрите, какое значение заносится на стек при создании контекста (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 Так что похоже грабли исправленны аффтаром ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Огромное спасибо всем ответившим! Коллективный разум спас мои нервные клетки. Все работает. ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Так что похоже грабли исправленны аффтаром ;) xelax, не поверите - я цитированные строки взял из 4.7.0. Похоже, их листьями присыпАли. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xelax 0 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба xelax, не поверите - я цитированные строки взял из 4.7.0. Похоже, их листьями присыпАли. :) А ещё во FreeRTOS есть грабли присыпанные листьями? Так для общего развития, а заодно, чтобы в своём проекте проверить? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Функции работы с очередями не проверяют указатель на очередь. (!=0) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба А ещё во FreeRTOS есть грабли присыпанные листьями? Так для общего развития, а заодно, чтобы в своём проекте проверить? :)Не могу сказать - один проект тогда сделал, больше не приходилось с ней работать. zltigo у нас большой фанат этой ОСи Функции работы с очередями не проверяют указатель на очередь. (!=0)Спорный момент. "А нефиг подсовывать что ни попадя". А если бы в указателе случайно оказался не 0, а 1, помогла бы проверка? Нет. А время при каждом обращении отнимала бы. Логичнее, если программист, получив указатель из процедуры создания очереди проверит его один раз сам и дальше предпримет нужные действия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_man_show 0 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба "Вообще нефиг указателями пользоваться в эмбеддед, да еще и в РТОС" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dron_Gus 2 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба Согласен, что хороший тон - проверять все в момент создания. Просто на эти грабли можно наступить. (как я это сделал) С другой стороны у меня общение между задачами через очереди. И перед тем как что-то кому-то посылать, приходится проверять указатель != 0. А то вдруг вторая задача еще не успела создать очередь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 17 января, 2008 Опубликовано 17 января, 2008 · Жалоба zltigo у нас большой фанат этой ОСи Я как-бы давно уже в своей ветке живу взяв FreeRTOS, как отправную точку. На грабли не наступал - в том числе и на описанные :) ибо прежде чем собирать под ARM почитал исходники :) и подправил. Минут 15 заняло. http://electronix.ru/forum/index.php?act=S...%2B__CPU_MODE__ А вот несуразностей - несуразностей хватает. Причем Автор по поводу явных указаний на оные и решений предпочитает отмалчиваться в тряпочку. Потом втихаря полгода-год кое-что по абсолютной мелочи появляется. В общем отправился я в свое плавание, но за основной веткой приглядываю регулярно, особенно за форумом - там иногда появляются идеи и реализации традиционно игнорируемые автором :(, но интересные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться