天天看点

FreeRTOS信号量的take与give逻辑分析

1.FreeRTOS信号量防止任务之间冲突的,比如A任务还没执行完,B任务就切入执行,这样会造成程序运行错乱,这是引入信号量,当A任务执行时take信号量,此时B任务启动,take不到信号量,只能等待,知道A任务执行完,give了信号量,B任务take到,就接着执行了。

2.若是一个程序里只有一个任务,信号量的作用不大,且容易引起死机,比如一个函数take信号量,没有释放,另一个函数就来take,就会死机,因为程序只有这一个任务,任务调动时总是切到take这个指令中,而信号又在之前没有被释放,此处总是take不着,程序无法执行其他步骤,于是死机。

3.若是有多个任务,一个任务take  A信号量,但没有释放,他会继续往下运行,直到再次遇到take  A,若是此任务中一直没有give这个信号量,那么这个任务就会死到这个take指令中。另一个任务启动时若不会take A信号量,那么这个任务不受前一个任务卡死的影响,能够实现其功能,若此任务也take  A信号量,那这个任务也会死掉。因此只有不take此信号量的任务才会执行,只要一take,此任务就死掉了,或者说永久阻塞了,导致这一情况的根本原因就是有take,没及时give造成。

附注:多任务之间调配原理:

FreeRTOS信号量的take与give逻辑分析
FreeRTOS信号量的take与give逻辑分析

对于单一处理器,在任何时刻只可能有一个任务处于运行态。所以一个任务进入运行态后(切入),另一个任务就会进入非运行态(切出)。

继续阅读