uc/os-iii学习笔记-中断管理

本文介绍了UCOSIII操作系统中的中断处理机制,包括中断服务函数的执行流程、中断嵌套次数记录方法,以及直接发布和延迟发布两种信号或消息处理模式的区别与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UCOSIII中断

中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断

void USART1_IRQHandler(void)
{
       OSIntEnter();
      //中断服务程序
      OSIntExit();
}  

进入中断服务函数以后使用函数OSIntEnter()

void  OSIntEnter (void)
{
      if (OSRunning != OS_STATE_OS_RUNNING) {
      return
      }
      if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) {
            return; 
      }
     OSIntNestingCtr++;
}
OSIntNestingCtr来记录中断嵌套次数,UCOSIII最多支持250级的中断嵌套。退出中断服务函数时要调用函数OSIntExit()

直接发布和延时发布

UC0S-III从中断发布信号或消息的处理有两种模式:直接发布和延时发布。

直接发布

任务A正在运行,外设产生中断请求,该请求对应的中断服务程序运行,关闭中断,中断服务程序向外发布消息或者信号,开启中断,任务B正在等待该消息,任务B收到消息进入就绪态,任务调度器查找任务就绪表中优先级最高的任务,如果没有比A优先级更高的任务,就运行任务A,否则转而运行更高效优先级的任务。此过程中关中断来保护发布消息或者信号的过程。发布消息的代码放在了中断级运行

延迟发布

任务A正在运行,外设产生中断请求,该请求对应的中断服务程序运行,中断服务程序将要发布的函数调用和相关参数或者信号或消息存入“中断队列”,关闭中断,“中断队列处理任务”开始运行,将发布函数调用和相关参数提取出来,重新开启中断,锁定任务调度器,将发布函数调用和相关参数发布出去,挂起自身,解锁任务调度器。任务调度器查找任务就绪表中优先级最高的任务,如果没有比A优先级更高的任务,就运行任务A,否则转而运行更高效优先级的任务。此过程中关中断保护的是“中断队列处理任务”从“中断队列”提取发布函数调用信息的过程,锁定任务调度器是保护“中断队列处理任务”发布函数调用信息的过程。延迟发布巧妙的将发布函数调用信息的代码放在了任务级来操作,虽然减少了关中断时间,但是也延长了任务时间。**注意:中断队列处理任务是系统内部任务,任务的优先级为最高(0);


在系统锁住调度器的期间,系统依然响应中断,如果中断唤醒了的更高优先级线程,调度器并不会立刻执行它,直到调用解锁调度器函数才尝试进行下一次调度。同中断锁一样把调度器锁住也能让当前运行的任务不被换出,直到调度器解锁。但和中断锁有一点不相同的是,对调度器上锁,系统依然能响应外部中断,中断服务例程依然能进行相应的响应。所以在使用调度器上锁的方式进行任务同步时,需要考虑好任务访问的临界资源是否会被中断服务例程所修改,如果可能会被修改,那么将不适合采用此种方式进行同步。
调度器锁能够方便地使用于一些线程与线程间同步的场合,由于轻型,它不会对系统中断响应造成负担;但它的缺陷也很明显,就是它不能被用于中断与线程间的同步或通知,并且如果执行调度器锁的时间过长,会对系统的实时性造成影响(因为使用了调度器锁后,系统将不再具备优先级的关系,直到它脱离了调度器锁的状态)。

这两种模式的选择取决于应用对于中断响应时间和任务响应时间的要求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值