gpt4 book ai didi

assembly - 为什么 ARM 管理模式有自己的堆栈?

转载 作者:行者123 更新时间:2023-12-04 04:40:57 28 4
gpt4 key购买 nike

我正在使用 Atmel AT91SAM7S 微 Controller ,看起来 IRQ 处理程序应该在主管模式下执行,而主循环代码在系统模式下执行。另外,我应该保留一部分 RAM 以供主管模式代码用作堆栈。我从演示程序中得到的启动汇编代码默认保留128字节。

为什么我要为supervisor模式预留单独的栈空间;为什么它不能只使用与系统模式(主)相同的堆栈?具有与主循环代码完全不同的堆栈的中断处理代码有什么好处?我看到当前用于 IRQ 处理的汇编代码在跳转到中断处理程序之前从 IRQ 模式切换到主管模式。在用户模式下执行中断处理程序是否合适?如果是这样,我有什么需要注意的吗?

我问是因为如果中断有自己的堆栈,我需要估计在最坏情况下中断将使用多少堆栈空间的上限。如果中断使用与 main 相同的堆栈,则没有必要这样做,只要实际上有足够的 RAM 可用(当然,我不会使用那么多)。

我唯一能想到的是,如果您要实现具有某种内存保护的操作系统,那么拥有一个单独的堆栈会很有用;但既然我不这样做,这有关系吗?

附言我熟悉 AVR 及其中断处理。

澄清

当 CPU 跳转到地址 0x18 时,中断处理似乎开始了,其中包含一条到 AT91F_Irq_Handler 的分支指令。 ,下面。据我所知,处理器自动进入中断模式;该程序集在分支到 (C) 功能之前切换到监控模式,具体取决于触发的中断线。它从高级中断 Controller (AIC) 获取分支地址。

AT91F_Irq_Handler:
/* Manage Exception Entry */
/* Adjust and save LR_irq in IRQ stack */
sub lr, lr, #4
stmfd sp!, {lr}
/* Save r0 and SPSR (need to be saved for nested interrupt) */
mrs r14, SPSR
stmfd sp!, {r0,r14}
/* Write in the IVR to support Protect Mode */
/* No effect in Normal Mode */
/* De-assert the NIRQ and clear the source in Protect Mode */
ldr r14, =AT91C_BASE_AIC
ldr r0 , [r14, #AIC_IVR]
str r14, [r14, #AIC_IVR]

/* Enable Interrupt and Switch in Supervisor Mode */
msr CPSR_c, #ARM_MODE_SVC

/* Save scratch/used registers and LR in User Stack */
stmfd sp!, { r1-r3, r12, r14}

/* Branch to the routine pointed by the AIC_IVR */
mov r14, pc
bx r0
/* Manage Exception Exit */
/* Restore scratch/used registers and LR from User Stack */
ldmia sp!, { r1-r3, r12, r14}

/* Disable Interrupt and switch back in IRQ mode */
msr CPSR_c, #I_BIT | ARM_MODE_IRQ
/* Mark the End of Interrupt on the AIC */
ldr r14, =AT91C_BASE_AIC
str r14, [r14, #AIC_EOICR]
/* Restore SPSR_irq and r0 from IRQ stack */
ldmia sp!, {r0,r14}
msr SPSR_cxsf, r14
/* Restore adjusted LR_irq from IRQ stack directly in the PC */
ldmia sp!, {pc}^

最佳答案

您不必将主管 r13 用作 堆栈 .您可以将其用作通用寄存器来保存某些内容,然后转换到系统模式并在该模式下运行 ISR 的其余部分。它很灵活,如果您愿意,您可以拥有不同的堆栈;你不像其他架构那样被铐上手铐。您可以使用一些保存区域指针或通常指向当前正在执行的任务的指针(或双指针)来填充主管 r13。您需要保存 lr , spsr ,以及如果您希望 ISR 返回将被破坏的任何其他寄存器。我认为最初,正常的 ARM 将处于中断模式;也许您还有其他一些处理程序已经转换到主管模式?通常系统模式有一个内核堆栈/任务控制块,它在多任务系统中切换。监督模式是一种常见的异常处理模式。

如果您只有一个任务并且想使用它的堆栈,则可以使用以下方法。在主管中保存上下文后,转换到系统模式并执行 ISR 的其余部分。只需恢复包括 lr 在内的寄存器和 cpsr返回正确的模式、程序计数器和条件代码。

你当然有 选项 将管理器 r13 用作异常堆栈,许多人可能喜欢它具有有限的行为和更快的 IRQ 延迟,因为堆栈已预设并准备好供主 ISR 主体使用。

关于assembly - 为什么 ARM 管理模式有自己的堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18924177/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com