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

 
 
> scmRTOS + CortexM3 + printf, некорректная работа printf
shreck
сообщение Feb 7 2011, 06:28
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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 не помогло.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Feb 7 2011, 07:34
Сообщение #2


фанат дивана
******

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



Цитата(shreck @ Feb 7 2011, 11:28) *
2. В связке CortexM3 + GCC printf сначала не работал, но после выравнивания стека задач TStackItem Stack[] на границу 8 байт, функция заработала. Выравнивание при использовании IAR не помогло.

Вот что я нарыл по этому поводу: 8 byte stack alignment is a requirement of the ARM Architecture Procedure Call Standard [AAPCS].


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
shreck
сообщение Feb 7 2011, 08:25
Сообщение #3


Местный
***

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



Цитата(AHTOXA @ Feb 7 2011, 14:34) *

Да, проблема именно в выравнивании стека задачи.
Сейчас на свежую голову выполнил выравнивание и все заработало.
В прошлый раз по запарке не тем средством для выравнивания воспользовался.

Вопрос снят.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 7 2011, 09:05
Сообщение #4


фанат дивана
******

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



Цитата(shreck @ Feb 7 2011, 13:25) *
Вопрос снят.

А как это выглядит в IAR-е? (Как задаётся выравнивание?)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
shreck
сообщение Feb 7 2011, 09:41
Сообщение #5


Местный
***

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


Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 7 2011, 10:51
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 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 у вас старый, и ещё не научился пользоваться новыми фишкамиsm.gif

Цитата(sonycman @ Feb 7 2011, 15:36) *
Кстати, мне вот не особо понятно, как применительно к стеку может относится выравнивание в 8 байт?

Мне тоже не очень понятно. Но - стандарт, что поделать. Тем более, что имеем явный пример глюков, которые можно получить, не соблюдая этот стандарт.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 7 2011, 14:55
Сообщение #7


Любитель
*****

Группа: Свой
Сообщений: 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 у вас старый, и ещё не научился пользоваться новыми фишкамиsm.gif

EWARM v5.50.5.
Поновее, чем у автора.
Может, наоборот, старенький ИАР подглючивает? wink.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 7 2011, 15:38
Сообщение #8


фанат дивана
******

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



Цитата(sonycman @ Feb 7 2011, 19:55) *
Как видно, стек третьего процесса не выровнен по границе 8 байт.
Однако же именно этот низкоприоритетный поток постоянно юзает печать через vsnprintf().

Возможно, проблема не гарантировано появляется, а лишь с какой-то вероятностью. Или стек расположен не в начале объекта TBaseProcess, и как раз наоборот, получается выровненным. Не знаю. Попробуйте ещё добавлять/убавлять переменные, чтобы выравнивание изменилось и возможно поймаете этот глюк.
Цитата
Вот и не верится мне что-то, что ваша проблема на 100% связана с выравниванием.

Если ничего не меняя, только выравнивание, удаётся решить проблему, то вероятнее всего, что проблема именно в выравнивании, не правда ли? sm.gif
Цитата
Может, наоборот, старенький ИАР подглючивает? wink.gif

Дело в том, что и на GCC та же проблема (см. первое сообщение топика, п. 2) (это как раз я проверял, с GCC).

ЗЫ. Дополню картину. В проекте вызываю тестовую функцию дважды - один раз до вызова OS:Run(), второй - после, уже из процесса.
В первом случае результат корректный, во втором - нет. Запрет прерываний во втором случае не спасает. Зато выравнивание стека процесса - устраняет глюк. Какие тут можно придумать варианты, кроме стека?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 7 2011, 16:20
Сообщение #9


Любитель
*****

Группа: Свой
Сообщений: 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?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 11:27
Рейтинг@Mail.ru


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