UCOSIII中关于使用信号量访问共享资源区的思考

1.一个任务使用了延时且不使用信号量访问共享资源区时,延时导致发生任务切换,共享资源区的数据可能会被另外的任务修改,以至于被打断的任务得不到想要的结果。

2.那么使用信号量访问共享资源区时ucos系统是怎么处理得呢?

        在创建信号量的时候将信号量初始值设置为1,此时信号量是个二进制信号量,一次只能一个任务使用共享资源。请求信号量的时候设置为阻塞态,等待时间设置为0(即无限制地等待)。

        使用延时函数此时触发任务切换,但由于任务请求信号量之后独占该资源(顺利请求到信号量,信号量没有被其它任务占用而导致当前任务被阻塞,不会发生优先级反转问题),系统此时执行的不是处于就绪态优先级最高的任务,也不会去执行任务内延时函数之后的代码,而是去执行空闲任务

效果如下图所示

任务1:
Idle task is running
Idle task is running
First task Running!

任务2:
Idle task is running
Idle task is running
Second task Running!
Idle task is running
Idle task is running
Idle task is running
Idle task is running
Idle task is running
Idle task is running

3.任务同步

描述:        任务A:   决定任务B能否进行一次操作(释放一次信号量使得等待的任务继续进行)

                   任务B:   无限次去问任务A要不要进行一次操作(无限次请求信号量

        将信号量初始值设置为0,那么没有一个任务能使用共享资源,每调用一次发送(释放)信号量的函数,没有任务等待该信号量的话,信号量值+1,        如果有一个任务在等待,信号量值不变(已经+1再-1),任务优先级最高的任务获得该信号量,调度器判断刚获得信号量的任务是否为就绪态中优先级最高的任务,是的话就进行任务切换,执行该任务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值