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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Функция sprintf
aBoomest
сообщение Jul 4 2018, 09:41
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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 уважением!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 4 2018, 09:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aBoomest @ Jul 4 2018, 12:41) *
При этом при использовании функции sprintf для вывода чисел с плавающей запятой, программа на этой функции вылетает. Убираешь %f (т.е. выводишь все кроме float'ов) - все работает.
Кто сталкивался с подобным?

Вангую использование FPU в разных задачах РТОС (или ISR) и несохранение контекста FPU при их переключении.
Либо тупо: используется stdlib без поддержки float.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jul 4 2018, 10:34
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(jcxz @ Jul 4 2018, 13:55) *
Вангую использование FPU в разных задачах РТОС (или ISR) и несохранение контекста FPU при их переключении.
Либо тупо: используется stdlib без поддержки float.


либо стек не выровнен на 8


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 4 2018, 10:42
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(megajohn @ Jul 4 2018, 13:34) *
либо стек не выровнен на 8

У меня такое приводило просто к неправильной печати. Но то был GNU Arm Embedded...
Go to the top of the page
 
+Quote Post
aBoomest
сообщение Jul 4 2018, 10:49
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714



1. Операционок нет, для прерываний контекст сохраняется и восстанавливается автоматически.

2. "Стэк не выровнен на 8." - поясните плз что это значит? Стэк должен начинаться с адреса кратного восьми? или все элементы в стэке должны размещаться в нем с "шагом" кратном 8? Или еще как-то?


--------------------
C уважением!
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 4 2018, 11:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(aBoomest @ Jul 4 2018, 13:49) *
Стэк должен начинаться с адреса кратного восьми?

Именно. Вернее, указатель стека при вызове внешних функций должен быть кратен 8, но если стек выравнен в начале, то в дальнейшем компилятор соблюдает эту кратность. Если нарушить, бывают чудеса в частности вокруг sprintf. Должно быть, как-то замешаны вычисления с double.
Кстати, насчёт double. Если при инициализации программы не включен FPU, то при попытке его использования будет именно "улетать".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 4 2018, 11:28
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Jul 4 2018, 14:13) *
Кстати, насчёт double. Если при инициализации программы не включен FPU, то при попытке его использования будет именно "улетать".

Вообще - ТС даже не раскрыл значение понятия "вылетает". Может если он определится - что это такое, то всё сразу станет ясно?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 4 2018, 12:36
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Может банальное переполнение буфера?
HINT: Попробуйте на snprintf заменить и в будущем только её и использовать...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 4 2018, 12:56
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(demiurg_spb @ Jul 4 2018, 15:36) *
Может банальное переполнение буфера?
HINT: Попробуйте на snprintf заменить и в будущем только её и использовать...

Кстати, да. Банальнейший код может привести к неожиданным результатам:
Код
char buf[16];
sprintf(buf, "%f", 1.0e99); // boom
Go to the top of the page
 
+Quote Post
aBoomest
сообщение Jul 5 2018, 19:29
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714



Цитата(scifi @ Jul 4 2018, 14:13) *
Именно. Вернее, указатель стека при вызове внешних функций должен быть кратен 8, но если стек выравнен в начале, то в дальнейшем компилятор соблюдает эту кратность. Если нарушить, бывают чудеса в частности вокруг sprintf. Должно быть, как-то замешаны вычисления с double.
Кстати, насчёт double. Если при инициализации программы не включен FPU, то при попытке его использования будет именно "улетать".
Стек начинается с адреса кратного 8. При заходе в подпрограмму функции sprintf в регистре адреса число (почему-то) не кратное 8. Почему - фиг его знает. Переменная, в которую я запихиваю строчку при помощи функции sprintf - локальная, т.е. объявлена в той же функции, в которой я вызываю sprintf. Пока пришел к следующему: если переменную объявить глобально, то все работает. Однако объяснения этому всему пока нет.

Уважаемые форумчане, есть мысли на этот счет?


--------------------
C уважением!
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 08:50
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aBoomest @ Jul 5 2018, 22:29) *
Уважаемые форумчане, есть мысли на этот счет?

Уже вроде писали: телепаты в отпуске. А пока не объясните значение понятия "вылетает" помочь Вам смогут только они.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 7 2018, 06:05
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 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 монструозная функция для эмбедед. никогда не использовал ее.
Go to the top of the page
 
+Quote Post
aBoomest
сообщение Jul 21 2018, 09:57
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 24-12-08
Из: Россия
Пользователь №: 42 714



Цитата(Jenya7 @ Jul 7 2018, 09:05) *
а вообще sprintf монструозная функция для эмбедед. никогда не использовал ее.
Как же тогда делать?

Давно просили - про "Программа вылетает":
не знаю как это может помочь
Hard fault
HFSR 0E80

Сообщение отредактировал aBoomest - Jul 21 2018, 09:58


--------------------
C уважением!
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 21 2018, 11:10
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(aBoomest @ Jul 21 2018, 12:57) *
Как же тогда делать?

Давно просили - про "Программа вылетает":
не знаю как это может помочь
Hard fault
HFSR 0E80

Вы уверены что правильно считали HFSR? wacko.gif

Цитата(Jenya7 @ Jul 7 2018, 09:05) *
а вообще sprintf монструозная функция для эмбедед. никогда не использовал ее.

Ну и зря. Не такая она и монструозная.

Сообщение отредактировал Arlleex - Jul 21 2018, 11:11
Go to the top of the page
 
+Quote Post
thermit
сообщение Jul 21 2018, 11:57
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(aBoomest @ Jul 21 2018, 12:57) *
Как же тогда делать?

Давно просили - про "Программа вылетает":
не знаю как это может помочь
Hard fault
HFSR 0E80


Посмотрите в дизассемблере содержимое функций isnanf и isinff (isinfd isnand). Скорее всего они пустые (с мусором).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th April 2024 - 18:54
Рейтинг@Mail.ru


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