这里将会总结一些我在FreeRTOS中遇到的问题,将不定时更新
=========================================================================
有关二值信号量实验中遇到的问题
xSemaphoreTake()函数用于获取信号量
我们先来看Receive_Task和Send_Task这两个函数:
static void Receive_Task(void* parameter)
{
BaseType_t xReturn = pdTRUE;//定义一个创建信息返回值,默认为pdTURE
while(1)
{
xReturn = xSemaphoreTake(BinarySem_Handle,//二值信号量句柄
portMAX_DELAY);//一直等
/*这里如何理解呢,这个接收任务正在上面这条语句其实是一直是阻塞态
*只有当检测到有效的信号量时,才会变成就绪,然后执行循环
*/
//把接收到的消息存到r_queue中
if(pdTRUE == xReturn)
printf("BinarySem_Handle 二值信号量获取成功!\n\n");
else
printf("123456");
toggleLED_G();
}
}
static void Send_Task(void* parameter)
{
BaseType_t xReturn = pdPASS;//定义一个创建信息返回值,默认为pdPASS
while(1)
{
if( Key_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN) == KEY_ON)
{
xReturn = xSemaphoreGive( BinarySem_Handle );//给出二值信号量
if(xReturn == pdPASS)
printf("BinarySem_Handle 二值信号量释放成功!\r\n");
else
printf("BinarySem_Handle 二值信号量释放失败!\r\n");
}
vTaskDelay(20);/* 延时 20 个 tick */
}
}
在学习中我遇到的困惑是,如果没有获取到有效信号,那么Receive_Task这个任务还怎么进到while(1)中来执行xSemaphoreTake()函数,在仔细阅读后教材后,发现自己的问题非常的愚蠢,这里列出正确的执行流程:
Receive_Task会先执行xSemaphoreTake()函数,由于此时按键还没有按下,因此必然没有有效信号量,此时,Receive_Task会进入阻塞态,直到他接收到有效信号量。
2022.5.6
=========================================================================