【问题标题】:SVC HANDLER: ARM cortex m processorSVC HANDLER:ARM cortex m 处理器
【发布时间】:2017-02-08 12:23:31
【问题描述】:

互联网上没有足够的关于 svc 的信息。我了解了 SVC 处理程序是如何工作的,但问题是我不明白为什么它将寄存器 R0、R1、R2、R3 和 R12 堆叠到堆栈上。除非它有一个目的,否则它不会存储这些寄存器中存在的对处理器很重要的信息是什么。

有没有人建议如何学习 ARM Cortex M3? 如何开始学习,以免对上述基本内容产生任何混淆。 提前谢谢你

【问题讨论】:

    标签: arm


    【解决方案1】:

    这是因为每次调用函数时,ABI 都会描述:

    • 寄存器r0-r3可以包含参数,可以用作暂存寄存器。这意味着函数不需要保存它们(它们将被修改)
    • 其他寄存器需要函数保存,即函数返回时需要恢复到之前的值。

    r12 与此类似。

    因此,如果SVC 调用 C 函数处理程序,则寄存器 r0-r3 将被 C 函数破坏,而其他寄存器将被保留。在这种情况下,硬件会自动进行堆栈,因此我们可以保证(如果 C 函数正确)所有寄存器的值都与调用 SVC 之前相同。

    请注意,对于 SVC,知道这些寄存器已损坏是可以接受的(因为我们知道何时调用 SVC 指令)。但其他异常(如中断)具有相同的行为,对于这些异常,这是必不可少的,因为我们不知道它们何时发生。

    关于一本书,我知道这本书,所以我可以建议它:

    ARM Cortex-M3 权威指南,第二版,第二版 约瑟夫·姚

    【讨论】:

    • 真正的重点是异常条目本身看起来完全像一个EABI函数调用(硬件负责调用者保存的寄存器),因此异常处理程序是简单的常规 C 函数(还要注意没有特殊的异常返回指令)。
    • 先生,您能否也解释一下 TBB 指令......因为我遇到了困难,我不知道具体情况如何以及我们为什么要编写 DCB () 介于 ..
    猜你喜欢
    • 1970-01-01
    • 2015-03-10
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2015-04-20
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多