理解:
信号量如何创建
上面描述我做简单翻译:初始化一个信号量,当一个任务想独自的,不被其他任务打扰的访问一块内存的时候就可以用到信号量这个东西。
信号量创建
OS_SEM MY_SEM;//定义的信号量
OSSemCreate ((OS_SEM *)&MY_SEM,
(CPU_CHAR *)"MY_SEM",
(OS_SEM_CTR)1,
(OS_ERR *)&err);
信号量是什么东西?
信号量在我看来和状态机类似,也有点像一个递减的一个变量,当一个任务在执行的时候调用了这个函数
说白了就是你比如两个任务想访问同一个内存单元,如果不使用信号量(优先级不同的情况下)就会产生优先级高的那个一直占有访问权,低的那个就访问不到。现在就可以使用一个信号量来控制,使得两个都可以访问得到,但是信号量相当于一个变量,用了一次信号量,信号量就会-1,只有当任务需要获取信号量并且信号量大于0的时候,任务才能消耗这个信号量来让这个任务继续运行,不然就会阻塞在这里运行不下去。
OSSemPend(&MY_SEM, 0, OS_OPT_PEND_BLOCKING, 0, &err);
这就表明了任务当前需要一个信号量来这个任务继续运行(暂且不谈信号量获取超时这类问题),上面说到了信号量是消耗品,用一次就减少一个,所以既然有消耗也就会有增加信号量的方法 如下!!!
值得一说的是这第二个参数:他一共有几个选项
OS_OPT_POST_1
OS_OPT_POST_ALL
OS_OPT_POST_NO_SCHED
在我经验看来,你比如你创建了一个信号量M,
现在信号量M=0,表示你如果任务被OSSemPend();阻塞后,
没有信号量你就没办法运行下去,此时你就需要增加信号量
这个选项第一个应该就是为当前的这个任务增加一个信号量
而第二个选项就是:比如现在有两个任务都需要信号量 且都被阻塞了,但是两个任务优先级不同
此时选择第二个选项,就会为M增加一个信号量,但是被优先级高的任务拿走。就是这个意思,也
就是为当前的这个信号量增加1但是谁用 得看优先级,第一个选项如果也有两个任务需要,就不会
管优先级就为当前的这个任务增加一个信号量。