ucosII系统原子操作中产生调度的思考

来源:互联网 发布:安徽慧达通信网络 编辑:程序博客网 时间:2024/05/21 10:27

对于ucosII系统,通过OS_ENTER_CRITICAL()关闭中断,

只要你在关闭中断后不是执行的死循环,那么函数始终会运行完,然后返回,(或者任务运行到for循环的最后),这里可以看到虽然中断关了,但是始终会回到任务的循环中来,而通常任务都是有延时的【OSTimeDly(n)】. 通过源码可以看到在延时函数OSTimeDly()里会关闭中断,然后会开启中断的.

 

原子操作:原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断。

在ucosII中,OS_ENTER_CRITICAL()关闭中断后,理论上就是原子操作了,因为只要你不要它调度,系统不会调度了.那么好,如果在关闭中断后你不手动去执行调度、或者你不调用能够引起直接运行或者间接运行到调度函数OS_Sched(),(这里还得假设你调用的函数里面无开启中断的语句,不然可以产生中断的!),那么在你手动开启中断之前【OS_EXIT_CRITICAL()】,确实是不能被中断的,实现了原子操作.

但是如果你不小心调用了可以开启中断的函数,或者导致执行OS_Sched()函数的代码,现在好了,时钟中断会将所有任务的延时减一,并使该就绪的任务就绪,如果你的任务优先级不是最高的,而且比你高的优先级的任务已经就绪了,系统就调度了.本次原子操作失败!被打断了! 这样的情况其实是有可能不小心导致它发生的.在实际应用中应该注意这个问题.

 

原创粉丝点击