|
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 не помогло.
|
|
|
|
|
 |
Ответов
|
Feb 7 2011, 08:25
|

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

|
Цитата(AHTOXA @ Feb 7 2011, 14:34)  Да, проблема именно в выравнивании стека задачи. Сейчас на свежую голову выполнил выравнивание и все заработало. В прошлый раз по запарке не тем средством для выравнивания воспользовался. Вопрос снят.
|
|
|
|
|
Feb 7 2011, 09:41
|

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

|
Цитата(AHTOXA @ Feb 7 2011, 16:05)  А как это выглядит в IAR-е? (Как задаётся выравнивание?) Сейчас временно сделал так. При определении объекта задачи: Код #pragma data_alignment=8 Some_task task_obj; Но это не совсем правильно. В scmRTOS, как мне думается, выравнивание надо делать как-то вроде этого (не помню как это называется): Код class process : public TBaseProcess { ... private: union Align_buff { long long dummy; TStackItem Stack[stack_size/sizeof(TStackItem)]; }; Align_buff buff; };
|
|
|
|
|
Feb 7 2011, 10:51
|

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

|
Цитата(shreck @ Feb 7 2011, 14:41)  Код #pragma data_alignment=8 Some_task task_obj; То есть, выравнивание стека задать таким образом нельзя, только выравнивание всего объекта? Это конечно не дело. Цитата(sonycman @ Feb 7 2011, 15:36)  Ну, тогда, наверное, мне сильно везёт, так как вывода через vsnprintf() много и самого разного. Или IAR у вас старый, и ещё не научился пользоваться новыми фишками  Цитата(sonycman @ Feb 7 2011, 15:36)  Кстати, мне вот не особо понятно, как применительно к стеку может относится выравнивание в 8 байт? Мне тоже не очень понятно. Но - стандарт, что поделать. Тем более, что имеем явный пример глюков, которые можно получить, не соблюдая этот стандарт.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 7 2011, 14:55
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(shreck @ Feb 7 2011, 13:46)  Дело не в количестве вывода через printf. Вам везет, что стек выровнен как надо. Кстати какой проц. Не факт, что вам требуется выравнивание именно на 8 байт. У меня LPC1768. В теме, по моему, ясно написано Cortex-M3. Неужели двум чипам на одном и том же ядре требуется разное выравнивание? У себя использую три процесса с такими стеками: Код typedef OS::process<OS::pr1, 500> TProc1; typedef OS::process<OS::pr2, 800> TProc2; typedef OS::process<OS::pr3, 500> TProc3; Посмотрел в map файле линкера их расположение: Код Proc1 0x10001ee8 0x200 Data Gb main.o [1] Proc2 0x100020e8 0x32c Data Gb main.o [1] Proc3 0x10002414 0x200 Data Gb main.o [1] Как видно, стек третьего процесса не выровнен по границе 8 байт. Однако же именно этот низкоприоритетный поток постоянно юзает печать через vsnprintf(). Вот и не верится мне что-то, что ваша проблема на 100% связана с выравниванием. Цитата(AHTOXA @ Feb 7 2011, 13:51)  Или IAR у вас старый, и ещё не научился пользоваться новыми фишками  EWARM v5.50.5. Поновее, чем у автора. Может, наоборот, старенький ИАР подглючивает?
|
|
|
|
|
Feb 7 2011, 15:38
|

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

|
Цитата(sonycman @ Feb 7 2011, 19:55)  Как видно, стек третьего процесса не выровнен по границе 8 байт. Однако же именно этот низкоприоритетный поток постоянно юзает печать через vsnprintf(). Возможно, проблема не гарантировано появляется, а лишь с какой-то вероятностью. Или стек расположен не в начале объекта TBaseProcess, и как раз наоборот, получается выровненным. Не знаю. Попробуйте ещё добавлять/убавлять переменные, чтобы выравнивание изменилось и возможно поймаете этот глюк. Цитата Вот и не верится мне что-то, что ваша проблема на 100% связана с выравниванием. Если ничего не меняя, только выравнивание, удаётся решить проблему, то вероятнее всего, что проблема именно в выравнивании, не правда ли?  Цитата Может, наоборот, старенький ИАР подглючивает?  Дело в том, что и на GCC та же проблема (см. первое сообщение топика, п. 2) (это как раз я проверял, с GCC). ЗЫ. Дополню картину. В проекте вызываю тестовую функцию дважды - один раз до вызова OS:Run(), второй - после, уже из процесса. В первом случае результат корректный, во втором - нет. Запрет прерываний во втором случае не спасает. Зато выравнивание стека процесса - устраняет глюк. Какие тут можно придумать варианты, кроме стека?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 7 2011, 16:20
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(AHTOXA @ Feb 7 2011, 18:38)  Возможно, проблема не гарантировано появляется, а лишь с какой-то вероятностью. Или стек расположен не в начале объекта TBaseProcess, и как раз наоборот, получается выровненным. Не знаю. Да, резервируется место, на 12 байт большее отведённого места под стек. Для чего, интересно? Цитата(AHTOXA @ Feb 7 2011, 18:38)  ЗЫ. Дополню картину. В проекте вызываю тестовую функцию дважды - один раз до вызова OS:Run(), второй - после, уже из процесса. В первом случае результат корректный, во втором - нет. Запрет прерываний во втором случае не спасает. Зато выравнивание стека процесса - устраняет глюк. Какие тут можно придумать варианты, кроме стека? Было бы неплохо для наглядности продебажить на самом низком уровне и увидеть, в каком именно месте затык. Ведь даже если вершина стека является выровненной до 8 байт, разве не может на момент вызова любой функции текущий адрес стека быть равен его вершине-4, -12 и т.д. с кратностью 4?
|
|
|
|
Сообщений в этой теме
shreck scmRTOS + CortexM3 + printf Feb 7 2011, 06:28        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 Я имел в виду под ARM7TDMI... Принтф у меня не раб... Jan 11 2013, 13:27 AHTOXA Цитата(haker_fox @ Jan 11 2013, 19:27) Я ... Jan 11 2013, 15:00  haker_fox QUOTE (AHTOXA @ Jan 12 2013, 00:00) А тем... Jan 11 2013, 15:29   AHTOXA Исправил в репозитории.
Попутно вскрылся интересн... Jan 11 2013, 16:54    haker_fox QUOTE (AHTOXA @ Jan 12 2013, 01:54) Испра... Jan 15 2013, 14:10     AHTOXA Цитата(haker_fox @ Jan 15 2013, 20:03) Чт... Jan 15 2013, 14:13 haker_fox Дико прошу прощения! Ввел в заблуждение себя и... Jan 15 2013, 14:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|