STM32CubeMx(STM32F4 +FreeRTOS+CMSIS-RTOS)之線程(thread)創建

一.CMISIS-RTOS中thread相關API概覽

   

模塊 宏定義 描述
線程定義 osThreadDef 定義一個線程
osThread 訪問一個線程定義

 

模塊 API 描述

線程管理:

定義,創建和控制線程

osThreadCreate 開始執行一個線程
osThreadTerminate 停止線程的運行
osThreadYield 運行處於就緒態的線程
osThreadGetId 獲取線程的ID
osThreadSetPriority 改變線程運行的優先級
osThreadGetPriority 獲取線程的優先級

 

優先級(priority)相關枚舉:

typedef enum  {
  osPriorityIdle          = -3,          ///< priority: idle (lowest)
  osPriorityLow           = -2,          ///< priority: low
  osPriorityBelowNormal   = -1,          ///< priority: below normal
  osPriorityNormal        =  0,          ///< priority: normal (default)
  osPriorityAboveNormal   = +1,          ///< priority: above normal
  osPriorityHigh          = +2,          ///< priority: high
  osPriorityRealtime      = +3,          ///< priority: realtime (highest)
  osPriorityError         =  0x84        ///< system cannot determine priority or thread has illegal priority
} osPriority;

 

二.線程創建並執行

在STM32CubMx下,已經自動生成了一個線程,可以看看其定義

                    

MX_FREERTOS_Init()在freertos.c的文件中,

osThreadDef參數含義: 

//#define osThreadDef	(名字(該線程的名字),線程函數名,優先級,該線程可以實例化的個數,線程的棧大小 )

 



void MX_FREERTOS_Init(void) {

  /* Create the thread(s) */
  /* definition and creation of deviceTask*/
  osThreadDef(deviceTask, StartDefaultTask, osPriorityNormal, 0, STACKSIZE);
  defaultTaskHandle = osThreadCreate(osThread(deviceTask), NULL);


}
//線程函數
void StartDefaultTask(void const * argument)
{

  /* USER CODE BEGIN StartDeviceTask */
   /* Infinite loop */
  for(;;)
 {
 
 }
  /* USER CODE END StartDeviceTask */
}

          現在就可以在無限循環中,添加自己的應用了         

 

三.LED閃爍 

創建一個LED線程(修改默認的線程)

  osThreadDef(ledThreadHandler, ledThread, osPriorityNormal, 0, STACKSIZE);
  this->led_thread = osThreadCreate(osThread(ledThreadHandler), NULL);

在LED線程中

void startLedTask(void const * argument)
{
    led_t led0 , led1;
    led0 = led_get_instance(LED_ID0);
    led1 = led_get_instance(LED_ID1);
   for(;;)
   {
        led_on(led0); 
        led_off(led1);
        osDelay(1000); 
        led_off(led0);
        led_on(led1);
        osDelay(1000);       
   }
}

 這樣LED閃爍應用就完成了(代碼已上傳)

ref:

file:///D:/Keil_v5/ARM/PACK/ARM/CMSIS/4.2.0/CMSIS/Documentation/RTOS/html/group___c_m_s_i_s___r_t_o_s___thread_mgmt.html#ga7f2b42f1983b9107775ec2a1c69a849a

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章