main.c
#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "timer.h"#include "lcd.h"#include "FreeRTOS.h"#include "task.h"/************************************************ ALIENTEK Mini STM32F103 开发板 FreeRTOS实验6-1 FreeRTOS任务创建和删除(动态方法)-库函数版本 技术支持:www.openedv.com 淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。 广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK************************************************///任务优先级#define START_TASK_PRIO 1//任务堆栈大小 #define START_STK_SIZE 128 //任务句柄TaskHandle_t StartTask_Handler;//任务函数void start_task(void *pvParameters);//任务优先级#define TASK1_TASK_PRIO 2//任务堆栈大小 #define TASK1_STK_SIZE 128 //任务句柄TaskHandle_t Task1Task_Handler;//任务函数void task1_task(void *pvParameters);//任务优先级#define TASK2_TASK_PRIO 3//任务堆栈大小 #define TASK2_STK_SIZE 128 //任务句柄TaskHandle_t Task2Task_Handler;//任务函数void task2_task(void *pvParameters);//LCD刷屏时使用的颜色int lcd_discolor[14]={ WHITE, BLACK, BLUE, BRED, GRED, GBLUE, RED, MAGENTA, GREEN, CYAN, YELLOW,BROWN, BRRED, GRAY };int main(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4 delay_init(); //延时函数初始化 uart_init(115200); //初始化串口 LED_Init(); //初始化LED LCD_Init(); //初始化LCD POINT_COLOR = RED; LCD_ShowString(30,10,200,16,16,"ATK STM32F103/F407"); LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 6-1"); LCD_ShowString(30,50,200,16,16,"Task Creat and Del"); LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,90,200,16,16,"2016/11/25"); //创建开始任务 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){ taskENTER_CRITICAL(); //进入临界区 //创建TASK1任务 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); //创建TASK2任务 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(); //退出临界区}//task1任务函数void task1_task(void *pvParameters){ u8 task1_num=0; POINT_COLOR = BLACK; LCD_DrawRectangle(5,110,115,314); //画一个矩形 LCD_DrawLine(5,130,115,130); //画线 POINT_COLOR = BLUE; LCD_ShowString(6,111,110,16,16,"Task1 Run:000"); while(1) { task1_num++; //任务执1行次数加1 注意task1_num1加到255的时候会清零!! LED0=!LED0; printf("任务1已经执行:%d次\r\n",task1_num); if(task1_num==5) { vTaskDelete(Task2Task_Handler);//任务1执行5次删除任务2 printf("任务1删除了任务2!\r\n"); } LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域 LCD_ShowxNum(86,111,task1_num,3,16,0x80); //显示任务执行次数 vTaskDelay(1000); //延时1s,也就是1000个时钟节拍 }}//task2任务函数void task2_task(void *pvParameters){ u8 task2_num=0; POINT_COLOR = BLACK; LCD_DrawRectangle(125,110,234,314); //画一个矩形 LCD_DrawLine(125,130,234,130); //画线 POINT_COLOR = BLUE; LCD_ShowString(126,111,110,16,16,"Task2 Run:000"); while(1) { task2_num++; //任务2执行次数加1 注意task1_num2加到255的时候会清零!! LED1=!LED1; printf("任务2已经执行:%d次\r\n",task2_num); LCD_ShowxNum(206,111,task2_num,3,16,0x80); //显示任务执行次数 LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域 vTaskDelay(1000); //延时1s,也就是1000个时钟节拍 }}
程序下载:
FreeRTOS实验6-2 FreeRTOS任务创建和删除实验(静态方法).zip