天天看點

HarmonyOS系統核心中使用事件标志的方法

      大家好,今天主要和大家聊一聊,如何利用HarmonyOS系統中事件标志。

目錄

​​第一:事件标志簡介​​

​​第二:事件标志API分析​​

​​第三:軟體設計​​

​​第四:編譯與調試​​

​​第五:運作結果​​

HarmonyOS系統核心中使用事件标志的方法

第一:事件标志簡介

      每個事件标志由一個位表示,每個事件标志按照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      

繼續閱讀