Mic_chen

It is not the strongest of the species that survive, nor the most intelligent, but the one most responsive to change

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

使用LPC1756使用sprintf(str,"%f",1.25);在str中一直无法显示1.25(整形数据可以显示),网上找了好久说是MAK4.7下的C编译器不支持sprintf的浮点型显示,然后在帮助文档中看到,
The string-based function,such as sprintf() and sscanf(),do not depend on the stdio library.
但还是不太相信这么新的编译器竟然不支持C99标准的函数.

嗯,前面自己也不确定,就猜想以为MDK不支持呢。
找到问题了,是任务堆栈字节对齐的问题,必须要8字节对齐,否则只输出0.000.
AAPCS规则要求堆栈保持8字节对齐。如果不对齐,调用一般的函数也是没问题的。但是当调用需要严格遵守AAPCS规则的函数时可能会出错。
例如调用sprintf输出一个浮点数时,栈必须是8字节对齐的,否则结果可能会出错。
但初始化保证任务栈8字节对齐还不够。具体可参看http://www.cnblogs.com/sky1991/archive/2012/10/13/2722482.html

 

六.总结 综上所述,为了能够安全的使用严格遵守AAPCS规则的函数(比如sprintf)需要做到以下几点:
1.保证MSP在初始的时候是8字节对齐的
2.如果用到OS的话需要保证给每个任务分配的栈是保持8字节对齐的
3.如果用的是基于CM3内核的处理器需将NVIC配置控制寄存器的STKALIGN置位

posted on 2020-08-28 12:58  Mic_chen  阅读(368)  评论(0编辑  收藏  举报