首页 > 其他分享 > 浅谈MDK, IAR,CLANG和GCC的局部变量字节对齐处理差异(2023-10-13)

浅谈MDK, IAR,CLANG和GCC的局部变量字节对齐处理差异(2023-10-13)

时间:2023-10-14 15:56:46浏览次数:47  
标签:__ MDK GCC 浅谈 局部变量 AC6 对齐

视频:

https://www.bilibili.com/video/BV1CB4y1Z7kA


问题由来:

早期这个帖子里面的局部变量对齐仅测试了MDK AC5,但项目中使用AC6发现了新问题,看来AAPCS规约研究的还是不够细:

https://www.armbbs.cn/forum.php?mod=viewthread&tid=109400

当时对局部变量的描述如下:局部变量使用的是栈空间(除了静态局部变量和编译器优化不使用栈,直接用寄存器做变量空间),也就是大家使用在xxxx.S启动文件开辟的stack空间。

在M内核里面,局部变量的对齐问题如果研究起来是最烧脑的,这个涉及到AAPCS规约(Procedure Call Standard for the Arm Architecture,  Arm架构的程序调用标准)。

 

上面这个贴图最重要,仅需理解上面这两条就可以,意思是说,栈地址是全程至少保持4字节对齐的,因为M内核的硬件长做了处理,SP最低两个bit,bit0和bit1直接固定为0了。

但是在程序调用入口处必须满足8字节对齐,对于C语言,不需要用户去管,编译器都帮我们处理好了,先来个简单的示例压压惊:

 

而汇编文件是需要用户去处理的。以xxx.S启动文件为例,通过伪指令PRESERVE8来保证

 

那么问题来了,我们搞个4对齐是不是会出问题,一般情况下也没问题的,但特殊情况下不行,特别调用C库的sprintf和printf函数,直接给你输出个不知所以然的结果来。比如我在H7上做如下测试:

 

输出结果:


总结:

MDK AC5和IAR的用法差不多,MDK AC6和GCC的用法差不多视频里面做了详细对比测试)。

对于GCC和MDK AC6,大家可以手动添加__ALIGNED()设置对齐,这个原定义在CMSIS软件的头文件里面。

#define __ALIGNED(x)                           __attribute__((aligned(x)))

 

AC6定义如下:

#define __ALIGNED(x)                           __attribute__((aligned(x)))

 

标签:__,MDK,GCC,浅谈,局部变量,AC6,对齐
From: https://www.cnblogs.com/armfly/p/17764233.html

相关文章

  • Linux平台下更换GCC版本号
    (1)使用sudoapt-getinstallgcc-xxx下载某个版本gcc,直至在终端输入(以gcc-12为例)gcc-12-v的时候能够输出对应的信息sudoapt-getinstallgcc-12(2)进入ubuntu系统的/usr/bin/文件夹中,此文件夹中存放链接文件(如链接文件gcc)此链接文件能够使得终端在输入gcc-v的时候输出对应......
  • 浅谈 Angular 引入 Transfer State 机制的动机
    在Angular之中,TransferState是一个用于在服务器端渲染(SSR)中传递状态的机制。它可以解决应用程序的一些重要问题,比如性能问题和用户体验问题。在这篇文章中,我将详细解释TransferState的概念,工作原理以及如何在Angular应用程序中使用它。首先,我们需要了解什么是服务器......
  • 浅谈深拷贝和浅拷贝
    深拷贝和浅拷贝深拷贝importcopylist1=[1,2,3,4,[5,6,7]]list2=copy.deepcopy(list1)print(list1)print(list2)[1,2,3,4,[5,6,7]][1,2,3,4,[5,6,7]]list1[0]+=1print(list1)print(list2)[2,2,3,4,[5,6,7]][1,2,3,4,[5,6,7]]list1[4]......
  • 浅谈视频智能分析预警 事件识别算法硬件智能分析网关V2版的功能 及其智能分析网关V1版
    智能分析网关V1版本和智能分析网关V2版本相比,不仅在硬件外观上有所改变,而且在算法类别上也增加了一些新的内容。因此,今天我们将重点介绍智能分析网关V2版本的相关特性。智能分析网关V2是一种先进的数据处理设备,它融合了云计算、物联网和人工智能技术,主要应用于工业生产环境中......
  • gcc编译过程总结
    第一步:对源文件进行预处理,需要使用的gcc参数为-E#1.预处理,-o指定生成的文件名$gcc-Etest.c-otest.i第二步:编译预处理之后的文件,需要使用的gcc参数为-S#2.编译,得到汇编文件$gcc-Stest.i-otest.s第三步:对得到的汇编文件进行汇编,需要使用的gcc......
  • 浅谈locust 性能压测使用
    1.基本介绍Locust是一个开源的负载测试工具,用于模拟大量用户并发访问一个系统或服务,以评估其性能和稳定性。编写语言为Python,可通过Python来自定义构建性能压测场景脚本。Locust支持分布式负载测试,可以通过多个机器协同工作来模拟大量用户并发访问。并提供了一个Web界面,可以实......
  • 地毯和小地毯16 CFR 1630 和16 CFR 1631表面可燃性标准GCC清关认证
    出口美国地垫GCC清关认证美国联邦法律规定,地毯和垫子要符合易燃性标准和其它要求,包括2008年《美国消费品安全改进法》的要求。在地毯和垫子经过检测或合理检测项目后,作为一般用途的地毯和垫子的生产商和进口商必须在一般合规证书(GCC)中认证,地毯和垫子符合适用标准,确保合规和/或按......
  • 地垫/毛绒地毯出口美国GCC清关认证亚马逊gcc认证
    出口美国地垫GCC清关认证美国联邦法律规定,地毯和垫子要符合易燃性标准和其它要求,包括2008年《美国消费品安全改进法》的要求。在地毯和垫子经过检测或合理检测项目后,作为一般用途的地毯和垫子的生产商和进口商必须在一般合规证书(GCC)中认证,地毯和垫子符合适用标准,确保合规和/或按......
  • gcc
         ......
  • GCC测试
    编写一个程序打印自己学号姓名用GCC进行预处理,编译,汇编,链接上面程序运行......