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),任务优先级最高的任务获得该信号量,调度器判断刚获得信号量的任务是否为就绪态中优先级最高的任务,是的话就进行任务切换,执行该任务。