【问题标题】:Parallel ARM hardware interrupts with one carrying memset() or memcpy()带有 memset() 或 memcpy() 的并行 ARM 硬件中断
【发布时间】: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% 的裸机编程是阅读和一次性编码,之后的实际代码相对简单)。

标签: c gcc arm interrupt isr


【解决方案1】:

如果看到 NVIC,那么我明白我们谈论的是 Cortex-M 内核 uC。

第一个问题是临界区是什么意思。有两种可能性:

  1. 要修改共享对象。
  2. 执行代码的时间很关键,它不应该被 antyhing 中断(例如它是一个位带通信驱动程序)

如果中断 1 的优先级高于中断 2,则中断 1 不能被中断 2 抢占。uC 会记住中断 2 处于未决状态,并在中断完成时调用其处理程序。

在相反的情况下,中断 2 将抢占执行并在完成后返回到中断 1 处理程序。

b) Memset 被中断(uo-oh),系统抛出异常。

我不明白你的意思。 memset 只是一个普通的功能。如果中断在其执行过程中到达,那么当中断处理程序将控制权返回给它时,它将从中断处继续。没有例外。中断总是发生在某个函数的中间。

如果两个处理程序修改相同的内存区域,您需要提供同步机制来防止此操作的意外结果。示例:中断 1 执行 memset 并将值 5 设置为从地址 100 到地址 100 的内存位置。您希望在所有 100 个字节中都有5。但与此同时(假设 memset 位于地址 160)中断 2 到达并将相同的内存位置设置为10。当此中断完成执行时,内存区域设置为 10。但中断 1 继续执行并将剩余的 40 个字节设置为5。因此,在它之后,您将从地址 100 到 159 的内存区域设置为 10,从 160 到 200 到 5,这可能不是您所期望的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多