【问题标题】:Float-point values doesn't work in uC-OS-III浮点值在 uC-OS-III 中不起作用
【发布时间】:2019-05-11 07:48:58
【问题描述】:

float 定义的浮点变量似乎在 µC-OS-III 中不起作用。 一个简单的代码如下:

float f1;

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

会产生这样的输出:

FLOAT:2681561605....

当我在 µC-OS-III 初始化之前在 main() 中测试这段代码时,它工作得很好。但是,在多任务处理开始后,它就不起作用了。它在任务或启动任务中不起作用。

我在 Internet 上搜索过类似的问题,但找不到任何东西。但是,有这篇文章说“用于 ARM 的 IAR C/C++ 编译器要求堆栈指针以 8 个字节对齐......”

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

我将堆栈定位在 8 字节对齐的位置。然后代码在任务中工作,但操作系统在 printf 之后立即崩溃。

我的编译器工具链是 IAR EWARM 版本 8.32.1,我正在使用带有 STM32F103 的 µC-OS-III V3.07.03。

我可能会错过一些操作系统或编译器配置。我不知道!几年前我在使用 µC-OS-II 时遇到了同样的问题,但最后我决定使用定点数学而不是浮点数。

有人能解释一下吗...

【问题讨论】:

  • 确保您的代码也对 FP 数学进行 something - 否则可能会优化 FP 支持 - 至少在某些环境中是这样。试试f1 = rand()*3.14f;
  • 其实这段代码之后的代码做了很多浮点运算。代码 sn-p 仅供参考。

标签: c floating-point ucos


【解决方案1】:

根据 IAR 文章,将 RTOS 堆栈定位在 8 字节对齐将解决问题。

我将堆栈定位在固定位置:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2014-06-07
    • 2020-08-07
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多