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

视频:

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

浅谈MDK, IAR, CLANG和GCC的局部变量字节对齐处理差异


问题由来:

早期这个帖子里面的局部变量对齐仅测试了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)))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS笔记4_水动力模型验证不理想时如何修改局部水深地形

本文目录 前言Step 1 模型验证不理想的情况Step 2 修改确值点并重新插值 前言 本章主要服务于MIKE水动力模型的调整修改工作。水动力模型跑完之后,常常会出现验证结果不理想的情况,比如潮位验证中,实测站点数据与模拟数据相差很大&#xff0…

苹果ios用户下载ipa文件内测签名的后的app应用下载安装到手机图标消失了-解决方案

下载好的应用竟然找不到了?这么神奇?我尝试了解了一下复原了同学给我的内容果然出现了我尝试科技了一下,总结了以下的可能性!同学如果这个回答解决了你的困扰,同学给个赞,如果你有更好的排查方案评论区分享…

Modelsim查看波形窗口内断言(SVA)消息指示器

步骤1:创建工程并编译完成 在相应目录下创建好工程并编译无错误后; 步骤二: 在菜单栏中选择“Simulate”—>“Start Simulation”—>“Others”,在“Others Vsim Options”中输入 -msgmode both -displaymsgmode both 步骤三&#xf…

UI自动化测试 —— Jenkins配置

前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家。 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试&…

SQL Server远程登录失败

SQL Server远程登录失败 检查SQL SERVER 是否允许远程访问. 具体步骤: 1)在远端SQL Server主机上,打开SSMS并连接数据库 2)在相应”数据库”上单击右键,选择”属性” 3)选择”连接”选项卡,检查”远程服务器连接”下,RPC服务是否选择. 设置SQL Server相关TCP连接 1.打开SQL Se…

下载Python的不同版本在同一台电脑上如何共存

1. 下载安装不同版本的Python 官网下载:https://www.python.org/downloads/安装自己需要的版本(我这里以Python3.6和Python3.9为例,下载安装细节不过多赘述) (这里的安装路径自己设定,命名最好是根据下载…

491. 递增子序列

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。 示例 1&#x…

【160】相交链表

方法一:双指针法 算法思想: 使用两个指针p1,p2分别遍历headA和headB。 当p1遍历完headA或p2遍历完headB,我们让该指针去遍历另一个链表。 由于两个指针走的路程相同,所以若两链表相交,则p1,p2一…

项目管理之六大目标及成功方程式

项目管理的六大目标分别是范围、质量、时间、成本、收益和风险。在项目开始之前,需要明确了解项目的范围,并在项目执行过程中对范围进行严格控制,确保项目不偏离既定的范围。同时,需要明确项目的质量标准和预期成果,然…

VRTK4 代码 取消/禁用 抓取

using Tilia.Interactions.Interactables.Interactors;private InteractableFacade interactableFacade GetComponentInChildren<InteractableFacade>();//取消抓取 if (interactableFacade.IsGrabbed) {interactableFacade.UngrabAll(); } //禁用抓取功能 interactable…

Spring Boot:Dao层-实例介绍

目录 Dao层的作用Dao层的特点与 Service 层和 Controller 层的关系实例介绍MenuDaoOperatorLogDaoRoleDaoUserDao四个文件的共同点引用的包使用Repository注解继承JpaRepository接口接口的实体类的主键类型使用 Query()注解 Dao层的作用 负责与数据库进行交互&#xff0c;主要…

使用 Apache Kafka 进行发布-订阅通信中的微服务

发布-订阅消息系统在任何企业架构中都发挥着重要作用&#xff0c;因为它可以实现可靠的集成&#xff0c;而无需紧密耦合应用程序。在解耦的系统之间共享数据的能力并不是一个容易解决的问题。 考虑一家拥有多个使用不同语言和平台独立构建的应用程序的企业。它需要响应地共享数…

redis知识点整合

Redis是一种开源的内存数据结构存储系统&#xff0c;常用于缓存、消息队列、数据存储等场景。以下是Redis的一些常见知识点整合&#xff1a; 1. 数据结构&#xff1a;Redis支持多种数据结构&#xff0c;包括字符串、哈希表、列表、集合、有序集合等&#xff0c;每种数据结构都…

发个地区和对应的价格方案

在当今数字化的世界中&#xff0c;网络工程师面临着各种挑战&#xff0c;从跨界电商到爬虫&#xff0c;从出海业务到网络安全&#xff0c;再到游戏领域。为了应对这些挑战&#xff0c;网络工程师需要了解并利用各种技术&#xff0c;其中Socks5代理和代理IP技术成为了他们的得力…

FLAME模型运行原理

FLAME模型利用了线性蒙皮技术(linear blend skinning)来使面部网格随着姿态变形。 θ 参数的影响 FLAME建立了一个面部网格模板mesh T。确定了关键的面部关节点J,如颈部、下巴等关节。每个网格顶点都赋予了一个蒙皮权重W,表示它受每个关节的影响程度。在变形时,对每个关节按照…

frp隧道(流量代理)

代理 代理使用场景 拿下远程web服务器webshell连接不稳定&#xff0c;需要使用稳定的木马程序远程服务器无法直接连接攻击者电脑&#xff08;内网IP&#xff09;需要借助公网vps转发来自失陷服务器的木马流量借助frp服务器&#xff08;vps&#xff09;和客户端&#xff08;内…

MOS管经常被烧坏,多半是这些原因

MOS管&#xff0c;即金属氧化物半导体场效应管&#xff0c;是电子电路中常见的重要元件&#xff0c;因此很多电子工程师会选择在电路板上使用MOS管&#xff0c;但在使用过程中经常会遇见MOS管莫名被烧毁的问题&#xff0c;这些问题是如何造成的&#xff1f;如何解决&#xff1f…

彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

彻底解决Qt中文乱码以及汉字编码的问题&#xff08;UTF-8/GBK&#xff09; Chapter1 (彻底解决Qt中文乱码以及汉字编码的问题&#xff08;UTF-8/GBK&#xff09;一、Qt Creator环境设置二、编码知识科普Qt常见的两种编码是:UTF-8和GBK 三、编码转换四、QString显示中文乱码的原…

香港服务器在大陆连不上怎么回事?

众所周知&#xff0c;香港服务器与中国内地的网络连通性是比较好的&#xff0c;不仅是机房地理距离的加持&#xff0c;还有就是利用CN2 GIABGP高速线路&#xff0c;参考恒创科技香港服务器访问内地网站&#xff0c;无需绕国际线路转换再到大陆&#xff0c;访问速度会比较快。但…

【交叉编译】tslib库交叉编译

tslib 是一个捕捉触屏事件的工具。qt 库在交叉编译的时候&#xff0c;提供了 -tslib 选项&#xff0c;使用该选项需要提前对 tslib 库进行交叉编译。 目录 1、源码下载 2、安装依赖 3、创建编译脚本 4、开始编译 1、源码下载 tslib 源码下载地址: https://github.com/lib…