我是靠谱客的博主 害怕小海豚,最近开发中收集的这篇文章主要介绍uc/os-iii学习笔记-中断管理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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);


在系统锁住调度器的期间,系统依然响应中断,如果中断唤醒了的更高优先级线程,调度器并不会立刻执行它,直到调用解锁调度器函数才尝试进行下一次调度。同中断锁一样把调度器锁住也能让当前运行的任务不被换出,直到调度器解锁。但和中断锁有一点不相同的是,对调度器上锁,系统依然能响应外部中断,中断服务例程依然能进行相应的响应。所以在使用调度器上锁的方式进行任务同步时,需要考虑好任务访问的临界资源是否会被中断服务例程所修改,如果可能会被修改,那么将不适合采用此种方式进行同步。

调度器锁能够方便地使用于一些线程与线程间同步的场合,由于轻型,它不会对系统中断响应造成负担;但它的缺陷也很明显,就是它不能被用于中断与线程间的同步或通知,并且如果执行调度器锁的时间过长,会对系统的实时性造成影响(因为使用了调度器锁后,系统将不再具备优先级的关系,直到它脱离了调度器锁的状态)。


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

最后

以上就是害怕小海豚为你收集整理的uc/os-iii学习笔记-中断管理的全部内容,希望文章能够帮你解决uc/os-iii学习笔记-中断管理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部