uCOS-II中断服务程序写法
uCOS-II在写中断服务程序(如串口中断)中,下面两种方法有什么不同,哪个更好?串口中断1
{
OS_ENTER_CRITICAL();
用户代码
OS_EXIT_CRITICAL();
}
串口中断2
{
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
用户代码
OSIntExit();
} 两种写法,不是各有优缺点嘛... 第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得到执行:退出ISR之前没有调用OSIntExit(),程序直接返回中断发生前的任务,继续执行原来的任务。 OSIntExit()的作用是1、OSIntNesting--;2、获取最高就绪任务,如最高优先级任务不是当前任务,则进行中断任务切换。也就是中断并不一定返回到被中断的任务,还有可能是更高优先级的就绪任务(在用户中断进行期间,时钟节拍中断有可能让等待任务进入就绪状态,当然前提是时钟节拍中断的优先级最高(关于时钟节拍中断的优先级问题,并没有资料明确,我一般将其设置为最高,可以保证高优先级任务的实时性,当然也有人设置为最低,降低了不必要的中断进行时时间开销,不过综合UCOS的其余代码,个人认为设定为最高比较好,毕竟时钟节拍切换的时间是可以估算的))。
第二种写法更好,但是建议不要直接OSIntNesting++,UCOS提供了OSIntEnter函数嘛
个人经验,欢迎拍砖 * Notes : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair.In other words, for every call
* to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
* end of the ISR. mark hellochen 发表于 2011-11-25 18:33 static/image/common/back.gif
第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得 ...
顶表示感谢 学习了!!!!!!!! 四楼正解!! 学习了。 mark刚好碰到这个问题 恩。我个人的理解是这样子的。
首先如果我没有记错的话OS_ENTER_CRITICAL表示进入临界区有三种方案,其中有一种就是关闭所有中断请求。这个时候不存在中断嵌套的问题了。第一种写法就可以了。
随着应用要求的增多和处理器性能的提升。进入临界区后允许新的中断请求。中断嵌套的情况就会出现。这个时候需要使用第二种写法。 hellochen 发表于 2011-11-25 18:33
第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得 ...
关键就是OSIntExit会引起调度。 多谢楼上的讨论! 看你要怎么用
第一种写法 的话是中断函数自成一体的结构 中断函数和任务不太关联或者用共享内存的方法关联在一起
第二种写法 中断与任务有关联 比如mail message 或者signal 中断完成后立刻调度任务 学习了。{:smile:}{:smile:}{:smile:} 第一种写法关中断的时间比较长,不能中断嵌套,实时性差。 还不了解,过来学习的{:lol:} 用了这么久的uCOS-II,都还没这么深入的研究过,一直用的第一种方法 一直是这个方式:
中断服务程序
{
OSIntEnter();
用户代码
OSIntExit();
}
这个会关总中断呢
页:
[1]