本文是笔者在学习 正点原子官方 的《【正点原子】手把手教你学FreeRTOS实时系统》系列视频时整理的笔记。
视频讲解清晰透彻,非常感谢UP主的无私奉献!原课程链接如下:
👉 B站视频链接:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili
目录
1、目的
2、核心代码
3、结果
1、目的
2、核心代码
①包含信号量的头文件
②创建二值信号量
③任务1和任务2的功能编写
信号量的代码编写与队列的很类似。
//任务一:释放二值信号量
void task1( void * pvParameters )
{u8 key;BaseType_t err;while(1){key = KEY_Scan(0);if(key == KEY0_PRES){err = xSemaphoreGive(semphore_handle);if(err == pdPASS){printf("信号量释放成功!\r\n");}else{printf("信号量释放失败!\r\n");}}vTaskDelay(10);}
}//任务二:获取二值信号量
void task2( void * pvParameters )
{BaseType_t err;while(1){err = xSemaphoreTake(semphore_handle,portMAX_DELAY);//获取信号量并死等if(err == pdPASS){printf("获取信号量成功!!\r\n");}else{printf("获取信号量失败!!\r\n");}}
}
3、结果
串口输出结果如下:
为什么串口中输出打印“获取信号量成功”比“信号量释放成功”排在前面呢?
因为任务二的优先级比任务一的高,任务二中如果一直获取不到信号量就会一直死等,跳转到任务一,一但KEY0按键按下,就会立刻释放信号量,释放完之后还没来得及打印就会被任务二抢占,因此是等到任务二的输出打印后任务一才开始输出打印,但是实际上是还是先释放后获取信号量的。