本文目标:学习与使用FreeRTOS中的几项操作,有挂起恢复删除等操作。
按照本文的描述,应该可以跑通实验并举一反三。
本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5
本次实验就是设计一个实验,来实现任务的一些操作,有删除任务,恢复任务。在本次实验中,将使用两个按键,一个按键用作删除任务,一个按键用作挂起和恢复。基于这个实验情况,我在我的硬件平台进行实验。
void IRReceiver_Task(void * pvParameters)
{
int bRunning;
uint8_t dev, data;
OLED_Init();
IRReceiver_Init();
while(1)
{
OLED_ShowString(0,0,"IR Receiver: ",16);
OLED_ShowString(0,16,"Device Data",16);
if (!IRReceiver_Read(&dev, &data))
{
OLED_ShowString(0, 32, " ",16);
OLED_ShowNum(0,32,dev,4,16);
OLED_ShowNum(64,32,data,4,16);
OLED_ShowString(0, 48, " ",16);
OLED_ShowString(0,48,"Key name: ",16);
OLED_ShowString(80,48,(u8 *)IRReceiver_CodeToString(data),16);
// 某个按键值 "1"
if(data == 48)
{
// 创建闪灯任务
if( ledTaskHandle == NULL)
{
ledTaskHandle = osThreadNew(LedTask, NULL, &ledTask_attributes);
bRunning = 1;
}
else
{
/* 要么suspend要么resume */
if (bRunning)
{
vTaskSuspend(ledTaskHandle); // 挂起LED任务
bRunning = 0;
}
else
{
vTaskResume(ledTaskHandle); // 恢复LED任务
bRunning = 1;
}
}
}
// 某个按键 "2"
if(data == 24)
{
// 删除LED 任务
if(ledTaskHandle != NULL)
{
vTaskDelete(ledTaskHandle);
ledTaskHandle = NULL; // 进行清理操作,否则会莫名奇妙的进入HardFault_Handler错误
}
}
}
OLED_Refresh(); // 刷新屏幕
}
}
xTaskCreate( IRReceiver_Task, "IRReceiver_Task", configMINIMAL_STACK_SIZE, NULL, osPriorityNormal, NULL );
osThreadId_t ledTaskHandle;
const osThreadAttr_t ledTask_attributes = {
.name = "ledTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
void LedTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
mdelay(100);
}
/* USER CODE END StartDefaultTask */
}
下载代码到板子上,当我按下1号按钮时,会创建LedTask的任务,当我继续按下1号按钮时,会把LedTask进行挂起或恢复,如果是挂起的状态则进行恢复,如果是恢复的状态则进行挂起,当我按下2号按钮时会把LedTask的任务进行删除,通过这些代码片段就实现了我们本次设计的实验,完美的实现了挂起恢复删除等操作。