'用法错误例外'在ARM Cortex M中

时间:2017-05-09 19:30:36

标签: arm rtos freertos cortex-m

我参加了FreeRtos和Cortex M的讲座,其中讲师告知如果ISR不使用ISR安全版本的API,可能会导致Cortex M处理器中的使用错误异常。这会发生因为这可能涉及从中断上下文(中断处理程序)到任务上下文(线程处理程序) 我的问题是为什么这个任务切换被认为是非法的,这种转换的后果会是什么?

2 个答案:

答案 0 :(得分:1)

在Cortex-M(某些)上,当前上下文将在中断之前存储在堆栈中(在中断条目中),因此如果您处于任务中并且它被中断,则会存储一些当前上下文在任务堆栈上(通过PSP)。中断本身始终在MSP上运行。如果中断没有返回到它中断的任务,那么被中断的任务将有一个混乱的堆栈(因为它在退出时恢复存储的上下文)以及尝试为切换到的任务恢复不正确的上下文。 / p>

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

并非所有处理器都能像这样工作。

答案 1 :(得分:0)

这个答案是通用的,不是FreeRTOS,也不是Cortex-M特有的 - 它适用于任何平台上的任何典型RTOS:

无法从中断服务例程调用导致调度程序运行的RTOS API调用。例如,如果您给出一个信号量,通常调度程序会运行以切换到该信号量上待处理的任何任务;这在ISR中是不合适的,其中调度程序必须在中断上下文退出时运行一次;显然你不希望在中断完成之前进行上下文切换,并且可能有其他API调用或优先级更高的中断抢占导致不同的任务变得可运行;在上下文切换发生时仅进行一次评估会维持确定性行为。

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

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

是否或为什么会出现错误" uasge fault"将会出现一个FreeRTOS特定的实现细节,并且主要是学术性的。 RTOS可以在ISR中同等地捕获非ISR安全调用的使用并运行更具体的错误处理程序,如果它没有这样做,那么结果行为可能会触发使用错误;这似乎是一种有点粗暴的机制可靠; 使用错误是一个非常广泛的陷阱,可能由于多种原因而发生:

  

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

某些RTOS没有特定于ISR的函数,而是API调用导致调度在内部检测ISR上下文并在该上下文中表现不同 - 这对程序员来说更简单,更安全,但是需要很小的开销来测试上下文每一次这样的电话在内部处理ISR安全的API也意味着调用可能自己进行OS API调用的函数更简单,因为这些函数本身不需要特定于ISR。