滴水恩情 发表于 2024-9-8 08:02:12

Cortex-A7:ARM官方推荐的嵌套停止实现机制

0 参考资料

   ARM Cortex-A(armV7)编程手册V4.0.pdf
ARM体系结构与编程第2版
1 前言

Cortex-M系列内核MCU停止硬件原生支持嵌套停止,开发者不需要为了实现嵌套停止而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套停止的,这从Cortex-A7停止向量表中仅为外部停止设置了一个停止向量可以看出。本文介绍ARM官方推荐使用的嵌套停止实现机制,以通过软件方式在Cortex-A7上实现停止嵌套。
2 ARM官方推荐的嵌套停止实现机制

2.1 概述

什么是停止嵌套?
   停止嵌套是指停止系统正在实验一个停止服务时,有另一个优先级更高的停止提出停止请求,这时会暂时中止当前正在实验的级别较低的停止源的服务程序,去处置惩罚级别更高的停止源,待处置惩罚完毕,再返回到被停止了的停止服务程序继续实验的过程。
如何在Cortex-A7上实现嵌套停止?
   Cortex-A7硬件原生不支持嵌套停止,按照ARM官方说法实现嵌套停止需要软件实现。
在Cortex-A7上实现嵌套停止的焦点头脑是什么?
   在Cortex-A7上实现嵌套停止的焦点头脑就是在进入IRQ模式后保存一些必要的信息,然后切换到使能IRQ的特权模式(如系统模式),使得新的停止能够被CPU相应。为了方便操纵,一般在进入main函数前就切换到特权模式,在进入IRQ模式后我们切换到同一种特权模式。
为什么不直接在IRQ模式下使能IRQ实现嵌套停止即可?
   之以是不能直接在IRQ模式下使能IRQ有很多原因,此中最重要的一个就是因为在下一个IRQ停止到来时会保存错误的CPSR(当前程序状态寄存器)到SPSR_irq(IRQ模式下的程序状态保存寄存器)中,会将停止前的现场破坏掉。
上述问题可以通过下图描述:
https://i-blog.csdnimg.cn/direct/12f46502626248fe961922b474047acd.png
2.2 嵌套停止实现步调

说明:
进入main函数前就处于系统模式(特权模式),进入IRQ时同样切换到系统模式。
2.2.1 保存上下文

在使能IRQ之前,我们需要保存上下文。包括返回地址及SPSR_irq(IRQ模式下的程序状态保存寄存器)。
2.2.2 确定停止源并失能停止

确定停止源,并将停止失能,防止产生新的同样的停止(对于嵌套停止来说,只有比当前抢占优先级更高的停止才能抢占实验)。
2.2.3 切换到失能IRQ模式的系统模式

系统模式可以操纵一些特别寄存器。这时IRQ仍旧处于失能状态。
2.2.4 将LR入栈然后再使能IRQ

为什么需要将LR入栈:
第一次进入IRQ模式前处于系统模式,LR保存的是系统模式下的程序返回地址。为了防止进入系统模式后使用BL指令(BL指令会将LR的值设置为子函数下一条指令地址)破坏LR的值,需要将LR入栈保护起来。否则LR的值被修改后,IRQ实验完毕后将无法返回停止打断位置的下一条指令位置。
将LR入栈之后,便可以使能IRQ,这时便处于使能IRQ的系统模式。
2.2.5 根据停止源实验相应的停止服务函数

这时IRQ已经使能,假如发生了更高抢占优先级的停止,应该抢占当前停止实验。
2.2.6 实验完停止服务函数后将LR出栈

在完成了停止服务函数后起首进入失能IRQ的系统模式,将入栈的LR出栈。
2.2.7 恢复到IRQ模式并返回到停止打断位置

进入失能IRQ的IRQ模式,到这里来嵌套停止的工作宣告结束,根据SPSR_irq(IRQ模式下的程序状态保存寄存器)恢复停止打断前的CPSR(当前程序状态寄存器),将保存在IRQ模式的LR的值写入PC,返回停止打断位置。
2.2.8 ARM官方示例汇编程序

IRQ_Handler
                SUB lr, lr, #4
                SRSFD sp!, #0x1f         @ use SRS to save LR_irq and SPSR_irq in one step onto the
                                                        @ System mode stack
        CPS #0x1f                                 @ Use CPS to switch to system mode
        PUSH {r0-r3, r12}                 @S tore remaining AAPCS registers on the System mode stack
        AND r1, sp, #4                         @ Ensure stack is 8-byte aligned. Store adjustment and
                                                        @ LR_sys to stack
        SUB sp, sp, r1
        PUSH {r1, lr}
        BL                                                 @ identify_and_clear_source
        CPSIE i                                 @ Enable IRQ with CPS
        BL C_irq_handler
        CPSID i                                 @ Disable IRQ with CPS
        POP {r1, lr}                         @ Restore LR_sys
        ADD sp, sp, r1                         @ Unadjust stack
        POP {r0-r3, r12}                 @ Restore AAPCS registers
        RFEFD sp!                                 @ Return using RFE from the System mode stack.
3 总结

(1)为实现嵌套停止必须通过切换到特权模式实现,且在main函数之前就设置为雷同的特权模式(如系统模式)。
(2)开发者需要自行根据停止抢占优先级决定触发的停止是否有资格运行。
(3)使用软件方式实现嵌套停止相比非嵌套停止处置惩罚方式会多不少指令,效率有所降落。
(4)开发者需要自行根据停止嵌套规则,决定新停止是否有资格抢占实验。
(5)相比于硬件原生支持嵌套停止,软件实现嵌套停止不光效率低下还非常轻易出错。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Cortex-A7:ARM官方推荐的嵌套停止实现机制