Chinaunix首页 | 论坛 | 博客
  • 博客访问: 977192
  • 博文数量: 109
  • 博客积分: 554
  • 博客等级: 中士
  • 技术积分: 2577
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-04 12:49
文章分类

全部博文(109)

文章存档

2019年(5)

2016年(7)

2015年(9)

2014年(1)

2013年(71)

2012年(16)

分类: 嵌入式

2012-05-15 23:21:46


1. 问题描述:

当使用uocs printf(),sprintf()打印浮点数问题会出问题,但是裸机不会出问题

我现在使用STM32跑UCOS,在使用sprintf打印float类型时候,不管是何值最后都是0.0,但是类型是int,short类型时没有问题。网上查到是任务堆栈8字节对齐就可以了。

当没有操作系统时,系统堆栈是8字节对齐的,但是当使用ucos时,用户任务不一定是8字节对齐.


Task1-LED1 中的堆栈起始指针0x200004A4,不是8字节对齐,所以但在Task-LED1任务中调用printf等系列函数就会出现问题.


2. 解决方法

我用的是IAR,通过#pragma data_alignment指定对齐字节数

#pragma data_alignment=8

OS_STK Task1_LED1_Stk[Task1_LED1_Stk_Size];

#pragma data_alignment=8

OS_STK Task2_backlight_Stk[Task2_backlight_Stk_Size];


3. 8字节对齐原因

这事儿的历史在于ARM本身不支持非对齐数据存取;因此在有了64Bit的数据操作指令后,指令要求8字节对齐。进而,在编译器的某个版本之后(RVCT3?),AAPCS就要求堆栈8字节对齐。


是先有8字节对齐的AAPCS,然后才有的CM3。先后顺序要注意。CM3 r2p0之前,自动压栈也不要求8对齐,r2p0好像才是强制对齐的。


printf的8对齐是C运行库要求的,和硬件无关,C RTL手册有写,可以去阅读。其根源在于AAPCS要求;而AAPCS根源在于LDRD这类指令。


换句话,未来如果128Bit数据操作有了,ARM还不支持非对其,那AAPCS可能升级为16字节对齐。


供参考,CM3和C-RTL对齐的问题。

阅读(9968) | 评论(5) | 转发(2) |
1

上一篇:没有了

下一篇:离线博客WLW配置发布到Chinaunix

给主人留下些什么吧!~~

linuly2015-04-29 11:20:29

我在RTX上面也遇到这个问题,不知道是不是和8字节对齐有关系。

sailorxing2014-01-10 16:12:39

刚入门UCOS II 与STM32,这个问题困扰了我几天,后来发现任务堆栈过小也在使用printf格式化输出浮点时出现卡死的现象,把堆栈大小由原来64改成128就好了。

桔色花朵2012-05-16 21:21:13

- -这。。。。有点简单了吧?

无色T恤2012-05-16 21:17:23

呵呵,很好的文章~多谢分享啊