|
scmRTOS + CortexM3 + printf, некорректная работа printf |
|
|
|
Feb 7 2011, 06:28
|

Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328

|
Столкнулся с такой проблемой. Перестает работать printf (а также sprintf, vprintf и т.д.), если запущена ОСь. Проявляется это в том, что функция неправильно вынимает из стека, переданные ей параметры и, соответственно, неправильно их выводит. Эффект наблюдается только на CortexM3 с компилятором IAR (конкретно 5.41.2). На ARM7, BlackFin, AVR, MSP430 - не наблюдается. В чем может быть причина этого и как с это исправить?
Факты к размышлению. 1. У Cortexa есть два стека (в отличии от других упомянутых процев). Причем тот, который привычный CSTACK используется для прерываний. Для нужд приложения используется второй стек. 2. В связке CortexM3 + GCC printf сначала не работал, но после выравнивания стека задач TStackItem Stack[] на границу 8 байт, функция заработала. Выравнивание при использовании IAR не помогло.
|
|
|
|
|
 |
Ответов
|
Jan 11 2013, 15:00
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(haker_fox @ Jan 11 2013, 19:27)  Я имел в виду под ARM7TDMI... А тема про CortexM3  Тут такое дело. Дефайн не поможет в общем случае. Потому что выравнивать нужно не начальную вершину стека, а его вершину после сохранения начального контекста. У ARM7 и у Cortex-M3 контекст 16 слов, поэтому можно выравнивать и так и так. А вот с Cortex-M4F такой фокус уже не прокатит, там 17 слов. Поэтому выравнивать надо не централизованно, а в порте. Лучше - так, как я сделал в порте для Cortex-M4F. Цитата(haker_fox @ Jan 11 2013, 19:27)  Принтф у меня не работала, пока я не закомментировал то, что было, и не добавил то, что ниже комментария... Не, так точно не надо. Надо как-то вот так (в OS_Target_cpp.cpp): Код void TBaseProcess::init_stack_frame( stack_item_t * Stack , void (*exec)() #if scmRTOS_DEBUG_ENABLE == 1 , stack_item_t * StackBegin #endif ) { StackPointer = (stack_item_t*)((uintptr_t)Stack & 0xFFFFFFF8); *(--StackPointer) = (stack_item_t)exec; // return from interrupt address StackPointer -= 14; // emulate "push R0-R12", "push LR" if((uintptr_t)exec & (1 << 0)) // if exec is THUMB-mode code *(--StackPointer) = 0x003F; // SR value: system mode, FIQ & IRQ enabled, THUMB mode else *(--StackPointer) = 0x001F; // SR value: system mode, FIQ & IRQ enabled, ARM mode
#if scmRTOS_DEBUG_ENABLE == 1 ... Попробуйте, и, если всё нормально, то я внесу правку в репозиторий.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 15 2013, 14:10
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (AHTOXA @ Jan 12 2013, 01:54)  Исправил Что-то не так... Сейчас снова одни нули вместо плавучки выводятся. Причем если вернуть определение стека так, как я первоначально сделал - то работает. Как Вы предложили - нет  Неужели я в прошлый раз как-то компильнул проект не так  Оперативы у меня 32 метра, дефицита не наблюдается. malloc() столь необходимая (иногда?) printf - работает. Пока думаю, куда копать... Для очистки совести сделал CODE make clean && make all для двух вариантов... Вывод 1 (плохой) CODE #ai6di2 ADC0: 0x81 129 0.00 ADC1: 0x80 128 0.00 ADC2: 0x80 128 0.00 ADC3: 0x80 128 0.00 ADC4: 0x7f 127 0.00 ADC5: 0x7b 123 0.00 Вывод 2 (хороший) CODE #ai6di2 ADC0: 0x81 129 2.52 ADC1: 0x80 128 2.50 ADC2: 0x80 128 2.50 ADC3: 0x80 128 2.50 ADC4: 0x7f 127 2.48 ADC5: 0x7b 123 2.40 Сама функция работает (текст, hex, dec) AHTOXA, а почему не стоит делать правку в кернел.h? Ведь это логично, там мы выравниваем стек именно процессов? Более того, Вы сами предложили этот вариант в первых постах) Нэ понимает моя))) З.Ы. Блин, в map-файле от GCC без поллитра не разберешься... Пошел мой разбор полетов: 1. По-сути при создании процесса мы попадаем в функцию CODE init_stack_frame , которая инициализиует стэк. И уже там "готовится" указатель, выровненный пока не понятным для меня ( к сожалению опыта мало) образом. Т.е. что там, что тут - вроде без разницы...
--------------------
Выбор.
|
|
|
|
|
Jan 15 2013, 14:13
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(haker_fox @ Jan 15 2013, 20:03)  Что-то не так... Сейчас снова одни нули вместо плавучки выводятся. Причем если вернуть определение стека так, как я первоначально сделал - то работает. Как Вы предложили - нет  Очень странно. Вообще-то эти варианты эквивалентны. Только что увидел, что не до конца исправил: Исправьте в конце TBaseProcess::init_stack_frame(): Код #if scmRTOS_DEBUG_ENABLE == 1 for (stack_item_t* pDst = StackBegin; pDst < StackPointer; pDst++) *pDst = STACK_DEFAULT_PATTERN; #endif // scmRTOS_DEBUG_ENABLE Цитата(haker_fox @ Jan 15 2013, 20:03)  AHTOXA, а почему не стоит делать правку в кернел.h? Потому что kernel.h - один на все порты. Чтобы внести правку в него, нужно вносить изменения во все порты (какие-то макросы придумывать, дефайны, или что-то типа того). Ну и вообще, не дело решать проблемы одного порта правками в коде оси, если есть иное решение. А если вы ведёте речь о локальной правке, у себя, то такую правку делать можно  (Только если вдруг, через полгода-год, давным-давно забыв об этой истории, обновите ось, и что-то перестанет работать, то не говорите, что я вас не предупреждал  )
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
shreck scmRTOS + CortexM3 + printf Feb 7 2011, 06:28 AHTOXA Цитата(shreck @ Feb 7 2011, 11:28) 2. В с... Feb 7 2011, 07:34 shreck Цитата(AHTOXA @ Feb 7 2011, 14:34) Вот чт... Feb 7 2011, 08:25  AHTOXA Цитата(shreck @ Feb 7 2011, 13:25) Вопрос... Feb 7 2011, 09:05   shreck Цитата(AHTOXA @ Feb 7 2011, 16:05) А как ... Feb 7 2011, 09:41    AHTOXA Цитата(shreck @ Feb 7 2011, 14:41) Код#pr... Feb 7 2011, 10:51     sonycman Цитата(shreck @ Feb 7 2011, 13:46) Дело н... Feb 7 2011, 14:55      AHTOXA Цитата(sonycman @ Feb 7 2011, 19:55) Как ... Feb 7 2011, 15:38       sonycman Цитата(AHTOXA @ Feb 7 2011, 18:38) Возмож... Feb 7 2011, 16:20        AHTOXA Цитата(sonycman @ Feb 7 2011, 21:20) Да, ... Feb 7 2011, 16:47         sonycman Цитата(AHTOXA @ Feb 7 2011, 19:47) Как эт... Feb 7 2011, 16:59          AHTOXA Цитата(sonycman @ Feb 7 2011, 21:59) Э, н... Feb 7 2011, 17:11           sonycman Цитата(AHTOXA @ Feb 7 2011, 20:11) Точно?... Feb 7 2011, 17:17            AHTOXA Да, плавучка. Я не помню, где я про это читал, пом... Feb 7 2011, 17:28            shreck Цитата(sonycman @ Feb 8 2011, 00:17) Счит... Feb 8 2011, 03:15  sonycman Цитата(shreck @ Feb 7 2011, 11:25) Да, пр... Feb 7 2011, 09:34   AHTOXA Цитата(sonycman @ Feb 7 2011, 14:34) Ника... Feb 7 2011, 09:40    sonycman Цитата(AHTOXA @ Feb 7 2011, 12:40) Там ка... Feb 7 2011, 10:36     shreck Цитата(sonycman @ Feb 7 2011, 18:36) Ну, ... Feb 7 2011, 10:46 VslavX Я тоже наступил на эти шикарные грабли.
Недавно... Jan 30 2012, 00:01 cerebral Принимаю эстафету в беге по граблям.
Не могу найт... Feb 21 2012, 06:53 Сергей Борщ QUOTE (cerebral @ Feb 21 2012, 08:53) В h... Feb 21 2012, 07:00  cerebral Сергей, спасибо. Проблема действительно была заклю... Feb 21 2012, 07:30 haker_fox РРРР!) Прошу прощения за поднятие старой темы.... Jan 11 2013, 12:32 AHTOXA Цитата(haker_fox @ Jan 11 2013, 18:32) З.... Jan 11 2013, 13:18 haker_fox Дико прошу прощения! Ввел в заблуждение себя и... Jan 15 2013, 14:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|