5-事件组&任务通知

获取某个事件

获取若干事件中的某个事件

获取若干事件中的全部事件

!!!!不可获得若干事件中的几个事件

创建事件组,设置事件,等待事件

static EventGroupHandle_t xEventGroupCalc;
/* 创建事件组 */
xEventGroupCalc = xEventGroupCreate();
xEventGroupSetBits(xEventGroupCalc, (1<<0));

xEventGroupWaitBits(xEventGroupCalc, (1<<0)|(1<<1), pdTRUE, pdTRUE, portMAX_DELAY);
        //哪个组,等待哪些事件,返回前是否清除事件,是否要等待前面设置的所有事件【否的话当一个来的时候就处理】,不满足的话等多久

同步点: ABC三个任务需要全部都完成才算完成,才能走下一步

 a<<4 指把a的各二进位向左移动4位

#define TABLE    (1<<0)
#define BUYING   (1<<1)
#define COOKING  (1<<2)
#define ALL      (TABLE | BUYING | COOKING)
/* 表示我做好了, 还要等别人都做好 */
xEventGroupSync(xEventGroup, COOKING, ALL, portMAX_DELAY);
(哪个时间组,我做的什么事件,需要等哪些事件,等多久)
static void vCookingTask( void *pvParameters )
{
    const TickType_t xTicksToWait = pdMS_TO_TICKS( 100UL );        
    int i = 0;
    
    /* 无限循环 */
    for( ;; )
    {
        /* 做自己的事 */
        printf("%s is cooking %d time....\r\n", (char *)pvParameters, i);
        
        /* 表示我做好了, 还要等别人都做好 */
        xEventGroupSync(xEventGroup, COOKING, ALL, portMAX_DELAY);
    
        /* 别人也做好了, 开饭 */
        printf("%s is eating %d time....\r\n", (char *)pvParameters, i++);
        vTaskDelay(xTicksToWait);
    }
}
View Code

事件组起通知作用,数据的保存还需要你另外想办法,比如使用队列

 

任务通知

使用任务通知时,就是“通知任务”,目标明确。发送者.接收者是多对1的关系。

 

左侧的两个任务发通知(都不等待【因为不像队列那样有等待的链表】)给右边的任务(等待),右边任务的TCB控制块里面有别的任务通知的值,也有自己的状态,

当接收到通知的值时,改变状态值,返回

没有收到通知时,可以等待

 简易使用

xTaskNotifyGive(xHandleTask2);
//让Task2 TCB控制块 里面的value++

val = ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
//获取TCB里面的value值,pdTRUE返回时使value=0,pdFALSE使value--(都不影响返回的value)
//使value=0  只能take1次,然后’阻塞‘,相反使用-- 能take N次
 

 

 12-1未完待续

 3的取值有

 

 有多次通知时,是否覆盖之前的通知(不覆盖的话,发送数据不成功) 具体见后文的【任务通知-轻量型队列】

4在函数入口处清除几个位

5在函数出口处清除几个位,设置为0则不清除

6     *pul=value在出口被清除前的value,就是别人发消息附带的值

 

实操: 对于信号量发送次数与接收次数对应, 那对于任务通知的话,是如何对应的呢

 

 

任务通知-轻量型队列

问题:那两个参数如何使用呢

 

 任务通知-轻量级事件组

之前的事件组是改变了某些位,当满足条件时,目标任务才能被唤醒

而任务通知则时,只要任务通知的时候设置了某些位,不管满不满足条件,都会唤醒目标任务

 

不同的任务通知,可以设置相同的任务TCB里面的VALUE

 

 12-4OVER

 

posted @ 2023-09-17 12:15  磕伴  阅读(43)  评论(0编辑  收藏  举报