一.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