AHTOXA 14 7 февраля, 2011 Опубликовано 7 февраля, 2011 · Жалоба Э, нет, Антоха, так просто не получится - посмотри на другие два процесса - они тоже печатью занимаются :) Точно? С printf? С плавучкой (я про это не говорил, но это важно)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 7 февраля, 2011 Опубликовано 7 февраля, 2011 · Жалоба Точно? С printf? С плавучкой (я про это не говорил, но это важно)? Да, с vsnprintf(), без плавучки. Считаешь, что именно плавучка вызывает сбой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 7 февраля, 2011 Опубликовано 7 февраля, 2011 · Жалоба Да, плавучка. Я не помню, где я про это читал, помню только, что именно плавучка особенно требовательна к выравниванию стека. Собственно, благодаря этому смутному воспоминанию мы и нашли решение:) ЗЫ. Попробуй, это ж несложно:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ashr 0 8 февраля, 2011 Опубликовано 8 февраля, 2011 · Жалоба Считаешь, что именно плавучка вызывает сбой? Да, плавучка ибо double, который как раз-таки размером 8 байт (а возможно и long long). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VslavX 0 30 января, 2012 Опубликовано 30 января, 2012 · Жалоба Я тоже наступил на эти шикарные грабли. Недавно добавил в свой printf поддержку 64-битных целых (signed/unsigned long long которые). Проверил, отладил - все работает. И даже пару месяцев нормально поработало. А потом - хрясь, и все, мусор вместо 64-битных лезть начал. И не сразу докопался я, что va_arg(list, long long) неверно из стека 64-битные вынимает. Добавил выравнивание стека в порт RTOS (TNKernel, не SCM, но это неважно) при инициализации задачи - и все снова работает. Да, грабли просто шикарные, и бьют больно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cerebral 0 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Принимаю эстафету в беге по граблям. Не могу найти причину hardfault'а в ScmRTOS после вызова sprintf. В hardfault падает из ContextRestore, на инструкции bx lr c 0xfffffffd в lr. ScmRTOS 3.10, arm-kgp-eabi-x86_32-20111129 (с yagarto аналогично). Оч. расчитываю на вашу помощь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба В hardfault падает из ContextRestore, на инструкции bx lr c 0xfffffffd в lr.По симптомам очень похоже на порчу сохраненного на стеке контекста процесса. Хватает ли стека тому процессу, который вызывает sprintf? Хватает ли буфера, в который пишет sprintf? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cerebral 0 21 февраля, 2012 Опубликовано 21 февраля, 2012 · Жалоба Сергей, спасибо. Проблема действительно была заключена в недостаточном объёме памяти, выделенной под стек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба РРРР!) Прошу прощения за поднятие старой темы... Может быть какой-нить дефайн добавим в OS_Kernel.h? Чтобы при компиляции оси под армы (под ARM7TDMI точно) стек задач выравнивался на 8. А то я уж чуть не поседел, когда несколько дней думал, почему vsprintf не печатает плавучку... Выравнивание на 8 рулит!!! З.Ы. У меня 4-я версия, там еще ничего не выравнивается( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба З.Ы. У меня 4-я версия, там еще ничего не выравнивается( Как это не выравнивается? Может быть, вы имели в виду 3-ю версию? Так и там исправлено (по крайней мере в 3.11/GCC - точно). Вот же (tags/3.11/CortexM3/GCC/scmRTOS/CortexM3/OS_Target_cpp.cpp): TBaseProcess::TBaseProcess(TStackItem* Stack, TPriority pr, void (*exec)()) : StackPointer((TStackItem*)((unsigned int)Stack & 0xFFFFFFF8)) Если у вас IAR, то поправьте по аналогии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба Я имел в виду под ARM7TDMI... Принтф у меня не работала, пока я не закомментировал то, что было, и не добавил то, что ниже комментария... Версия 4.00 class process : public TBaseProcess { public: INLINE_PROCESS_CTOR process(); OS_PROCESS static void exec(); #if scmRTOS_PROCESS_RESTART_ENABLE == 1 INLINE void terminate(); #endif private: //stack_item_t Stack[stack_size/sizeof(stack_item_t)]; __attribute__ ((aligned (8))) stack_item_t Stack[stack_size/sizeof(stack_item_t)]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба Я имел в виду под ARM7TDMI... А тема про CortexM3 :) Тут такое дело. Дефайн не поможет в общем случае. Потому что выравнивать нужно не начальную вершину стека, а его вершину после сохранения начального контекста. У ARM7 и у Cortex-M3 контекст 16 слов, поэтому можно выравнивать и так и так. А вот с Cortex-M4F такой фокус уже не прокатит, там 17 слов. Поэтому выравнивать надо не централизованно, а в порте. Лучше - так, как я сделал в порте для Cortex-M4F. Принтф у меня не работала, пока я не закомментировал то, что было, и не добавил то, что ниже комментария... Не, так точно не надо. Надо как-то вот так (в 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 ... Попробуйте, и, если всё нормально, то я внесу правку в репозиторий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба А тема про CortexM3 :) Попробуйте, и, если всё нормально, то я внесу правку в репозиторий. Про кортекс не заметил, был увлечен ARM7 :rolleyes: Поправки внес. Все запустилось и работает прекрасно. Надеюсь, что если пошло, то вылетов на этой почве уже не будет. Спасибо! :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба Исправил в репозитории. Попутно вскрылся интересный факт - я правил с старом репозитории, а в новом изменения пока не появились. Выходит, это два разных репозитория, и они синхронизируются. Надо тогда поаккуратнее быть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 15 января, 2013 Опубликовано 15 января, 2013 · Жалоба Исправил Что-то не так... Сейчас снова одни нули вместо плавучки выводятся. Причем если вернуть определение стека так, как я первоначально сделал - то работает. Как Вы предложили - нет :crying: Неужели я в прошлый раз как-то компильнул проект не так :maniac: Оперативы у меня 32 метра, дефицита не наблюдается. malloc() столь необходимая (иногда?) printf - работает. Пока думаю, куда копать... Для очистки совести сделал make clean && make all для двух вариантов... Вывод 1 (плохой) #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 (хороший) #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. По-сути при создании процесса мы попадаем в функцию init_stack_frame , которая инициализиует стэк. И уже там "готовится" указатель, выровненный пока не понятным для меня ( к сожалению опыта мало) образом. Т.е. что там, что тут - вроде без разницы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться