文档章节

Keil MDK浮点数支持不正常的解决方案

bygreencn
 bygreencn
发布于 2015/05/12 13:25
字数 429
阅读 96
收藏 0

在调用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对齐的问题。

© 著作权归作者所有

bygreencn
粉丝 13
博文 22
码字总数 7435
作品 0
武汉
程序员
私信 提问
Keil5可以打开Keil4的Project

转载于: http://www.jingyan8.cc/article/201601/14916.html 首先是到Keil官网下载最新版本的MDK Core; 接着安装MDK Core,按照默认安装就可以; 在MDK Core安装完成后, Pack Installer会自...

pearl2015
2016/03/06
227
0
keil mdk代码提示与代码补全设置

(主要参考https://blog.csdn.net/w5862338/article/details/50520423,结合自己的实际问题) 一旦习惯了一些实用的功能,当进入到类似的环境中而没有熟悉的功能,会觉得很不方便,代码提示与...

weixin_41852866
2018/04/13
0
0
Keil、uVision、MDK、Keil C51之间的区别比较

曾经有新手提问为什么我装的keil的软件找不到89c51,或找不到stm32。今天特意发这一贴,希望对新手有所帮助。 KEIL是公司的名称,有时候也指KEIL公司的所有软件开发工具,目前2005年Keil由ARM...

心翔
2016/04/23
65
0
Keil(MDK-ARM)介绍、下载、安装与注册

版权声明:本文为博主strongerHuang原创文章,转载请标明: https://blog.csdn.net/ybhuangfugui/article/details/51501781 Ⅰ、写在前面 本文讲述的内容是Keil MDK-ARM版的介绍、下载、安装...

ybhuangfugui
2016/05/25
0
0
ARM-IDE MDK5不兼容MDK工程

问题描述 This is an MDK version 4 project ,require Device support for Cortex-M based devices 提示两种解决方案: Migrate to Device Pack Install Legacy Support 首先这个工程文件的确......

CSDNhuaong
2017/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

首次揭秘:阿里巴巴中间件在 Serverless 技术领域的探索

Serverless 话题涉及范围极广,几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。AWS Lambda 是 Serverless 领域的标志性产品,但如果将其应用于核心业务,可能会...

阿里云官方博客
14分钟前
0
0
Python免踩坑指南

最近我发现GitHub上中文项目越来越多,真实令人欣喜的事情啊。不知道小伙伴们有没有发布自己的GitHub精品项目,觉得自信的可以拿出来,推荐给其他小伙伴哦。 好了,话不多说今天的GitHub精推...

编程资源库
27分钟前
0
0
微信授权域名

https://www.jianshu.com/p/9ce837f20740

Js_Mei
27分钟前
0
0
115.两种格式磁盘扩容、调整内存和cpu、迁移虚拟机

28.12 磁盘扩容(raw) 28.13 磁盘扩容(qcow2) 28.14 调整cpu内存和网卡 28.15 迁移虚拟机 28.12 磁盘扩容(raw) 针对一块已经存在的盘进行增加容量 1.qemu-img resize /kvm_data/aminglinux02...

Axin-linux
29分钟前
0
0
好程序员java分享spring框架精讲

1、什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员...

好程序员IT
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部