EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1023|回复: 0

[转帖] 干货!基于OS应用中的中断处理

[复制链接]

18

主题

0

回帖

54

E币

技术员

Rank: 2

积分
36
发表于 2017-4-1 15:18:52 | 显示全部楼层 |阅读模式
1:基本的ISR要素
    在μC/OS-II和μC/OS-III中,中断处理中与内核相关的代码并不一定由应用开发人员实现。
实时内核可以被视为任务管理器,是一个将应用开发人员编写的代码作为任务集合在一起的软件模块。大多数基于OS的应用,不仅仅包含任务。通常情况下,基于OS应用的开发人员会整合任务与中断服务程序(ISR),以满足系统需求。
基于OS应用中的ISR会根据使用内核的不同,采用不同的格式。翻阅过Micriμm的μC/OS-II和μC/OS-III内核书的人,会了解到μC/OS-II和μC/OS-III中,提供了类似于下面的ISR例子。App_ISR()在该函数的中间部分调用,App_ISR()表示ISR应用相关的部分,而该例子的伪代码部分与内核相关。
ExampleISR:
    Save CPU registers;
    OSIntEnter();
    App_ISR();
    OSIntExit();
    Restore CPU registers;
    Return
ISR中描述的许多操作是为了易于抢占(一个较高优先级任务需要从一个较低优先级的任务中获取CPU使用权的机制)。伪代码首先保存寄存器,确保即使App_ISR()的行为使一个新的任务就绪运行,中断处理之前正在运行的任务最终能够恢复其执行。保存寄存器后,调用OSIntEnter(),递增计数器来通知内核正在处理中断,后面,类似的调用OSIntExit(),递减计数器。如果计数器减为零(即没有额外的中断嵌套处理),OSIntExit()运行内核调度器,确定ISR应该返回被中断的任务,或者由于App_ISR()的行为,导致中断的任务被抢占。
虽然这个例子的伪代码被认为是μC/OS-II和μC/OS-III中“典型”的ISR,应用程序开发人员并非总是需要实现该函数执行的所有操作。某些微控制器的中断控制器允许OS能够轻松地将保存寄存器,恢复寄存器,调用OSIntEnter()和OSIntExit()的代码包含在BSP或启动代码中,应用开发人员仅负责App_ISR()。很多“经典”的ARM处理器,如ARM7和ARM9系列的处理器,使用一个入口处理中断请求(IRQ),可以使用这种方法。
65161354383269.jpg

确定那些代码需要写到用户自己的ISR中,可以查阅Micriμm的丰富的应用文档,包括μC/OS-III的书,文档中包含硬件无关的内容(包括该版本更详细的伪代码),例程介绍和特定硬件平台的底层代码。书中的示例项目及其他的例子都可以在Micrium公司的网站下载,这些例程也是中断相关信息的理想参考源。基于μC/OS-II或μC/OS-III的例程中,至少实现了一个ISR-节拍中断,内核通过该中断实现时间相关的服务,很多例程中包含额外的ISR,你可以使用其作为自己代码的模板。
通过参考Micriμm例程建立的代码,可以确保你的ISR工作正常。然而,并不意味着,你的实现与例程完全一致。在μC/OS-II和μC/OS-III中,ISR不受内核管理也是可以的,但需具备一些关键条件。下面将讨论这个话题。
2:不受内核监控的中断处理
基于μC/OS-II和μC/OS-III的应用程序中经常使用不受内核监控的ISR,以快速响应某些事件。
在中断处理的第一节,展示了Micriμm的μC/OS-II和μC/OS-III中典型的ISR格式。本文中,将介绍另一种类型的不受内核监控的ISR。与第一种方式相比,这种方式系统开销小,但它并不适用于所有的ISR。
不受内核监控的方式用于不需要使用内核服务的ISR,例如,不需要发送消息到消息队列或给任务发信号量的ISR中。使用不受内核监控的ISR的前提是,该中断永远不会导致抢占发生。换句话说,由于它们不涉及任何内核服务,永远不会导致其他任务就绪。这种类型的ISR不会调用任何导致抢占发生的内核服务。
开发不受内核监控的ISR的关键是ISR嵌套。通常,μC/OS-II和μC/OS-III支持中断嵌套。然而,开发人员在实现受内核管理和不受内核管理的ISR时,应该努力确保前者不能中断后者。对于这种情况,采用优先级机制是理想的方式,如下图所示,不受内核管理的中断优先级高于受内核管理的中断。
65161354332608.jpg

第一节中提供的ISR例程中包含了了两个内核函数调用–OSIntEnter()和OSIntExit(),在不受内核监控的ISR中,不需要这两个函数。因此,该类型的ISR格式如下所示。应该指出的是,保存CPU寄存器的方法不一定相同,因为它可能不需要保存所有涉及上下文切换的寄存器。此外,开发不受内核监控的ISR的开发人员需牢记,前面的ISR代码中可以添加代码来重新启用中断,以实现中断嵌套,然而,在不受内核监控的ISR中,这种处理方式是有问题的。
NonKernelAwareISR:
    Save CPU registers;
    App_ISR();
    Restore CPU registers;
    Return
在μC/OS-II和μC/OS-III观察到的中断例程的不同方式,使得写这些代码的工作变得有挑战性。然而,根据上面的信息和前一篇文章的内容,总结出实现ISR开发的两条基本规则:
应用开发人员需基于不同的中断控制器,实现中断相关的代码,参考Micriμm的文档和示例项目来确定适用于用户平台的 “典型”的ISR。
如果ISR程序不使用内核服务,不会被使用内核服务的程序中断,可以使用不受内核监控的方式实现ISR,减少系统开销。
基于这些规则,你可以充分利用嵌入式微控制器的功能,使用任务和中断编写可靠的应用程序。更多信息可以参考μC/OS-II和μC/OS-III书及在线文档。
积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-26 06:15 , Processed in 0.062557 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表