第十三讲--临界区保护
临界区保护,主要解决共享资源的问题。问题引入:比如一个普通的task中:
u8 count=0;//语句1 count++; //语句2
同样,在一个中断函数中,count=count+10,本意是希望中断和 task都能实现对count进行增加的操作。而现实有可能是这样的:
首先count的值为0,在 task中,看起来count++ 只是一个语句,但是其实有好几句汇编指令:
首先把 count的值赋给R0; ----汇编1
然后对R0执行加1;------汇编2
然后再把R0的值赋给 count;----汇编3
如果在汇编2的时候,语句被中断打断,执行了count=count+10的操作,但是回到汇编3,count还是只被增加了1次,即count为1,不为12。中断中的写入无效,被覆盖了。
临界区是指访问多个任务共享的一段代码。如果有任务进入临界区,其他任务必须等待他退出。中断也一样。任务在访问临界区的时候,我们把中断屏蔽,等退出临界区后再响应中断。中断标志位是一直有效的,不用担心中断没有被响应,只是推迟响应而已。关中断后,中断抢占任务的问题就得到解决了,同时因为关了中断,pendsv无效,就不会进行任务切换,所以任务和任务之间的资源抢占也解决了。另外临界区保护还有嵌套的问题,如果只是简单粗暴的用开和关来实现,那么就会有下面这个问题。感觉这样也是有问题的,终端嵌套没法用这么简单的方式解决,课程目前只讲到这边,只能先这样了。
最后这样实现。
uint32_t status = tTaskEnterCritical(); //进入临界区 tTaskExitCritical(status); //退出临界区