|
Функция sprintf |
|
|
|
Jul 4 2018, 09:41
|
Частый гость
Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714
|
Добрый день. Работаю на NXP MK66FN2M0xxx18. При этом при использовании функции sprintf для вывода чисел с плавающей запятой, программа на этой функции вылетает. Убираешь %f (т.е. выводишь все кроме float'ов) - все работает. Кто сталкивался с подобным? На сайте IAR нашел следующее https://www.iar.com/support/tech-notes/gene...point-f-on-arm/Правда думается, что не о том.
--------------------
C уважением!
|
|
|
|
|
Jul 4 2018, 10:49
|
Частый гость
Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714
|
1. Операционок нет, для прерываний контекст сохраняется и восстанавливается автоматически.
2. "Стэк не выровнен на 8." - поясните плз что это значит? Стэк должен начинаться с адреса кратного восьми? или все элементы в стэке должны размещаться в нем с "шагом" кратном 8? Или еще как-то?
--------------------
C уважением!
|
|
|
|
|
Jul 5 2018, 19:29
|
Частый гость
Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714
|
Цитата(scifi @ Jul 4 2018, 14:13) Именно. Вернее, указатель стека при вызове внешних функций должен быть кратен 8, но если стек выравнен в начале, то в дальнейшем компилятор соблюдает эту кратность. Если нарушить, бывают чудеса в частности вокруг sprintf. Должно быть, как-то замешаны вычисления с double. Кстати, насчёт double. Если при инициализации программы не включен FPU, то при попытке его использования будет именно "улетать". Стек начинается с адреса кратного 8. При заходе в подпрограмму функции sprintf в регистре адреса число (почему-то) не кратное 8. Почему - фиг его знает. Переменная, в которую я запихиваю строчку при помощи функции sprintf - локальная, т.е. объявлена в той же функции, в которой я вызываю sprintf. Пока пришел к следующему: если переменную объявить глобально, то все работает. Однако объяснения этому всему пока нет. Уважаемые форумчане, есть мысли на этот счет?
--------------------
C уважением!
|
|
|
|
|
Jul 7 2018, 06:05
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
уверен там хардварный 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 монструозная функция для эмбедед. никогда не использовал ее.
|
|
|
|
|
Jul 21 2018, 09:57
|
Частый гость
Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714
|
Цитата(Jenya7 @ Jul 7 2018, 09:05) а вообще sprintf монструозная функция для эмбедед. никогда не использовал ее. Как же тогда делать? Давно просили - про "Программа вылетает": не знаю как это может помочь Hard fault HFSR 0E80
Сообщение отредактировал aBoomest - Jul 21 2018, 09:58
--------------------
C уважением!
|
|
|
|
|
Jul 21 2018, 11:10
|
Местный
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264
|
Цитата(aBoomest @ Jul 21 2018, 12:57) Как же тогда делать?
Давно просили - про "Программа вылетает": не знаю как это может помочь Hard fault HFSR 0E80 Вы уверены что правильно считали HFSR? Цитата(Jenya7 @ Jul 7 2018, 09:05) а вообще sprintf монструозная функция для эмбедед. никогда не использовал ее. Ну и зря. Не такая она и монструозная.
Сообщение отредактировал Arlleex - Jul 21 2018, 11:11
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|