aBoomest 0 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба Добрый день. Работаю на NXP MK66FN2M0xxx18. При этом при использовании функции sprintf для вывода чисел с плавающей запятой, программа на этой функции вылетает. Убираешь %f (т.е. выводишь все кроме float'ов) - все работает. Кто сталкивался с подобным? На сайте IAR нашел следующее https://www.iar.com/support/tech-notes/gene...point-f-on-arm/ Правда думается, что не о том. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба При этом при использовании функции sprintf для вывода чисел с плавающей запятой, программа на этой функции вылетает. Убираешь %f (т.е. выводишь все кроме float'ов) - все работает. Кто сталкивался с подобным? Вангую использование FPU в разных задачах РТОС (или ISR) и несохранение контекста FPU при их переключении. Либо тупо: используется stdlib без поддержки float. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба Вангую использование FPU в разных задачах РТОС (или ISR) и несохранение контекста FPU при их переключении. Либо тупо: используется stdlib без поддержки float. либо стек не выровнен на 8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба либо стек не выровнен на 8 У меня такое приводило просто к неправильной печати. Но то был GNU Arm Embedded... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба 1. Операционок нет, для прерываний контекст сохраняется и восстанавливается автоматически. 2. "Стэк не выровнен на 8." - поясните плз что это значит? Стэк должен начинаться с адреса кратного восьми? или все элементы в стэке должны размещаться в нем с "шагом" кратном 8? Или еще как-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба Стэк должен начинаться с адреса кратного восьми? Именно. Вернее, указатель стека при вызове внешних функций должен быть кратен 8, но если стек выравнен в начале, то в дальнейшем компилятор соблюдает эту кратность. Если нарушить, бывают чудеса в частности вокруг sprintf. Должно быть, как-то замешаны вычисления с double. Кстати, насчёт double. Если при инициализации программы не включен FPU, то при попытке его использования будет именно "улетать". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба Кстати, насчёт double. Если при инициализации программы не включен FPU, то при попытке его использования будет именно "улетать". Вообще - ТС даже не раскрыл значение понятия "вылетает". Может если он определится - что это такое, то всё сразу станет ясно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба Может банальное переполнение буфера? HINT: Попробуйте на snprintf заменить и в будущем только её и использовать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 4 июля, 2018 Опубликовано 4 июля, 2018 · Жалоба Может банальное переполнение буфера? HINT: Попробуйте на snprintf заменить и в будущем только её и использовать... Кстати, да. Банальнейший код может привести к неожиданным результатам: char buf[16]; sprintf(buf, "%f", 1.0e99); // boom Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 5 июля, 2018 Опубликовано 5 июля, 2018 · Жалоба Именно. Вернее, указатель стека при вызове внешних функций должен быть кратен 8, но если стек выравнен в начале, то в дальнейшем компилятор соблюдает эту кратность. Если нарушить, бывают чудеса в частности вокруг sprintf. Должно быть, как-то замешаны вычисления с double. Кстати, насчёт double. Если при инициализации программы не включен FPU, то при попытке его использования будет именно "улетать". Стек начинается с адреса кратного 8. При заходе в подпрограмму функции sprintf в регистре адреса число (почему-то) не кратное 8. Почему - фиг его знает. Переменная, в которую я запихиваю строчку при помощи функции sprintf - локальная, т.е. объявлена в той же функции, в которой я вызываю sprintf. Пока пришел к следующему: если переменную объявить глобально, то все работает. Однако объяснения этому всему пока нет. Уважаемые форумчане, есть мысли на этот счет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Уважаемые форумчане, есть мысли на этот счет? Уже вроде писали: телепаты в отпуске. А пока не объясните значение понятия "вылетает" помочь Вам смогут только они. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 июля, 2018 Опубликовано 7 июля, 2018 · Жалоба уверен там хардварный FPU. включите его #define CORTEX_M4_BLOCK 0xe000e000 #define CPACR *(unsigned long *)(CORTEX_M4_BLOCK + 0xd88) // Co-processor Access Control //__enable_FPU(); CPACR |= (0xf << 20); // enable access to FPU а вообще sprintf монструозная функция для эмбедед. никогда не использовал ее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 21 июля, 2018 Опубликовано 21 июля, 2018 (изменено) · Жалоба а вообще sprintf монструозная функция для эмбедед. никогда не использовал ее. Как же тогда делать? Давно просили - про "Программа вылетает": не знаю как это может помочь Hard fault HFSR 0E80 Изменено 21 июля, 2018 пользователем aBoomest Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 21 июля, 2018 Опубликовано 21 июля, 2018 (изменено) · Жалоба Как же тогда делать? Давно просили - про "Программа вылетает": не знаю как это может помочь Hard fault HFSR 0E80 Вы уверены что правильно считали HFSR? :wacko: а вообще sprintf монструозная функция для эмбедед. никогда не использовал ее. Ну и зря. Не такая она и монструозная. Изменено 21 июля, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 21 июля, 2018 Опубликовано 21 июля, 2018 · Жалоба Как же тогда делать? Давно просили - про "Программа вылетает": не знаю как это может помочь Hard fault HFSR 0E80 Посмотрите в дизассемблере содержимое функций isnanf и isinff (isinfd isnand). Скорее всего они пустые (с мусором). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться