当前位置:首页 > 单片机 > 单片机
[导读]基于ARM架构的处理器的C语言程序设计遵循ATPCS(ARM-THUMB procedure call standard)和AAPCS(ARM Application Procedure Call Standard)。ATPCS规定数据栈为FD(满递减Full Decrease)类型,并且对数据栈的操作是8字节对

基于ARM架构的处理器的C语言程序设计遵循ATPCS(ARM-THUMB procedure call standard)和AAPCS(ARM Application Procedure Call Standard)。ATPCS规定数据栈为FD(满递减Full Decrease)类型,并且对数据栈的操作是8字节对齐的。在我自己的轻量级的嵌入式操作系统tqOS中没有考虑到线程工作栈的8字节对齐的问题,这样从内存池中分配到的栈的起始地址可能是4字节对齐的也可能是8字节对齐的,如果运气好每一个线程的栈式8字节对齐的则不会有什么问题出现,如果运气差线程的栈式4字节对齐的,那么就会导致种种错误......例如,最要命的是在线程函数中进行浮点数运算的时候,两个浮点数初始化之后打印出来都是错误的数据,进行算术运算之后也是错误的结果。因为浮点数double是8字节的,可能非8字节对齐的栈会导致运算出错。为了解决这个问题,我在tqOS的任务创建函数中对任务栈空间的分配中做了调整,将栈的起始地址始终设置为8字节对齐,如果不为8字节对齐则将栈指针下移至8字节对齐处。另外,APTCS要求了对栈的操作必须是8字节对齐的,所以对任务栈的初始化也是有要求的,也就是说一次要入栈两个数据,或者说一次要入栈偶数个数据,因为一次只入栈一个数据(4字节长度)的话就会导致栈的地址变成非8字节对齐了,这是不允许的!C语言程序会由ARM的C编译器会做好8字节对齐工作,但是涉及汇编和操作系统的时候就需要自己把握好入栈的数据问题。为此我把栈初始化函数里面的一个小小的部分改了一下,就是为了保证初始化完栈之后栈顶指针依然为8字节对齐的(详见tqOS的修改版的注释)。

综上,程序设计时需要保证栈指针为8字节对齐,使用操作系统是要保证每个任务的工作栈为8字节对齐的。详细信息搜索ATPCS和AAPCS。

引例:http://bbs.elecfans.com/jishu_468500_1_1.html

1. 当堆栈为单字对齐时,将有可能导致lib c这样严格按照AAPCS规范的库函数使用异常。

2. 程序中MSP、PSP的地址应尽量双字对齐(即地址能被8整除)。

由于编译器在后续的反汇编中保证堆栈的双字对齐,但为了应对极端情况,Cortex-M3and Cortex-M4中提供了一种硬件自动补齐功能。用户可以通过将SCB->CCR[9]置1使能此项功能。(缺省为双字对齐),当发生中断时由硬件自动检测堆栈是否双字对齐,如果对齐了,则不进行任何操作,如果没有对齐,则自动将SP减4这样便对齐。同时将xPSR的第9位置位。详细描述如下:

Another requirement of the AAPCS is that the stack pointer value should be double-wordaligned at function entry or exit boundary. As a result, the Cortex-M3 and Cortex-M4processors can insert an additional word of padding space in the stackautomatically if the stack pointer was not aligned to double-word location whenthe interrupt happened. In this way, we can guarantee that the stack pointer willbe at the beginning of the exception handler. This “double-word stack alignment”feature is programmable, and can be turned off if the exception handlers do notneed full AAPCS compliance.

The bit 9 of the stacked xPSR is used to indicate if the valueof the stack pointer has been adjusted. In Figure8.2, the stack pointer was aligned to double-word address location,so no padding was inserted and bit 9 of the stack xPSR is set to 0. The samestack frame behavior can also be found when the double-word stack alignmentfeature is turned off, even if the value of stack pointer wasn’t aligned to double-word boundary.


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

为增进大家对工业以太网的认识,本文将对工业以太网的原理、工业以太网的关键技术以及工业以太网要解决的问题予以介绍。

关键字: 以太网 工业以太网 指数

为增进大家对工业以太网的认识,本文将对工业以太网网络优势、工业以太网和IOLINK的区别予以介绍。

关键字: 以太网 工业以太网 指数

为增进大家对工业以太网的认识,本文将对工业以太网的优势、工业以太网缺点、工业以太网的维护予以介绍。

关键字:

Apr. 23, 2024 ---- 随着节能成为AI推理服务器(AI Inference Server)优先考量,北美客户扩大存储产品订单,带动QLC Enterprise SSD需求开始攀升。然而,目前仅Solidi...

关键字: SSD AI 服务器

为增进大家对二极管的认识,本文将对续流二极管、续流二极管的工作原理以及二极管在工业产品中的应用予以介绍。

关键字: 二极管 指数 续流二极管

通过本文,您将了解到二极管反接是否有电压以及二极管在电子电路中的应用。

关键字: 二极管 指数 稳压电路

为增进大家对二极管的了解,本文将对ESD二极管和TVS二极管之间的区别予以介绍。

关键字: ESD TVS 二极管 指数

为增进大家对嵌入式主板的认识,本文将对嵌入式主板以及嵌入式主板常见问题及其解决方法予以介绍。

关键字: 嵌入式 指数 主板

为增进大家对嵌入式系统的认识,本文将对嵌入式系统、嵌入式系统的特点予以介绍。

关键字: 嵌入式 指数 嵌入式系统

为增进大家对嵌入式的认识,本文将对嵌入式、嵌入式工作相关的内容予以介绍。

关键字: 嵌入式 指数 嵌入式技术
关闭
关闭