freertos内部机制——队列、信号量、互斥量、任务通知等的总结

超时唤醒:在delay到ready过程中,可以设置休眠时间,此时间由tick中断++。

1、队列

        使用队列结构体。1、队列的创建,包括两个参数,环形缓冲区的长度和大小(即多少个,每个多大),队列结构体中的两个链表包括等待发送链表和等待接收链表。2、队列的接收,关中断,判断队列里的消息是否大于零,【1】大于零,读完,判读已经休眠的写列表中是否有任务,如果有则唤醒(产出写等待链表中的第一个任务,把此任务从delay移到ready)【2】小于零,是否等待,不等待,返回错误,等待,写入等待链表,从ready移到delay。

2、信号量(01)  注意:写信号量时没有等待时间

        信号量也使用创造队列函数和队列结构体。1、信号量的创建,两个参数,长度设置为一,大小设置为零(即没有环形缓冲区),只有结构体参与分配内存。2、写信号量:如果信号量小于1,则加一,判断读等待链表中是否有任务,有则唤醒,(delay移到到ready,删除此任务在读等待链表)3、读信号量、判断是否大于零,大于零则读,--,小于零则是否等待,否,返回错误,是,移动链表,同上。

3、互斥量

        互斥量是特殊的信号量。互斥量主要作用是处理因优先级反转的问题,使用优先级继承处理。优先级反转:高的优先级不能执行,被低的优先级代替执行。(原因:低优先级获得了互斥量没有释放被高优先级抢占,高优先级又自己阻塞,然后执行优先级较低的任务)优先级继承:在高优先级要等待时,把占有互斥量的任务优先级拉高,让他执行完释放互斥量,高优先级就可以执行了。1、读互斥量:和信号量基本一样,在等待时多了是否要进行优先级继承(即把低优先级的优先级抬高)。2、写互斥量:在互斥量++的函数中选择是否要恢复以前的优先级,任务已经正常。

4、事件组 (禁止任务调度而不是关中断)(在中断中调用函数必须加后缀isr,读事件组没有此函数,但写事件组有此函数,在写事件的中断函数中,他是写了一个队列,通过写队列在都队列中调用一个守护函数去对事件设置,这样就都在任务层面了,不能再中断中设置事件是因为设置事件有不确定性)

        事件组没有用队列结构体。1、事件组的创建,事件组单独创造了一个事件组结构体,里面包括一个等待链表和一个事件组对应改变位的变量。2、读事件组:有三个重要参数(包括要等待那些事件,等待完了事件后是否清除事件,等待那些事件中的一个还是全部),如果等待到了满足参数设置的则执行参数设置的,如果没等到就把此任务移到等待链表中,并从ready移到delay.3、写事件组:直接写,在判断读链表中是否能被唤醒。和前面差不多的流程,主要是要判断和设置满足条件的事件。

5、任务通知  在任务结构体中定义state和value,state有三个状态,不通知,等通知,接到通知

        任务通直接找到任务,不需要用来拿链表唤醒。1、读任务通知:有四个参数(包括对Value的进入清除和出去清除,和value和等待时间)。判断state是否接到通知,否,设置value,则由不通知变为等通知,如果等则从ready移到delay。接到通知,设置value,恢复不通知。2、写任务通知:得到现在状态改为接到通知,根据参数改变value,唤醒等通知。

        

             

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值