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

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

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

 

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

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

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

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UCOSII操作系统创建多任务实验,我收获了以下几点: 1. 多任务的概念和实现方式。UCOSII操作系统可以通过任务控制块(TCB)来实现多任务,每个任务有自己的栈空间和堆空间。在实验过程,我学会了如何创建和切换任务,并且掌握了任务的优先级和时间片轮换等概念。 2. 任务同步和通信。在多任务的环境下,不同的任务之间需要进行同步和通信。UCOSII操作系统提供了多种同步和通信的方式,例如信号量、消息队列等。在实验过程,我学会了如何使用信号量实现任务同步和互斥访问共享资源。 3. 调试技巧和方法。在开发过程,我遇到了很多问题,例如任务死锁、优先级反转等。通过分析程序的运行过程和使用调试工具,我学会了如何快速定位和解决问题。 思考题: 1. 多任务的优缺点是什么?如何根据实际需求选择合适的方案? 优点:能够充分利用CPU资源,提高系统的响应速度和处理能力;能够实现任务的并行执行,提高系统的吞吐量和并发性;能够提高系统的可靠性和可维护性。 缺点:任务切换和调度会带来一定的开销,降低系统的效率;任务之间的同步和通信可能会引入死锁、优先级反转等问题,增加系统的复杂性。 选择合适的方案需要根据实际需求和系统的硬件条件来决定。如果系统需要处理大量的并发任务,或者需要实现实时响应等功能,那么多任务是一个不错的选择。但是如果系统资源有限,或者任务之间的依赖关系比较复杂,那么单任务可能更为适合。 2. 信号量和互斥锁有什么区别?在实际应用如何选择? 信号量和互斥锁都是用来实现任务同步和互斥访问的机制,但是它们的实现方式和使用场景略有不同。 信号量是一个计数器,用来统计某个资源的可用数量。当一个任务需要使用该资源时,需要对信号量进行操作,如果信号量的值大于0,那么该任务可以继续执行,同时信号量的值减1;如果信号量的值等于0,那么该任务需要等待,直到有其他任务释放该资源。 互斥锁是一种独占式的锁,用来保护共享资源的访问。当一个任务需要访问共享资源时,需要获取互斥锁,如果该锁已经被其他任务占用,那么该任务需要等待,直到该锁被释放。 在实际应用,应该根据实际需求来选择合适的机制。如果需要控制某个资源的可用数量,那么可以使用信号量;如果需要保护共享资源的访问,那么可以使用互斥锁。另外,需要注意避免死锁等问题的出现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值