STM32 CubeMX Freertos
前言
學(xué)習(xí)使用Freertos第一步
FreeRTOS 任務(wù)管理,您需要掌握以下幾個(gè)關(guān)鍵函數(shù):
1. xTaskCreate()
:用于創(chuàng)建一個(gè)任務(wù),需要指定任務(wù)函數(shù)、任務(wù)名稱、任務(wù)棧大小和優(yōu)先級(jí)等參數(shù)。
2. vTaskDelete()
:用于刪除一個(gè)任務(wù),可以由任務(wù)自身或其他任務(wù)調(diào)用。
3. vTaskDelay()
:用于使當(dāng)前任務(wù)進(jìn)入阻塞狀態(tài),延遲一段時(shí)間后再繼續(xù)執(zhí)行。
4. vTaskDelayUntil()
:類似于vTaskDelay(),但是可以實(shí)現(xiàn)周期性的延遲,使任務(wù)按照指定的時(shí)間間隔執(zhí)行。
5. vTaskSuspend()和vTaskResume()
:用于暫停和恢復(fù)一個(gè)任務(wù)的執(zhí)行,暫停后的任務(wù)將不會(huì)被調(diào)度執(zhí)行。
6. xTaskResumeFromISR()
:在中斷服務(wù)程序中恢復(fù)一個(gè)被掛起(暫停)的任務(wù)。
7. uxTaskPriorityGet()和vTaskPrioritySet()
:用于獲取和設(shè)置任務(wù)的優(yōu)先級(jí)。
8. uxTaskGetStackHighWaterMark()
:用于獲取任務(wù)棧的剩余可用空間大小,可以用來(lái)檢查任務(wù)是否使用了過(guò)多的??臻g。
一、STM32 CubeMX 配置
時(shí)鐘樹(shù)配置
HAL時(shí)基選擇TIM1(不要選擇滴答定時(shí)器;滴答定時(shí)器留給OS系統(tǒng)做時(shí)基)
使能串口,用于用于檢查實(shí)驗(yàn)現(xiàn)象
使用STM32 CubeMX 庫(kù),配置Freertos
選擇CMISS_V1接口就可以滿足Freertos接口;且代碼量比CMISS_V2?。–MISS_V2支持更多的RTOS接口,所以代碼量比CMISS_V1多)
創(chuàng)建任務(wù)
二、實(shí)驗(yàn)一:創(chuàng)建兩個(gè)任務(wù),LED閃爍
代碼如下(示例):
void LED1Task(void const * argument)
{
/* USER CODE BEGIN LED1Task */
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
printf("LED滅\r\n"); // printf輸出字符串
osDelay(1000);
}
/* USER CODE END LED1Task */
}
/* USER CODE BEGIN Header_LED2Task */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{
/* USER CODE BEGIN LED2Task */
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
printf("LED亮\r\n"); // printf輸出字符串
osDelay(2000);
}
/* USER CODE END LED2Task */
}
實(shí)驗(yàn)現(xiàn)象
使用 vTaskDelayUntil()絕對(duì)延時(shí)
使能 vTaskDelayUntil函數(shù)
void LED1Task(void const * argument)
{
/* USER CODE BEGIN LED1Task */
TickType_t xlaswketime;
xlaswketime = xTaskGetTickCount();//獲取進(jìn)入的時(shí)間
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
printf("LED滅\r\n"); // printf輸出字符串
vTaskDelayUntil(&xlaswketime,1000);
}
/* USER CODE END LED1Task */
}
/* USER CODE BEGIN Header_LED2Task */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{
/* USER CODE BEGIN LED2Task */
TickType_t xlaswketime;
xlaswketime = xTaskGetTickCount();//獲取進(jìn)入的時(shí)間
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
printf("LED亮\r\n"); // printf輸出字符串
vTaskDelayUntil(&xlaswketime,2000);
}
/* USER CODE END LED2Task */
}
#
三,實(shí)驗(yàn)二:刪除LED1任務(wù)和自身任務(wù)
/* USER CODE END Header_LED1Task */
void LED1Task(void const * argument)
{
/* USER CODE BEGIN LED1Task */
TickType_t xlaswketime;
xlaswketime = xTaskGetTickCount();//獲取進(jìn)入的時(shí)間
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
vTaskDelayUntil(&xlaswketime,500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
vTaskDelayUntil(&xlaswketime,500);
}
/* USER CODE END LED1Task */
}
/* USER CODE BEGIN Header_LED2Task */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{
/* USER CODE BEGIN LED2Task */
TickType_t xlaswketime;
xlaswketime = xTaskGetTickCount();//獲取進(jìn)入的時(shí)間
printf("5s后刪除LED1任務(wù),再5S刪除自身任務(wù)\r\n"); // printf輸出字符串
/* Infinite loop */
for(;;)
{
vTaskDelayUntil(&xlaswketime,5000);//5秒
vTaskDelete(LED1Handle);
printf("刪除LED閃爍任務(wù)\r\n"); // printf輸出字符串
vTaskDelayUntil(&xlaswketime,5000);//5秒
printf("刪除自身任務(wù)\r\n"); // printf輸出字符串
vTaskDelete(NULL);
printf("正常情況不會(huì)打印這段話\r\n"); // printf輸出字符串
}
/* USER CODE END LED2Task */
}
實(shí)驗(yàn)現(xiàn)象
四,實(shí)驗(yàn)三:任務(wù)的掛起和恢復(fù)
void LED1Task(void const * argument)
{
/* USER CODE BEGIN LED1Task */
TickType_t xlaswketime;
xlaswketime = xTaskGetTickCount();//獲取進(jìn)入的時(shí)間
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,1);
vTaskDelayUntil(&xlaswketime,500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
vTaskDelayUntil(&xlaswketime,500);
}
/* USER CODE END LED1Task */
}
/* USER CODE BEGIN Header_LED2Task */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED2Task */
void LED2Task(void const * argument)
{
/* USER CODE BEGIN LED2Task */
TickType_t xlaswketime;
xlaswketime = xTaskGetTickCount();//獲取進(jìn)入的時(shí)間
printf("5s后暫停,再5S恢復(fù)\r\n"); // printf輸出字符串
/* Infinite loop */
for(;;)
{
vTaskDelayUntil(&xlaswketime,5000);//5秒
vTaskSuspend(LED1Handle);
printf("暫停LED閃爍任務(wù)\r\n"); // printf輸出字符串
vTaskDelayUntil(&xlaswketime,5000);//5秒
vTaskResume(LED1Handle);
printf("恢復(fù)LED閃爍任務(wù)\r\n"); // printf輸出字符串
}
/* USER CODE END LED2Task */
}
實(shí)驗(yàn)現(xiàn)象
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-650620.html
總結(jié)
學(xué)會(huì) 任務(wù)管理: 需要掌握并熟練任務(wù)的創(chuàng)建、刪除、掛起、恢復(fù)和切換等操作,以及任務(wù)的優(yōu)先級(jí)和調(diào)度機(jī)制。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-650620.html
到了這里,關(guān)于STM32 CubeMX (Freertos任務(wù):創(chuàng)建、刪除、掛起、恢復(fù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!