keil c语言浮点数,Keil MDK浮点数支持不正常的解决方案

当使用printf调试浮点数时遇到显示为0.00的异常,原因是堆栈未按8字节对齐。解决办法是在IAR和KeilMDK环境下通过#pragma data_alignment指定8字节对齐,确保与AAPCS和C运行库要求一致。该问题与硬件无关,主要由AAPCS的8字节对齐要求引起,未来可能随着数据操作指令的发展,对齐要求会进一步提升。
AI助手已提取文章相关产品:

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

在调用printf调试浮点数的时候,在内存中表示正确,但是打印数据就都为0.00,其他整形数据表示正常。

经查资料得知,浮点数要求堆栈八字节对齐导致,如果系统的默认堆栈不是八字节对齐的一定会出现此问题。

将变量八字节对齐即可。

解决方案:

1、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];

2、Keil MDK下的解决方案:

在任务堆栈声明前面加入强制八字节对齐命令,如下:

__align(8) static OS_STK TaskEquipmentStk[TASK_EQUIPMENT_STK_SIZE];

__align(8) static OS_STK TaskUartRcvStk[TASK_UARTRCV_STK_SIZE];

__align(8) static OS_STK TaskFileRcvStk[TASK_FILERCV_STK_SIZE];

__align(8) static OS_STK TaskFtpStk[ TASK_FTP_STK_SIZE ];

__align(8) static OS_STK TaskErrorRateRS485Stk[ TASK_ERROR_RATE_RS485_STK_SIZE ];

原因详解

这事儿的历史在于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对齐的问题。

您可能感兴趣的与本文相关内容

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值