首先我们在main函数完成硬件的初始化,其次在硬件初始化完成之后创建任务start_task()然后开启FreeRtos的任务调度
(1)、start_task 任务,用于创建其他 3 个任务。
(2)、在 key_tssk 任务里面,KEY_UP 被按下,调用函数 vTaskSuspend()挂起任务 1。
(3)、KEY1 被按下,调用函数 vTaskResume()恢复任务 1 的运行。
(4)、KEY2 被按下,调用函数 vTaskSuspend()挂起任务 2。
#define START_TASK_PRIO 1 //任务优先级 #define START_STK_SIZE 120 //任务堆栈大小 TaskHandle_t StartTask_Handler; //任务句柄 void start_task(void *pvParameters); //任务函数#define KEY_TASK_PRIO 2 #define KEY_STK_SIZE 120 //任务堆栈大小 TaskHandle_t KeyTask_Handler; void key_task(void *pvParameters);#define TASK1_TASK_PRIO 3 //任务优先级 #define TASK1_STK_SIZE 120 //任务堆栈大小 TaskHandle_t Task1Task_Handler void task1_task(void *pvParameters);#define TASK2_TASK_PRIO 4 //任务优先级 #define TASK2_STK_SIZE 120 //任务堆栈大小 TaskHandle_t Task2Task_Handler; void task2_task(void *pvParameters);int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组 4delay_init(); //延时函数初始化uart_init(115200); //初始化串口LED_Init(); //初始化 LEDKEY_Init(); //初始化按键EXTIX_Init(); //初始化外部中断LCD_Init(); //初始化 LCDxTaskCreate((TaskFunction_t ) start_task, //任务函数(const char* ) "start_task", //任务名称(uint16_t ) START_STK_SIZE, //任务堆栈大小(void* ) NULL, //传递给任务函数的参数(UBaseType_t ) START_TASK_PRIO, //任务优先级(TaskHandle_t* ) &StartTask_Handler); //任务句柄vTaskStartScheduler(); //开启任务调度}void start_task(void *pvParameters) {xTaskCreate((TaskFunction_t ) key_task,(const char* ) "key_task",(uint16_t ) KEY_STK_SIZE,(void* ) NULL,(UBaseType_t ) KEY_TASK_PRIO,(TaskHandle_t* ) &KeyTask_Handler);xTaskCreate((TaskFunction_t ) task1_task,(const char* ) "task1_task",(uint16_t ) TASK1_STK_SIZE,(void* ) NULL,(UBaseType_t ) TASK1_TASK_PRIO,(TaskHandle_t* ) &Task1Task_Handler);xTaskCreate((TaskFunction_t ) task2_task,(const char* ) "task2_task",(uint16_t ) TASK2_STK_SIZE,(void* ) NULL,(UBaseType_t ) TASK2_TASK_PRIO,(TaskHandle_t* ) &Task2Task_Handler);vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL(); //退出临界区 }void key_task(void *pvParameters) {u8 key;while(1){key = KEY_scan(0);switch(key){case WKUP_PRES:vTaskSuspend(Task1Task_Handler); //挂起任务 1 (2)printf("挂起任务 1 的运行!\r\n");break;case KEY1_PRES:vTaskResume(Task1Task_Handler); //恢复任务 1 (3)printf("恢复任务 1 的运行!\r\n");break;case KEY2_PRES:vTaskSuspend(Task2Task_Handler);//挂起任务 2 (4)printf("挂起任务 2 的运行!\r\n");break;}vTaskDelay(10); //延时 10ms}}void task1_task(void *pvParameters){while(1){} } void task2_task(void *pvParameters){while(1){}}
后续明天发!!!