前言
本系列文章将以RTA-OS为例详细介绍AUTOSAR OS标准及概念,并分享实际使用的一些案例,本文为符合AUTOSAR标准的RTA-OS--Interrupts介绍。
【资料图】
正文
Example 3.1: Entry Function for a Category 1 ISR
3.6.2 第2类中断处理程序Category 2 Interrupt Handlers
2类中断是在RTA-OS的控制下处理的。一个2类ISR类似于一个任务。它有一个入口函数,当中断处理程序需要运行时,由RTA-OS调用。2类中断处理程序是使用示例3.2中的C语法编写的。
Example 3.2: Entry Function for a Category 2 ISR
不需要为第2类ISR入口函数提供任何C函数原型。这些在rtaosgen生成的Os.h头文件中提供。
注意:不能在类别2 ISR中放置“从中断返回”命令。从中断返回-由RTA-OS处理。
3.6.3 清除中断Dismissing Interrupts
当硬件检测到一个中断时,它通常会设置一个挂起位,告诉中断控制器已经发生了一个中断。然后,中断控制器将通过中断向量表切换到处理程序。
挂起位的处理取决于目标硬件,但有两个基本模型:
1.挂起位在中断处理后自动清除(即当中断处理程序开始执行时)。当处理程序退出时,如果当前中断正在处理时,中断已成为挂起,则该处理程序将自动重新触发。
2.挂起的位必须由中断处理程序中的用户代码手动清除。中断处理程序的主体,无论是第1类还是第2类,都需要包括清除挂起位的代码,并向硬件发出信号,然后中断已被处理。
如果需要清除挂起位,最好在进入处理程序时立即执行此操作,因为这样可以最大限度地减少中断发生的第二个实例设置挂起位与随后清除挂起位之间的时间。这有助于防止中断多次挂起但硬件无法识别的问题。代码示例3.3展示了二类ISR处理程序的推荐结构。
Example 3.3: Dismissing the interrupt
Example 3.4: Inefficient interrupt handler
Example 3.5: More efficient interrupt handler
需要查阅硬件参考手册,以了解需要在目标硬件上执行的操作。
3.6.4 编写高效的中断处理程序 Writing Effificient Interrupt Handlers
编写的每个中断处理程序将在代码执行所需的时间内阻塞所有同等或更低优先级的中断。在编写中断处理程序时,使处理程序尽可能短是一种良好的做法。长时间运行的处理程序将为低优先级中断的服务增加额外的延迟。
通过最小化中断处理程序的执行时间,可以最大化整个系统的响应性。
如果需要执行一段长时间运行的代码来响应中断发生,那么可以将该代码放入任务中,然后从Category 2 ISR激活该任务。例3.4和例3.5展示了这些技术的不同之处。
使用第2类处理程序,可以将所需的功能移动到任务中,只需使用中断处理程序来激活任务,然后终止。
3.7 启用和禁用中断Enabling and Disabling Interrupts
中断只有在启用时才会发生。默认情况下,RTA-OS确保在StartOS()返回时启用所有内部中断。
集成指导:AUTOSAR操作系统使用术语“禁用”表示屏蔽中断,“启用”表示取消屏蔽中断。因此,启用和禁用API调用不会启用或禁用中断源;它们只是阻止处理器识别中断(通常通过修改处理器的中断掩码)。
需要在短时间内禁用中断,以防止在任务或ISR中的关键代码部分发生中断。临界区可以是访问共享数据的代码区。
可以使用许多不同的API调用来启用和禁用中断:
• DisableAllInterrupts() and EnableAllInterrupts()
禁用和启用硬件上可以禁用的所有中断(通常是所有可以屏蔽的中断)。这些调用不能嵌套。在DisableAllInterrupts()之后,不允许调用除EnableAllInterrupts()之外的操作系统API。
• SuspendAllInterrupts() and ResumeAllInterrupts()
挂起并恢复所有可以在硬件上禁用的中断(通常是所有可以屏蔽的中断)。这些调用可以嵌套。在SuspendAllInterrupts()之后,不允许在SuspendAllInterrupts()/ResumeAllInterrupts()对和SuspendOSInterrupts()/ResumeOSInterrupts()对之外调用API。
• SuspendOSInterrupts() and ResumeOSInterrupts()
挂起和恢复硬件上的所有第2类中断。这些调用可以嵌套。除了SuspendAllInterrupts()/ResumeAllInterrupts()对和SuspendOSInterrupts()/ResumeOSInterrupts()对之外,不允许在SuspendOSInterrupts()之后调用API。
注意:必须确保“Resume”调用不会比“Suspend”调用多。如果存在,则可能导致严重错误,并且行为未定义。随后的" Suspend "调用可能无法工作。这将导致无保护的临界区。
示例3.6显示了是如何正确地使用中断控制API调用和嵌套的。
在第1类ISR的情况下,必须确保在禁用中断的整个时间内没有进行RTA-OS API调用(其他挂起/恢复调用除外)。
如果2类ISR通过调用DisableAllInterrupts()将中断级别提高到OS级别以上,那么它可能不会进行任何其他RTA-OS API调用,除了调用EnableAllInterrupts()来恢复中断优先级。当执行ISR时,不允许将中断优先级降低到初始级别以下。
Example 3.6: Nesting Interrupt Control API Calls
3.8 保存寄存器集Saving Register Sets
RTA-OS提供了一种跨上下文切换保存寄存器集的机制,rtaosgen可以优化提高运行时性能所需的保存量。
2类ISR也可以使用相同的机制,只需选择哪些ISR使用图3.6所示的配置寄存器集。
图3.6:在类别2 ISR中的寄存器集
3.9 默认中断The Default Interrupt
如果使用RTA-OS来生成一个向量表,那么可能需要用一个默认的中断来填充未使用的向量位置。
图3.7显示了如何定义默认中断的。
图3.7:在向量表中放置一个默认中断
注意:不要从默认中断进行任何RTA-OS API调用,并且不能从处理程序返回。
默认中断就像第1类中断一样实现,因此必须用CAT1_ISR宏标记为中断。默认中断处理程序中的最后一条语句应该是一个无限循环。示例3.7显示了如何做到这一点。
Example 3.7: The Default Interrupt Handler
3.10 小结
•RTA-OS支持1类中断和2类中断。
•1类ISR是绕过RTA-OS的正常嵌入式系统中断。因此,它们不能与操作系统交互,并且被禁止进行(大多数)RTA-OS API调用。它们应该使用CAT1_ISR宏进行标记。
•第二类ISR是操作系统管理的中断,运行在RTA操作系统提供的包装器(Wrappers)中。这些中断可以调用RTA-OS API。它们必须使用ISR宏进行标记。
•所有中断运行在中断优先级(IPL),它总是严格高于最高任务优先级。
•IPL标准化了所有硬件设备的中断优先级模型-更高的IPL意味着更高的优先级。
•RTA-OS可以生成一个中断向量表,或者你可以选择自己编写。当生中断向量表时,RTA-OS可以用用户配置的默认中断插入未使用的位置。
参考文档:
[1] RTA-OS V6.1.3User Guide
聊聊自动驾驶应用层软件开发
一文搞懂CAN收发器TJA1145
车载抬头显示系统(HUD)历史及发展
车身控制器功能规范
小鹏P7的热管理系统详解
大众ID4.X内部ECU技术细节整理
比亚迪海豹整车技术整理
揭秘理想的整车电子电气架构
国内主机整车EEA架构汇总
谈谈Bootloader自更新
谈谈对两家AUTOSAR工具看法
汽车软件需求是如何变成用户功能?
汽车E/E架构的网络安全分析
电子电气架构设计需要考虑哪些方面?
分享不易,恳请点个【】和【在看】
关键词: