Значения с плавающей точкой не работают в uC-OS-III - PullRequest
1 голос
/ 11 мая 2019

Переменные с плавающей точкой, определенные с помощью float, похоже, не работают в µC-OS-III.Простой код, подобный следующему:

float f1;

f1 = 3.14f;
printf("\nFLOAT:%f", f1);

выдаст такой результат:

FLOAT:2681561605....

Когда я проверяю этот кусок кода в main () перединициализация µC-OS-III, она работает просто отлично.Однако после того, как начинается многозадачность, она не работает.Это не работает ни в задачах, ни в задачах запуска.

Я искал в Интернете похожую проблему, но ничего не смог найти.Однако есть статья, в которой говорится: «Компилятор IAR C / C ++ для ARM требует, чтобы указатель стека был выровнен на 8 байтов ...»

https://www.iar.com/support/tech-notes/general/problems-with-printf-floating-point-f-on-arm/

Я обнаружил стекив 8-байтовых выровненных местах.Тогда код работал в задаче, но ОС вылетала сразу после printf.

Моя цепочка инструментов компилятора - IAR EWARM версии 8.32.1, и я использую µC-OS-III V3.07.03 с STM32F103.

Я могу пропустить некоторые настройки ОС или компилятора.Я не знаю!У меня была такая же проблема несколько лет назад с µC-OS-II, но в конце концов я решил использовать математику с фиксированной точкой вместо плавающих.

Может ли кто-нибудь пролить свет на это ...

1 Ответ

1 голос
/ 25 июня 2019

Размещение стеков RTOS в 8-байтовом выравнивании решит проблему, согласно статье IAR.

Я расположил стеки в фиксированных местах:

static CPU_STK task_stk_startup[TASK_CFG_STACK_SIZE_STARTUP]  @ (0x20000280u);
...