信号量&互斥量:创建、获取、释放、删除
信号量用于同步,任务间或者任务和中断间同步
互斥量用户互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁。
二值信号量:同步。如果存在两个线程,为线程1和线程2,如果线程1发送了信号量,线程2接收到了信号量,这两个线程同步工作,如果线程1没有发送信号量,那么线程2也就不工作(前提线程2中有信号量接收等待函数)。相当于一个标志位。
计数信号量:资源使用统计
互斥量:互斥信号是一个拥有优先级继承的二值信号量
递归互斥:互斥中嵌套互斥
优先级反转,由于高优先级任务在等低优先级任务释放信号量的过程中,低优先级被中优先级任务抢夺CPU,最终导致中优先级的任务比高优先级的任务先运行,也就是优先级翻转,而互斥信号量就可以将这个影响降到最低,当高优先级任务发现需要信号量被低级信号量占用需要等待时,就将低优先级任务变成和自己同级优先级,就不至于在等待的过程中被中优先级抢占CPU。
1、配置RCC、USART1、时钟84M
2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。
3、初始化LED的两个引脚、两个按键引脚
4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可
5、创建二值信号量Binary Semaphore
Semaphore Name: 信号量名称
Allocation: 分配方式
Dynamic
动态内存创建Conrol Block Name: 控制块名称
如果想要创建计数信号量Counting Semaphore,必须在 Config parameters
中进行使能。
Semaphore Name: 信号量名称
Count: 计数信号量的最大值
Allocation: 分配方式:
Dynamic
动态内存创建Conrol Block Name: 控制块名称
6、创建两个任务,一个接收任务,一个发送任务
7、生成代码
1、创建一个二值量、并返回一个ID:osSemaphoreCreate
- osSemaphoreDef(BinarySem01);
- BinarySem01Handle = osSemaphoreCreate(osSemaphore(BinarySem01), 1);
2、删除一个信号量:osSemaphoreDelete
包括二值信号量,计数信号量,互斥量和递归互斥量。如果有任务阻塞在该信号量上,那么不要删除信号量
osSemaphoreDelete(BinarySem01Handle);
3、释放信号量的宏:osSemaphoreRelease
释放的对象必须是已经创建的,可以用于二值信号量、计数信号量、互斥量的释放,但不能释放由函数xSemaphoreCreateRecursiveMutex() 创建的互斥量。
osSemaphoreRelease(BinarySem01Handle);
4、获取信号量:osSemaphoreWait
用于获取信号量,不带中断保护。获取的信号量对象可以是二值信号量、计数信号量和互斥量,但是递归互斥量并不能使用这个API函数获取。
int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec)
生成二值信号量:
osSemaphoreId myBinarySem01Handle;
osSemaphoreDef(myBinarySem01);
myBinarySem01Handle = osSemaphoreCreate(osSemaphore(myBinarySem01), 1);二值信号量产生:
osSemaphoreRelease(myBinarySem01Handle);
二值信号量接收:
if(osSemaphoreWait(myBinarySem01Handle,osWaitForever)==osOK)
printf("get binary\n");
生成计数信号量:
osSemaphoreId myCountingSem01Handle;
osSemaphoreDef(myCountingSem01);
myCountingSem01Handle = osSemaphoreCreate(osSemaphore(myCountingSem01), 10);释放计数信号量并统计当前的数值:
if(osSemaphoreRelease(myCountingSem01Handle)==osOK){
int count=osSemaphoreGetCount(myCountingSem01Handle);
printf("%d\n",count);}
计数信号量接收:
if(osSemaphoreWait(myCountingSem01Handle,osWaitForever)==osOK)
printf("get count\n");