ustbyf 发表于 2011-11-25 15:29:08

uCOS-II中断服务程序写法

uCOS-II在写中断服务程序(如串口中断)中,下面两种方法有什么不同,哪个更好?

串口中断1
{
    OS_ENTER_CRITICAL();

    用户代码

    OS_EXIT_CRITICAL();
}


串口中断2
{
    OS_ENTER_CRITICAL();
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    用户代码

    OSIntExit();
}

javine 发表于 2011-11-25 16:41:16

两种写法,不是各有优缺点嘛...

hellochen 发表于 2011-11-25 18:33:38

第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得到执行:退出ISR之前没有调用OSIntExit(),程序直接返回中断发生前的任务,继续执行原来的任务。             OSIntExit()的作用是1、OSIntNesting--;2、获取最高就绪任务,如最高优先级任务不是当前任务,则进行中断任务切换。也就是中断并不一定返回到被中断的任务,还有可能是更高优先级的就绪任务(在用户中断进行期间,时钟节拍中断有可能让等待任务进入就绪状态,当然前提是时钟节拍中断的优先级最高(关于时钟节拍中断的优先级问题,并没有资料明确,我一般将其设置为最高,可以保证高优先级任务的实时性,当然也有人设置为最低,降低了不必要的中断进行时时间开销,不过综合UCOS的其余代码,个人认为设定为最高比较好,毕竟时钟节拍切换的时间是可以估算的))。

第二种写法更好,但是建议不要直接OSIntNesting++,UCOS提供了OSIntEnter函数嘛

个人经验,欢迎拍砖

waszyaw 发表于 2011-12-19 22:05:24

* 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.

kingboy100 发表于 2011-12-20 08:28:23

mark

bwsz1 发表于 2012-11-22 14:40:53

hellochen 发表于 2011-11-25 18:33 static/image/common/back.gif
第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得 ...

顶表示感谢

lwbjun 发表于 2012-11-22 16:12:11

学习了!!!!!!!!

中国力量 发表于 2013-2-25 01:23:19

四楼正解!!

huangxuankui 发表于 2013-3-6 15:16:53

学习了。

zhtj 发表于 2013-3-20 22:42:06

mark刚好碰到这个问题

ttoto 发表于 2013-3-20 23:19:30

恩。我个人的理解是这样子的。
首先如果我没有记错的话OS_ENTER_CRITICAL表示进入临界区有三种方案,其中有一种就是关闭所有中断请求。这个时候不存在中断嵌套的问题了。第一种写法就可以了。
随着应用要求的增多和处理器性能的提升。进入临界区后允许新的中断请求。中断嵌套的情况就会出现。这个时候需要使用第二种写法。

youthdou 发表于 2014-10-21 14:16:30

hellochen 发表于 2011-11-25 18:33
第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得 ...

关键就是OSIntExit会引起调度。

仗剑天涯 发表于 2015-2-3 13:42:04

多谢楼上的讨论!

日日夜夜 发表于 2015-2-4 15:45:03

看你要怎么用
第一种写法 的话是中断函数自成一体的结构 中断函数和任务不太关联或者用共享内存的方法关联在一起
第二种写法 中断与任务有关联 比如mail message 或者signal 中断完成后立刻调度任务

沉默胜过白金 发表于 2015-2-4 19:05:23

学习了。{:smile:}{:smile:}{:smile:}

ShiDongLiang 发表于 2015-6-24 18:56:47

第一种写法关中断的时间比较长,不能中断嵌套,实时性差。

奮闘ing 发表于 2015-8-5 15:02:03

还不了解,过来学习的{:lol:}

Llinuxu 发表于 2015-8-11 23:08:55

用了这么久的uCOS-II,都还没这么深入的研究过,一直用的第一种方法

rayglei 发表于 2015-9-1 20:25:53

一直是这个方式:
中断服务程序
{
    OSIntEnter();   

    用户代码

    OSIntExit();
}

ljt80158015 发表于 2015-10-13 20:51:36

这个会关总中断呢
页: [1]
查看完整版本: uCOS-II中断服务程序写法