ARM Cortex M

ARM Cortex M

问题描述:

'使用故障异常'我参加了FreeRtos和Cortex M的讲座,其中讲师建议如果不从ISR使用ISR安全版API,则可能导致Cortex M处理器中的使用故障异常 。这可能会发生,因为这可能涉及从中断上下文(中断处理程序)到任务上下文(线程处理程序) 我的问题是为什么这个任务切换将被视为非法,并且这种切换的影响是什么?ARM Cortex M

+0

听起来软件特定并且与它所在的cpu无关。 –

在Cortex-M(某些)当前上下文将被存储在中断之前使用的堆栈中(在中断入口之前),所以如果你在一个任务中并且它被中断,那么当前上下文的一些将是存储在任务堆栈上(通过PSP)。中断本身总是在MSP上运行。如果中断没有返回到它中断的任务,那么被中断的任务将会出现乱七八糟的堆栈(因为它会在退出时恢复存储的上下文)以及尝试为已切换到的任务恢复不正确的上下文。

在上下文切换(发生在中断中)时,上下文的某些内容会自动存储在任务堆栈中,但操作系统也会将任务上下文的其余部分存储在任务堆栈中。当它执行切换并退出中断时,操作系统恢复其存储的任务的上下文,然后通过退出中断自动恢复上下文的其余部分。这可以确保堆栈保持正确的格式。查看Cortex-M4通用用户指南中的中断入口/出口。

并非所有的处理器都是这样工作的。

这个答案是通用的,FreeRTOS的也不Cortex-M的特殊 - 它适用于任何平台上的任何典型的RTOS:导致调度运行不能从中断服务例程中调用

RTOS API调用。例如,如果给出一个信号量,通常调度程序会运行以切换到该信号量上正在等待的任何任务;这在ISR中是不合适的,当中断环境退出时,调度程序必须运行一次;显然你不想在之前执行上下文切换中断已经完成,并且可能会有其他API调用或者被更高优先级的中断抢占,导致不同的任务变为可运行;在发生上下文切换时仅进行一次评估可保持确定性行为。

函数的ISR特定版本不会立即调用调度程序;相反,他们设置了一个标志来指示调度程序必须在从中断上下文退出时运行。

通常情况下,使RTOS API调用的ISR必须具有序言结语;特定进入/退出中断调用或宏。这个序言增加了一个在结语中递减的计数器;如果计数器为零并且设置了调度标志,则调度程序将运行。该计数器用于防止调度程序在嵌套中断退出时运行。这可以确保调度程序只在退出时运行一次,形成最低优先级待处理中断。

无论是或为什么会发生“UASGE故障”都是FreeRTOS特定的实施细节,并且在很大程度上是学术性的。RTOS同样可以在ISR中使用非ISR安全调用,并运行更具体的错误处理程序(如果不这样做),则最终的行为可能会触发使用错误;似乎依赖于一种有点粗暴的机制; 使用故障是一个非常广泛的陷阱,可能发生对许多原因:

使用故障:检测的未定义指令的执行,对加载/存储多个未对齐 存储器访问。启用时,除零 和其他未对齐的内存访问也会被检测到。

有些RTOS不具备ISR特定的功能,而不是API调用的原因调度检测内部的ISR背景和不同的表现在这方面 - 这是对程序员更简单,更安全,但带有一个小的开销,以测试每个这样的呼叫的背景。在内部处理ISR安全的API也意味着调用本身可以进行OS API调用的函数更简单,因为这些函数本身不需要特定于ISR。