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

 
 
 
Reply to this topicStart new topic
> IAR + FreeRTOS + SAM7X неожиданно заглючило...
Dron_Gus
сообщение Jan 16 2008, 22:35
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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...

Что бы это значило? 07.gif


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 16 2008, 22:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Dron_Gus @ Jan 17 2008, 05:35) *
Что бы это значило? 07.gif
Скорее всего то же, что и у меня в проекте, над которым работаю - не выровненые структуры данных 05.gif . Иногда, при добавлении в структуру НЕ 32-бит поля, задача летит к чертям собачим smile.gif

IAR for ARM 4.42A


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 16 2008, 23:06
Сообщение #3


Гуру
******

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



Цитата(Dron_Gus @ Jan 17 2008, 00:35) *
Что бы это значило? 07.gif
Очень похоже, что при запуске задачи из ее контекста прописывается T(THUMB) бит в CPSR


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jan 17 2008, 00:04
Сообщение #4


Профессионал
*****

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



2 prottoss, и как с этим бороться? У меня множество "упакованных" структур и никуда от них не деться. Оч похоже, что это и есть причина - последнее, что делал - это добавлял описания новых пакетов. а они все никак не расчитаны на АРМы.

2 Сергей Борщ, я тоже вначале так подумал. Но нигде в настройках нет и слова о thumb. Все же завтра обязательно проверю под отладчиком CPSR.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2008, 09:41
Сообщение #5


Гуру
******

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



Цитата(Dron_Gus @ Jan 17 2008, 02:04) *
2 Сергей Борщ, я тоже вначале так подумал. Но нигде в настройках нет и слова о thumb. Все же завтра обязательно проверю под отладчиком CPSR.
В настройках его может и не быть. А вот на стеке вполне может оказаться что угодно - если стека не хватает или указатель на контекст попортился и вы восстанавливаете совсем не оттуда, откуда должны.
По вашему листингу это видно. В момент, когда попадаете в задачу - отладчик знает, что с этой метки идет ARM-код и показывает его дизассемблер. Сделав шаг он обнаруживает, что процессор находится в THUMB и дальше показывает вам дизассемблер в THUMB режиме. Много раз получал такой эффект wink.gif

Поздравляю. Смотрите, какое значение заносится на стек при создании контекста (portable/iar/AtmelSam7S64/port.c):
Код
#define portINITIAL_SPSR                ( ( portSTACK_TYPE ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */
об эти грабли я спотыкался три года назад. А они там, оказывается, до сих пор лежат! smile.gif
сделайте так:
Код
#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)
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jan 17 2008, 10:32
Сообщение #6


Профессионал
*****

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



2 Сергей Борщ спасибо! beer.gif



Только в дата аборт все равно валится. sad.gif Но хоть все задачи стартуют...



З.Ы. и как это у меня раньше проект работал???...


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
xelax
сообщение Jan 17 2008, 10:39
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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. */
об эти грабли я спотыкался три года назад. А они там, оказывается, до сих пор лежат! smile.gif
сделайте так:
Код
#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


Так что похоже грабли исправленны аффтаром wink.gif
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jan 17 2008, 10:44
Сообщение #8


Профессионал
*****

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



Огромное спасибо всем ответившим! Коллективный разум спас мои нервные клетки. Все работает. )


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2008, 10:47
Сообщение #9


Гуру
******

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



Цитата(xelax @ Jan 17 2008, 12:39) *
Так что похоже грабли исправленны аффтаром wink.gif
xelax, не поверите - я цитированные строки взял из 4.7.0. Похоже, их листьями присыпАли. smile.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
xelax
сообщение Jan 17 2008, 10:56
Сообщение #10


Местный
***

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



Цитата(Сергей Борщ @ Jan 17 2008, 13:47) *
xelax, не поверите - я цитированные строки взял из 4.7.0. Похоже, их листьями присыпАли. smile.gif


А ещё во FreeRTOS есть грабли присыпанные листьями? Так для общего развития, а заодно, чтобы в своём проекте проверить? smile.gif
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jan 17 2008, 11:32
Сообщение #11


Профессионал
*****

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



Функции работы с очередями не проверяют указатель на очередь. (!=0)


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2008, 13:38
Сообщение #12


Гуру
******

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



Цитата(xelax @ Jan 17 2008, 12:56) *
А ещё во FreeRTOS есть грабли присыпанные листьями? Так для общего развития, а заодно, чтобы в своём проекте проверить? smile.gif
Не могу сказать - один проект тогда сделал, больше не приходилось с ней работать. 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)
Go to the top of the page
 
+Quote Post
one_man_show
сообщение Jan 17 2008, 13:56
Сообщение #13


Помогу, чем смогу
******

Группа: Админы
Сообщений: 2 786
Регистрация: 28-05-04
Из: Москва
Пользователь №: 25



"Вообще нефиг указателями пользоваться в эмбеддед, да еще и в РТОС"


--------------------
С уважением,
Ваган Саруханов
Проекты|Форум|Facebook|Linkedin
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jan 17 2008, 14:01
Сообщение #14


Профессионал
*****

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



Согласен, что хороший тон - проверять все в момент создания. Просто на эти грабли можно наступить. (как я это сделал)

С другой стороны у меня общение между задачами через очереди. И перед тем как что-то кому-то посылать, приходится проверять указатель != 0. А то вдруг вторая задача еще не успела создать очередь.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 17 2008, 18:47
Сообщение #15


Гуру
******

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



Цитата(Сергей Борщ @ Jan 17 2008, 16:38) *
zltigo у нас большой фанат этой ОСи

Я как-бы давно уже в своей ветке живу взяв FreeRTOS, как отправную точку. На грабли не наступал -
в том числе и на описанные smile.gif ибо прежде чем собирать под ARM почитал исходники smile.gif и подправил.
Минут 15 заняло.
http://electronix.ru/forum/index.php?act=S...%2B__CPU_MODE__

А вот несуразностей - несуразностей хватает. Причем Автор по поводу явных указаний на оные и решений предпочитает отмалчиваться в тряпочку. Потом втихаря полгода-год кое-что по абсолютной мелочи появляется. В общем отправился я в свое плавание, но за основной веткой приглядываю регулярно, особенно за форумом - там иногда появляются идеи и реализации традиционно игнорируемые автором sad.gif, но интересные.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:55
Рейтинг@Mail.ru


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