您的位置:首页 > 其它

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

2016-07-19 15:21 288 查看

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

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

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

这两种模式的选择取决于应用对于中断响应时间和任务响应时间的要求
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: