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); } }
事件组起通知作用,数据的保存还需要你另外想办法,比如使用队列
任务通知
使用任务通知时,就是“通知任务”,目标明确。发送者.接收者是多对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