OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4968|回复: 2

atof()函数放在任务中执行的问题?

[复制链接]

32

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2017-1-7
在线时间
75 小时
发表于 2018-4-2 22:58:12 | 显示全部楼层 |阅读模式
2金钱
我在UCOSIII的两个任务中做测试,测试atof()函数,放在其中一个atof()能正常将字符串转化为double类型,放在另一个任务中就不行了,两个任务是一样的,只是优先级不同,两个任务里面也没有些其他东西。如图:

放在altitude_task()任务中,能正常打印出转换后的double数
放在wlan_task()任务就不行,打印的全是0.00000

1.png 11.png






2.png 22.png

最佳答案

查看完整内容[请看2#楼]

将任务堆栈8字节对齐,看看。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2018-4-2 22:58:13 | 显示全部楼层
将任务堆栈8字节对齐,看看。
回复

使用道具 举报

32

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
697
金钱
697
注册时间
2017-1-7
在线时间
75 小时
 楼主| 发表于 2018-4-3 11:27:18 | 显示全部楼层
正点原子 发表于 2018-4-3 01:27
将任务堆栈8字节对齐,看看。

可以了,这原理是什么呢?(网上有说,但是还是不明白具体原因!)网上是这样说的:当ucos运行到Cortex-M3上时候,这个时候使用sprintf进行浮点数格式化输出的时候就会有些问题,无法正常输出浮点数,操作系统也会停止运行,处于崩溃状态。 操作系统崩溃有很多原因,我遇到的两个原因是:堆栈溢出和数据对齐。不知道首先遇到的是哪个问题,如果使用MDK编译器的话请在系统任务堆栈前面进行数据对齐声明,示例:__align(8) static OS_STK TaskStartStk[TASK_START_STK_SIZE];如果你没有修改过arm的启动代码可能就会出现这个问题,启动代码默认使用4字节对齐,而且ARM支持非对齐状态方式(便于在网络通信中优化效率)。而sprintf函数若是使用格式化浮点数就需要进行8字节对齐,这就是问题的所在,只要堆栈声明成8字节对齐就可以了。
C:\Users\Jevin\Desktop\Data smoothing\2018.4.3\调试过程-任务堆栈8字节对齐
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 06:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表