大家好,今天主要和大家聊一聊,如何利用HarmonyOS系統中事件标志。
目錄
第一:事件标志簡介
第二:事件标志API分析
第三:軟體設計
第四:編譯與調試
第五:運作結果
第一:事件标志簡介
每個事件标志由一個位表示,每個事件标志按照32個位元組為一組的形式排列,線程可以同時對組中的所有32個事件标記執行操作。
第二:事件标志API分析
osEventFlagsNew()
osEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)
功能描述:
osEventFlagsNew函數建立了一個新的事件标志對象,用于跨線程發送事件,并傳回事件标志對象辨別符的指針,或者在出現錯誤時傳回NULL。可以在RTOS啟動(調用osKernelStart)之前安全地調用該函數,但不能在核心初始化(調用osKernellnitialize)之前調用該函數。
注意:不能在中斷服務函數中調用。
參數:
名字 | 描述 |
attr | 事件标志屬性;空:預設值. |
osEventFlagsSet()
uint32_t osEventFlagsSet(osEventFlagsId_t ef_id,uint32_t flags)
功能描述:osEventFlagsSet函數在一個由參數ef_id指定的事件标記對象中設定由參數flags指定的事件标記。
注意:不能在中斷服務中調用該函數
參數:
名字 | 描述 |
ef_id | 事件标志由osEventFlagsNew獲得的ID. |
flags | 指定設定的标志. |
osEventFlagsWait()
uint32_t osEventFlagsWait(osEventFlagsId_t ef_id,uint32_t flags,uint32_t options,uint32_t timeout)
功能描述:osEventFlagsWait函數挂起目前運作線程,直到設定了由參數ef_id指定的事件對象中的任何或所有由參數flags指定的事件标志。當這些事件标志被設定,函數立即傳回。否則,線程将被置于阻塞狀态。
注意 :如果參數timeout設定為0,可以從中斷服務例程調用
參數:
名字 | 描述 |
ef_id | 事件标志由osEventFlagsNew獲得的ID. |
flags | 指定要等待的标志. |
options | 指定标記選項. |
timeout | 逾時時間,0表示不逾時 |
第三:軟體設計
在Event_example函數中,通過osEventFlagsNew()函數建立了事件标記ID,Thread_EventReceiver()函數中通過osEventFlagsWait()函數一直将線程置于阻塞狀态,等待事件标記。在Thread_EventSender()函數中通過osEventFlagsSet()函數每隔1S設定的标志,實作任務間的同步。
void Thread_EventSender (void *argument)
{
(void)argument;
while (1)
{
osEventFlagsSet(evt_id, FLAGS_MSK1);
osThreadYield(); // suspend thread
osDelay(100);
}
}
void Thread_EventReceiver (void *argument)
{
(void)argument;
uint32_t flags;
while (1)
{
flags = osEventFlagsWait(evt_id, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);
printf("Receive Flags is %d\n",flags);
}
}
static void Event_example (void)
{
evt_id = osEventFlagsNew(NULL);
if (evt_id == NULL) {
printf("Falied to create EventFlags!\n");
}
osThreadAttr_t attr;
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024*4;
attr.priority = 25;
attr.name = "Thread_EventSender";
if (osThreadNew(Thread_EventSender, NULL, &attr) == NULL) {
printf("Falied to create Thread_EventSender!\n");
}
attr.name = "Thread_EventReceiver";
if (osThreadNew(Thread_EventReceiver, NULL, &attr) == NULL) {
printf("Falied to create Thread_EventReceiver!\n");
}
}
第四:編譯與調試
#"A1_kernal_thread:thread_example",
#"A2_kernel_timer:timer_example",
"A3_kernel_event:event_example",
#"A4_kernel_mutex:mutex_example",
#"A5_kernel_semaphore:semaphore_example",
#"A6_kernel_message:message_example",
第五:運作結果
Receive Flags is 1
Receive Flags is 1
Receive Flags is 1
Receive Flags is 1
Receive Flags is 1