首先我们在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);//设置系统中断优先级分组 4 delay_init(); //延时函数初始化 uart_init(115200); //初始化串口 LED_Init(); //初始化 LED KEY_Init(); //初始化按键 EXTIX_Init(); //初始化外部中断 LCD_Init(); //初始化 LCD xTaskCreate((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){ } }
后续明天发!!!