国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

上海做公益活動(dòng)有哪些好的網(wǎng)站黑帽seo是什么意思

上海做公益活動(dòng)有哪些好的網(wǎng)站,黑帽seo是什么意思,建立網(wǎng)站的工具,長(zhǎng)沙網(wǎng)站建設(shè)公司文章目錄 一、事件組概念與操作1、事件組的概念2、事件組的操作 二、事件組函數(shù)1、創(chuàng)建2、刪除3、設(shè)置事件4、等待事件5、同步點(diǎn) 三、示例:廣播四、示例:等待一個(gè)任意事件五、示例: 等待多個(gè)事件都發(fā)生 學(xué)校組織秋游,組長(zhǎng)在等待: …

文章目錄

  • 一、事件組概念與操作
    • 1、事件組的概念
    • 2、事件組的操作
  • 二、事件組函數(shù)
    • 1、創(chuàng)建
    • 2、刪除
    • 3、設(shè)置事件
    • 4、等待事件
    • 5、同步點(diǎn)
  • 三、示例:廣播
  • 四、示例:等待一個(gè)任意事件
  • 五、示例: 等待多個(gè)事件都發(fā)生

學(xué)校組織秋游,組長(zhǎng)在等待:

  • 張三:我到了
  • 李四:我到了
  • 王五:我到了
  • 組長(zhǎng)說:好,大家都到齊了,出發(fā)!

秋游回來第二天就要提交一篇心得報(bào)告,組長(zhǎng)在焦急等待:張三、李四、王五誰(shuí)先寫好就交誰(shuí)的。

在這個(gè)日常生活場(chǎng)景中:

  • 出發(fā):要等待這3個(gè)人都到齊,他們是"與"的關(guān)系
  • 交報(bào)告:只需等待這3人中的任何一個(gè),他們是"或"的關(guān)系

在FreeRTOS中,可以使用事件組(event group)來解決這些問題。

本章涉及如下內(nèi)容:

  • 事件組的概念與操作函數(shù)
  • 事件組的優(yōu)缺點(diǎn)
  • 怎么設(shè)置、等待、清除事件組中的位
  • 使用事件組來同步多個(gè)任務(wù)

一、事件組概念與操作

1、事件組的概念

事件組可以簡(jiǎn)單地認(rèn)為就是一個(gè)整數(shù):

  • 每一位表示一個(gè)事件
  • 每一位事件的含義由程序員決定,比如:Bit0表示用來串口是否就緒,Bit1表示按鍵是否被按下
  • 這些位,值為1表示事件發(fā)生了,值為0表示事件沒發(fā)生
  • 一個(gè)或多個(gè)任務(wù)、ISR都可以去寫這些位;一個(gè)或多個(gè)任務(wù)、ISR都可以去讀這些位
  • 可以等待某一位、某些位中的任意一個(gè),也可以等待多位

image

事件組用一個(gè)整數(shù)來表示,其中的高8位留給內(nèi)核使用,只能用其他的位來表示事件。那么這個(gè)整數(shù)是多少位的?

  • 如果configUSE_16_BIT_TICKS是1,那么這個(gè)整數(shù)就是16位的,低8位用來表示事件
  • 如果configUSE_16_BIT_TICKS是0,那么這個(gè)整數(shù)就是32位的,低24位用來表示事件
  • 如果configUSE_16_BIT_TICKS是用來表示Tick Count的,怎么會(huì)影響事件組?這只是基于效率來考慮
  • 如果configUSE_16_BIT_TICKS是1,就表示該處理器使用16位更高效,所以事件組也使用16位
  • 如果configUSE_16_BIT_TICKS是0,就表示該處理器使用32位更高效,所以事件組也使用32位

2、事件組的操作

事件組和隊(duì)列、信號(hào)量等不太一樣,主要集中在2個(gè)地方:

  • 喚醒誰(shuí)?
    • 隊(duì)列、信號(hào)量:事件發(fā)生時(shí),只會(huì)喚醒一個(gè)任務(wù)
    • 事件組:事件發(fā)生時(shí),會(huì)喚醒所有符號(hào)條件的任務(wù),簡(jiǎn)單地說它有"廣播"的作用
  • 是否清除事件?
    • 隊(duì)列、信號(hào)量:是消耗型的資源,隊(duì)列的數(shù)據(jù)被讀走就沒了;信號(hào)量被獲取后就減少了
    • 事件組:被喚醒的任務(wù)有兩個(gè)選擇,可以讓事件保留不動(dòng),也可以清除事件

以上圖為列,事件組的常規(guī)操作如下:

  • 先創(chuàng)建事件組
  • 任務(wù)C、D等待事件:
    • 等待什么事件?可以等待某一位、某些位中的任意一個(gè),也可以等待多位。簡(jiǎn)單地說就是"或"、"與"的關(guān)系。
    • 得到事件時(shí),要不要清除?可選擇清除、不清除。
  • 任務(wù)A、B產(chǎn)生事件:設(shè)置事件組里的某一位、某些位

二、事件組函數(shù)

1、創(chuàng)建

使用事件組之前,要先創(chuàng)建,得到一個(gè)句柄;使用事件組時(shí),要使用句柄來表明使用哪個(gè)事件組。

有兩種創(chuàng)建方法:動(dòng)態(tài)分配內(nèi)存、靜態(tài)分配內(nèi)存。函數(shù)原型如下:

/* 創(chuàng)建一個(gè)事件組,返回它的句柄。* 此函數(shù)內(nèi)部會(huì)分配事件組結(jié)構(gòu)體 * 返回值: 返回句柄,非NULL表示成功*/
EventGroupHandle_t xEventGroupCreate( void );/* 創(chuàng)建一個(gè)事件組,返回它的句柄。* 此函數(shù)無需動(dòng)態(tài)分配內(nèi)存,所以需要先有一個(gè)StaticEventGroup_t結(jié)構(gòu)體,并傳入它的指針* 返回值: 返回句柄,非NULL表示成功*/
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer );

2、刪除

對(duì)于動(dòng)態(tài)創(chuàng)建的事件組,不再需要它們時(shí),可以刪除它們以回收內(nèi)存。

vEventGroupDelete可以用來刪除事件組,函數(shù)原型如下:

/** xEventGroup: 事件組句柄,你要?jiǎng)h除哪個(gè)事件組*/
void vEventGroupDelete( EventGroupHandle_t xEventGroup )

3、設(shè)置事件

可以設(shè)置事件組的某個(gè)位、某些位,使用的函數(shù)有2個(gè):

  • 在任務(wù)中使用xEventGroupSetBits()
  • 在ISR中使用xEventGroupSetBitsFromISR()

有一個(gè)或多個(gè)任務(wù)在等待事件,如果這些事件符合這些任務(wù)的期望,那么任務(wù)還會(huì)被喚醒。

函數(shù)原型如下:

/* 設(shè)置事件組中的位* xEventGroup: 哪個(gè)事件組* uxBitsToSet: 設(shè)置哪些位? *              如果uxBitsToSet的bitX, bitY為1, 那么事件組中的bitX, bitY被設(shè)置為1*               可以用來設(shè)置多個(gè)位,比如 0x15 就表示設(shè)置bit4, bit2, bit0* 返回值: 返回原來的事件值(沒什么意義, 因?yàn)楹芸赡芤呀?jīng)被其他任務(wù)修改了)*/
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet );/* 設(shè)置事件組中的位* xEventGroup: 哪個(gè)事件組* uxBitsToSet: 設(shè)置哪些位? *              如果uxBitsToSet的bitX, bitY為1, 那么事件組中的bitX, bitY被設(shè)置為1*               可以用來設(shè)置多個(gè)位,比如 0x15 就表示設(shè)置bit4, bit2, bit0* pxHigherPriorityTaskWoken: 有沒有導(dǎo)致更高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài)? pdTRUE-有, pdFALSE-沒有* 返回值: pdPASS-成功, pdFALSE-失敗*/
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,BaseType_t * pxHigherPriorityTaskWoken );

值得注意的是,ISR中的函數(shù),比如隊(duì)列函數(shù)xQueueSendToBackFromISR、信號(hào)量函數(shù)xSemaphoreGiveFromISR,它們會(huì)喚醒某個(gè)任務(wù),最多只會(huì)喚醒1個(gè)任務(wù)。

但是設(shè)置事件組時(shí),有可能導(dǎo)致多個(gè)任務(wù)被喚醒,這會(huì)帶來很大的不確定性。所以xEventGroupSetBitsFromISR函數(shù)不是直接去設(shè)置事件組,而是給一個(gè)FreeRTOS后臺(tái)任務(wù)(daemon task)發(fā)送隊(duì)列數(shù)據(jù),由這個(gè)任務(wù)來設(shè)置事件組。

如果后臺(tái)任務(wù)的優(yōu)先級(jí)比當(dāng)前被中斷的任務(wù)優(yōu)先級(jí)高,xEventGroupSetBitsFromISR會(huì)設(shè)置**pxHigherPriorityTaskWoken*為pdTRUE。

如果daemon task成功地把隊(duì)列數(shù)據(jù)發(fā)送給了后臺(tái)任務(wù),那么xEventGroupSetBitsFromISR的返回值就是pdPASS。

4、等待事件

使用xEventGroupWaitBits來等待事件,可以等待某一位、某些位中的任意一個(gè),也可以等待多位;等到期望的事件后,還可以清除某些位。

函數(shù)原型如下:

EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait );

先引入一個(gè)概念:unblock condition。一個(gè)任務(wù)在等待事件發(fā)生時(shí),它處于阻塞狀態(tài);當(dāng)期望的時(shí)間發(fā)生時(shí),這個(gè)狀態(tài)就叫"unblock condition",非阻塞條件,或稱為"非阻塞條件成立";當(dāng)"非阻塞條件成立"后,該任務(wù)就可以變?yōu)榫途w態(tài)

函數(shù)參數(shù)說明列表如下:

參數(shù)說明
xEventGroup等待哪個(gè)事件組?
uxBitsToWaitFor等待哪些位?哪些位要被測(cè)試?
xWaitForAllBits怎么測(cè)試?是"AND"還是"OR"?
pdTRUE: 等待的位,全部為1;
pdFALSE: 等待的位,某一個(gè)為1即可
xClearOnExit函數(shù)提出前是否要清除事件?
pdTRUE: 清除uxBitsToWaitFor指定的位
pdFALSE: 不清除
xTicksToWait如果期待的事件未發(fā)生,阻塞多久。
可以設(shè)置為0:判斷后即刻返回;
可設(shè)置為portMAX_DELAY:一定等到成功才返回;
可以設(shè)置為期望的Tick Count,一般用*pdMS_TO_TICKS()*把ms轉(zhuǎn)換為Tick Count
返回值返回的是事件值,
如果期待的事件發(fā)生了,返回的是"非阻塞條件成立"時(shí)的事件值;
如果是超時(shí)退出,返回的是超時(shí)時(shí)刻的事件值。

舉例如下:

事件組的值uxBitsToWaitForxWaitForAllBits說明
01000101pdTRUE任務(wù)期望bit0,bit2都為1,
當(dāng)前值只有bit2滿足,任務(wù)進(jìn)入阻塞態(tài);
當(dāng)事件組中bit0,bit2都為1時(shí)退出阻塞態(tài)
01000110pdFALSE任務(wù)期望bit1,bit2某一個(gè)為1, 當(dāng)前值滿足,所以任務(wù)成功退出
01000110pdTRUE任務(wù)期望bit1,bit2都為1,
當(dāng)前值不滿足,任務(wù)進(jìn)入阻塞態(tài);
當(dāng)事件組中bit1,bit2都為1時(shí)退出阻塞態(tài)

你可以使用*xEventGroupWaitBits()等待期望的事件,它發(fā)生之后再使用xEventGroupClearBits()*來清除。但是這兩個(gè)函數(shù)之間,有可能被其他任務(wù)或中斷搶占,它們可能會(huì)修改事件組。

可以使用設(shè)置xClearOnExit為pdTRUE,使得對(duì)事件組的測(cè)試、清零都在*xEventGroupWaitBits()*函數(shù)內(nèi)部完成,這是一個(gè)原子操作。

5、同步點(diǎn)

有一個(gè)事情需要多個(gè)任務(wù)協(xié)同,比如:

  • 任務(wù)A:炒菜
  • 任務(wù)B:買酒
  • 任務(wù)C:擺臺(tái)
  • A、B、C做好自己的事后,還要等別人做完;大家一起做完,才可開飯

使用*xEventGroupSync()*函數(shù)可以同步多個(gè)任務(wù):

  • 可以設(shè)置某位、某些位,表示自己做了什么事
  • 可以等待某位、某些位,表示要等等其他任務(wù)
  • 期望的時(shí)間發(fā)生后,*xEventGroupSync()*才會(huì)成功返回
  • xEventGroupSync成功返回后,會(huì)清除事件

xEventGroupSync函數(shù)原型如下:

EventBits_t xEventGroupSync(    EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait );

參數(shù)列表如下:

參數(shù)說明
xEventGroup哪個(gè)事件組?
uxBitsToSet要設(shè)置哪些事件?我完成了哪些事件?
比如0x05(二進(jìn)制為0101)會(huì)導(dǎo)致事件組的bit0,bit2被設(shè)置為1
uxBitsToWaitFor等待那個(gè)位、哪些位?
比如0x15(二級(jí)制10101),表示要等待bit0,bit2,bit4都為1
xTicksToWait如果期待的事件未發(fā)生,阻塞多久。
可以設(shè)置為0:判斷后即刻返回;
可設(shè)置為portMAX_DELAY:一定等到成功才返回;
可以設(shè)置為期望的Tick Count,一般用*pdMS_TO_TICKS()*把ms轉(zhuǎn)換為Tick Count
返回值返回的是事件值,
如果期待的事件發(fā)生了,返回的是"非阻塞條件成立"時(shí)的事件值;
如果是超時(shí)退出,返回的是超時(shí)時(shí)刻的事件值。

三、示例:廣播

本節(jié)代碼為:23_eventgroup_broadcast,主要看nwatch\game2.c。

car1運(yùn)行到終點(diǎn)后,會(huì)設(shè)置bit0事件;car2、car3都等待bit0事件。car1設(shè)置bit0事件時(shí),會(huì)通知到car2、car3,這就是一個(gè)廣播作用。

創(chuàng)建事件組,代碼如下:

void car_game(void)
{int i,j;int x;g_framebuffer = LCD_GetFrameBuffer(&g_xres, &g_yres, &g_bpp);draw_init();draw_end();xEventCar = xEventGroupCreate();//創(chuàng)建事件組/* 繪制路標(biāo)	*/for(i=0;i<3;i++){for(j=0;j<8;j++){draw_bitmap(16*j, 16+17*i, roadMarking, 8, 1, NOINVERT, 0);draw_flushArea(16*j, 16+17*i, 8, 1);		}}#if 0/* 顯示三輛小車 */for(i=0;i<3;i++){draw_bitmap(cars[i].x, cars[i].y, carImg, 15, 16, NOINVERT, 0);draw_flushArea(cars[i].x, cars[i].y, 15, 16);	}
#endifxTaskCreate(car1_task, "car1task", 128, &cars[0], osPriorityNormal, NULL);	xTaskCreate(car2_task, "car2task", 128, &cars[1], osPriorityNormal+2, NULL);	xTaskCreate(car3_task, "car3task", 128, &cars[2], osPriorityNormal+2, NULL);	//car2和car3優(yōu)先級(jí)一樣后 car1到達(dá)最右邊后設(shè)置事件組 car2和car3得到事件組后一起運(yùn)行 若優(yōu)先級(jí)不同 則優(yōu)先級(jí)高的先運(yùn)行 到最右邊后再到另一個(gè)運(yùn)行
}

car2等待事件,代碼如下:

void car2_task(void *params)
{struct car *car = params;struct ir_Data idata;/* 創(chuàng)建自己的隊(duì)列 */QueueHandle_t xQueueIR = xQueueCreate(10,sizeof(struct ir_Data));/* 注冊(cè)隊(duì)列 */RegisterQueueHandle(xQueueIR);/* 初始化小車 */ShowCar(car);/* 等待bit0事件 */xEventGroupWaitBits(xEventCar,(1<<0),pdTRUE,pdFALSE,portMAX_DELAY);while(1){
//		/* 讀取按鍵值  */
//		xQueueReceive(xQueueIR,&idata,portMAX_DELAY);//		/* 控制汽車往右移動(dòng) */
//		if(idata.data == car->control_key)
//		{if(car->x < g_xres - CAR_LENGTH){/* 隱藏汽車 */HideCar(car);/* 調(diào)整位置 */car->x += 1	;//每次按下右移5個(gè)單位if(car->x > g_xres - CAR_LENGTH)//超過屏幕分辨率(128)car->x = g_xres - CAR_LENGTH;//到達(dá)最大位置處/* 重新顯示汽車 */ShowCar(car);/* 這里的delay函數(shù)主要是小車的顯示延時(shí)頻率 調(diào)用vTaskDelay為阻塞狀態(tài) 會(huì)卡死等待 當(dāng)執(zhí)行到調(diào)用vTaskDelay的任務(wù)時(shí) 其他任務(wù)能正常運(yùn)行 調(diào)用mdelay則會(huì)占用CPU資源 當(dāng)執(zhí)行調(diào)用mdelay的任務(wù)時(shí) 其他低優(yōu)先級(jí)任務(wù)無法得以運(yùn)行*///vTaskDelay(50);mdelay(50 );if(car->x == g_xres - CAR_LENGTH){/* 汽車到達(dá)最右邊 釋放信號(hào)量 *///xSemaphoreGive(xSemTicks);//car2沒有獲取信號(hào)量 所以當(dāng)其運(yùn)行完畢自殺后car1繼續(xù)運(yùn)行vTaskDelete(NULL);}}
//		}}
}

car3等待事件,代碼如下:

void car3_task(void *params)
{struct car *car = params;struct ir_Data idata;/* 創(chuàng)建自己的隊(duì)列 */QueueHandle_t xQueueIR = xQueueCreate(10,sizeof(struct ir_Data));/* 注冊(cè)隊(duì)列 */RegisterQueueHandle(xQueueIR);/* 初始化小車 */ShowCar(car);/* 等待bit0事件 */xEventGroupWaitBits(xEventCar,(1<<0),pdTRUE,pdFALSE,portMAX_DELAY);while(1){
//		/* 讀取按鍵值  */
//		xQueueReceive(xQueueIR,&idata,portMAX_DELAY);//		/* 控制汽車往右移動(dòng) */
//		if(idata.data == car->control_key)
//		{if(car->x < g_xres - CAR_LENGTH){/* 隱藏汽車 */HideCar(car);/* 調(diào)整位置 */car->x += 1	;//每次按下右移5個(gè)單位if(car->x > g_xres - CAR_LENGTH)//超過屏幕分辨率(128)car->x = g_xres - CAR_LENGTH;//到達(dá)最大位置處/* 重新顯示汽車 */ShowCar(car);//vTaskDelay(50);mdelay(50 );if(car->x == g_xres - CAR_LENGTH){/* 汽車到達(dá)最右邊 釋放信號(hào)量 *///xSemaphoreGive(xSemTicks);vTaskDelete(NULL);}}
//		}}
}

car1運(yùn)行到終點(diǎn)后,設(shè)置事件,代碼如下:

void car1_task(void *params)
{struct car *car = params;struct ir_Data idata;/* 創(chuàng)建自己的隊(duì)列 */QueueHandle_t xQueueIR = xQueueCreate(10,sizeof(struct ir_Data));/* 注冊(cè)隊(duì)列 */RegisterQueueHandle(xQueueIR);/* 初始化小車 */ShowCar(car);while(1){
//		/* 讀取按鍵值  */
//		xQueueReceive(xQueueIR,&idata,portMAX_DELAY);//		/* 控制汽車往右移動(dòng) */
//		if(idata.data == car->control_key)
//		{if(car->x < g_xres - CAR_LENGTH){/* 隱藏汽車 */HideCar(car);/* 調(diào)整位置 */car->x += 1	;//每次按下右移5個(gè)單位if(car->x > g_xres - CAR_LENGTH)//超過屏幕分辨率(128)car->x = g_xres - CAR_LENGTH;//到達(dá)最大位置處/* 重新顯示汽車 */ShowCar(car);vTaskDelay(50);if(car->x == g_xres - CAR_LENGTH){/* 汽車到達(dá)最右邊 釋放信號(hào)量 *///xSemaphoreGive(xSemTicks);/* 設(shè)置bit0 事件組 */xEventGroupSetBits(xEventCar,(1<<0));vTaskDelete(NULL);}}
//		}}
}

實(shí)驗(yàn)現(xiàn)象:car1運(yùn)行到終點(diǎn)后,car2、car3同時(shí)啟動(dòng)。

四、示例:等待一個(gè)任意事件

本節(jié)代碼為:24_eventgroup_or,主要看nwatch\game2.c。

car1運(yùn)行到終點(diǎn)后,會(huì)設(shè)置bit0事件;car2運(yùn)行到終點(diǎn)后,會(huì)設(shè)置bit1事件;car3等待bit0、bit1的任意一個(gè)事件

car1運(yùn)行到終點(diǎn)后,設(shè)置事件,代碼如下:

car1運(yùn)行到終點(diǎn)后,設(shè)置事件,代碼如下:

void car1_task(void *params)
{struct car *car = params;struct ir_Data idata;/* 創(chuàng)建自己的隊(duì)列 */QueueHandle_t xQueueIR = xQueueCreate(10,sizeof(struct ir_Data));/* 注冊(cè)隊(duì)列 */RegisterQueueHandle(xQueueIR);/* 初始化小車 */ShowCar(car);/* 獲得信號(hào)量 *///xSemaphoreTake(xSemTicks,portMAX_DELAY);//car1獲得信號(hào)量開始運(yùn)行while(1){
//		/* 讀取按鍵值  */
//		xQueueReceive(xQueueIR,&idata,portMAX_DELAY);//		/* 控制汽車往右移動(dòng) */
//		if(idata.data == car->control_key)
//		{if(car->x < g_xres - CAR_LENGTH){/* 隱藏汽車 */HideCar(car);/* 調(diào)整位置 */car->x += 1	;//每次按下右移5個(gè)單位if(car->x > g_xres - CAR_LENGTH)//超過屏幕分辨率(128)car->x = g_xres - CAR_LENGTH;//到達(dá)最大位置處/* 重新顯示汽車 */ShowCar(car);vTaskDelay(50);//50ms后開始運(yùn)行if(car->x == g_xres - CAR_LENGTH){/* 汽車到達(dá)最右邊 釋放信號(hào)量 *///xSemaphoreGive(xSemTicks);/* 設(shè)置bit0 事件組 */xEventGroupSetBits(xEventCar,(1<<0));vTaskDelete(NULL);}}
//		}}
}

car2等待事件,代碼如下:

void car2_task(void *params)
{struct car *car = params;struct ir_Data idata;/* 創(chuàng)建自己的隊(duì)列 */QueueHandle_t xQueueIR = xQueueCreate(10,sizeof(struct ir_Data));/* 注冊(cè)隊(duì)列 */RegisterQueueHandle(xQueueIR);/* 初始化小車 */ShowCar(car);/* 獲得信號(hào)量 *///xSemaphoreTake(xSemTicks,portMAX_DELAY);/* 等待bit0事件 */
//	xEventGroupWaitBits(xEventCar,(1<<0),pdTRUE,pdFALSE,portMAX_DELAY);while(1){
//		/* 讀取按鍵值  */
//		xQueueReceive(xQueueIR,&idata,portMAX_DELAY);//		/* 控制汽車往右移動(dòng) */
//		if(idata.data == car->control_key)
//		{if(car->x < g_xres - CAR_LENGTH){/* 隱藏汽車 */HideCar(car);/* 調(diào)整位置 */car->x += 1	;//每次按下右移5個(gè)單位if(car->x > g_xres - CAR_LENGTH)//超過屏幕分辨率(128)car->x = g_xres - CAR_LENGTH;//到達(dá)最大位置處/* 重新顯示汽車 */ShowCar(car);vTaskDelay(20);//20ms后開始運(yùn)行//mdelay(50 );if(car->x == g_xres - CAR_LENGTH){/* 汽車到達(dá)最右邊 釋放信號(hào)量 *///xSemaphoreGive(xSemTicks);//car2沒有獲取信號(hào)量 所以當(dāng)其運(yùn)行完畢自殺后car1繼續(xù)運(yùn)行/* 設(shè)置bit1 事件組 */xEventGroupSetBits(xEventCar,(1<<1));vTaskDelete(NULL);}}
//		}}
}

car3等待bit0、bit1事件,實(shí)驗(yàn)“或”的關(guān)系(倒數(shù)第2個(gè)參數(shù)),代碼如下:

void car3_task(void *params)
{struct car *car = params;struct ir_Data idata;/* 創(chuàng)建自己的隊(duì)列 */QueueHandle_t xQueueIR = xQueueCreate(10,sizeof(struct ir_Data));/* 注冊(cè)隊(duì)列 */RegisterQueueHandle(xQueueIR);/* 初始化小車 */ShowCar(car);/* 獲得信號(hào)量 *///xSemaphoreTake(xSemTicks,portMAX_DELAY);/* 等待bit0 or bit1事件(or或者and取決于第四個(gè)參數(shù) pdFLASE為or pdTRUE為and) *//* 若這里是or 當(dāng)car1先到時(shí)釋放事件bit0 此時(shí)car3等到事件組則開始運(yùn)行 car2停止運(yùn)行 直到car3運(yùn)行完畢 才到car2繼續(xù)運(yùn)行 *//* 若這里是and 必須car1和car2運(yùn)行完畢釋放bit哦和bit1事件后car3才能運(yùn)行	*/xEventGroupWaitBits(xEventCar,(1<<0)|(1<<1),pdTRUE,pdTRUE,portMAX_DELAY);while(1){
//		/* 讀取按鍵值  */
//		xQueueReceive(xQueueIR,&idata,portMAX_DELAY);//		/* 控制汽車往右移動(dòng) */
//		if(idata.data == car->control_key)
//		{if(car->x < g_xres - CAR_LENGTH){/* 隱藏汽車 */HideCar(car);/* 調(diào)整位置 */car->x += 1	;//每次按下右移5個(gè)單位if(car->x > g_xres - CAR_LENGTH)//超過屏幕分辨率(128)car->x = g_xres - CAR_LENGTH;//到達(dá)最大位置處/* 重新顯示汽車 */ShowCar(car);//vTaskDelay(50);mdelay(50 );if(car->x == g_xres - CAR_LENGTH){/* 汽車到達(dá)最右邊 釋放信號(hào)量 *///xSemaphoreGive(xSemTicks);vTaskDelete(NULL);}}
//		}}
}

五、示例: 等待多個(gè)事件都發(fā)生

本節(jié)代碼為:25_eventgroup_and,主要看nwatch\game2.c。

使用遙控器控制car1、car2。car1運(yùn)行到終點(diǎn)后,會(huì)設(shè)置bit0事件;car2運(yùn)行到終點(diǎn)后,會(huì)設(shè)置bit1事件;car3等待bit0、bit1的所有事件

跟24_eventgroup_or相比,只是car3的代碼發(fā)生了變化。car3等待bit0、bit1事件,實(shí)驗(yàn)“與”的關(guān)系(倒數(shù)第2個(gè)參數(shù)),代碼如下:

225     /* 等待事件:bit0 or bit1 */
226     xEventGroupWaitBits(g_xEventCar, (1<<0)|(1<<1), pdTRUE, pdTRUE, portMAX_DELAY);

實(shí)驗(yàn)現(xiàn)象:實(shí)驗(yàn)遙控器的1、2控制car1、car2,它們都到達(dá)終點(diǎn)后,car3才會(huì)啟動(dòng)。

http://aloenet.com.cn/news/30137.html

相關(guān)文章:

  • 公司網(wǎng)站域名做郵箱自己做網(wǎng)站設(shè)計(jì)制作
  • 網(wǎng)站建設(shè)情況的報(bào)告國(guó)外引流推廣軟件
  • 北京h5網(wǎng)站建設(shè)報(bào)價(jià)網(wǎng)絡(luò)推廣合作協(xié)議范本
  • html入門視頻教程鄭州seo推廣優(yōu)化
  • 廈門網(wǎng)站建設(shè)培訓(xùn)百度推廣開戶多少錢
  • 找人做網(wǎng)站需要注意什么跨境電商靠譜嗎
  • 做爰網(wǎng)站下載免費(fèi)網(wǎng)頁(yè)制作模板
  • 如何說服老板做網(wǎng)站營(yíng)銷策劃書案例
  • app軟件設(shè)計(jì)鄭州seo排名優(yōu)化公司
  • 遵義公司網(wǎng)站制作哪家好百度推廣登錄首頁(yè)網(wǎng)址
  • 如何將網(wǎng)站指向404微信5000人接推廣費(fèi)用
  • 網(wǎng)站如何做促銷活動(dòng)推廣引流話術(shù)
  • 山東網(wǎng)站建設(shè)公司武漢做seo公司
  • 網(wǎng)站建設(shè)歸工商局管還是工信局管查關(guān)鍵詞排名軟件
  • 代做網(wǎng)站排名谷歌優(yōu)化推廣
  • 網(wǎng)站建設(shè)哪家最專業(yè)長(zhǎng)沙網(wǎng)絡(luò)營(yíng)銷學(xué)校
  • 定制開發(fā)app到底要多少錢百度搜索引擎優(yōu)化指南最新版
  • 南海網(wǎng)站建設(shè)公司蘇州網(wǎng)站優(yōu)化排名推廣
  • 怎么查看網(wǎng)站收錄東營(yíng)seo
  • 哪個(gè)新聞網(wǎng)站好友情鏈接是啥意思
  • 做美工一般要收藏哪些網(wǎng)站友情鏈接軟件
  • wordpress tag 收錄肇慶seo按天收費(fèi)
  • 衡水企業(yè)做網(wǎng)站多少錢使用百度地圖導(dǎo)航收費(fèi)嗎
  • 長(zhǎng)沙銘萬(wàn)做網(wǎng)站上海網(wǎng)站快速排名優(yōu)化
  • 服裝廠網(wǎng)站模板營(yíng)銷策劃公司名稱
  • 網(wǎng)站公安備案多久審核app推廣兼職是詐騙嗎
  • 廣州互聯(lián)網(wǎng)項(xiàng)目工作室seo外包公司怎么樣
  • h5網(wǎng)站建設(shè)的具體內(nèi)容企業(yè)營(yíng)銷網(wǎng)站
  • 上海網(wǎng)站建設(shè)管理推廣的渠道和方法有哪些
  • 鄭州建設(shè)企業(yè)網(wǎng)站百度一下 你就知道官方