【发布时间】:2020-10-02 16:08:03
【问题描述】:
这是一个相当“专家”的问题,但我们也有类似的问题,我无法理解中断优先级与在嵌入式 DSP 系统中执行 ISR 相关的概念。
假设我们有两个中断 - ISR1 和 ISR2 - 如下所示:
我想就系统的中断优先级和线程安全性比较两种情况。假设我们没有信号量、互斥量等,并且 gcc 作为编译器
那么,如果发生以下情况会发生什么:
一)
- IRQ1 的 NVIC 优先级高于 IRQ2
- ISR1 包含关键 memset 函数,ISR2 仅包含非关键部分
b)
- IRQ1 的 NVIC 优先级低于 IRQ2
- ISR1 包含关键 memset 函数,ISR2 仅包含非关键部分
我的期望是:
a) 什么都没有发生,ISR2 会在 ISR1 完成后执行
b) Memset 被中断(uo-oh),系统抛出异常。
我说的对吗?
【问题讨论】:
-
为什么(以及如何)系统会“抛出异常”?最有可能的是,当预期成为关键部分的代码被中断时,它只会默默地产生不正确的结果。
-
memset、memcpy 等只是使用存储或加载和存储指令的循环,可以整天中断,没问题。 memset/cpy 等应该是可重入的,因为 C 是可重入的,所以你需要的所有东西都会被传入,所以即使一个是在一些神奇的高级语言函数调用中,另一个也可以进行一个神奇的高级语言函数调用。 .它只是说明。
-
唯一重要的是数据是否重叠,那么您需要在此之外设置一些锁定以及记录中断并在前台或较低优先级定期处理它的方法家务中断。
-
有点根据定义,如果您有优先级系统,则较高优先级的中断可以中断较低的优先级,但反之亦然,您定义的高低是系统设计的一部分,而不是体系结构。理想情况下,但取决于体系结构,有时是设置,如果 irq2 的优先级较低,则在 irq1 完成后将启动。如果可能,您可能希望在 isr 中设置标志/数据,稍后在可中断的前台驱动程序中进行实际处理,并且可以有额外的代码和时间来等待锁定等。
-
归根结底,这一切都与您的系统设计有关,其中包括您可以/应该执行目标测试的软件和硬件的功能/限制。 (远远超过 99% 的裸机编程是阅读和一次性编码,之后的实际代码相对简单)。