单片机源程序如下:- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "timer.h"
- #include "lcd.h"
- #include "key.h"
- #include "exti.h"
- #include "FreeRTOS.h"
- #include "task.h"
- /************************************************
- STM32F103RCT6 木子小板测试 2022 4 24
- Program Size: Code=21412 RO-data=1856 RW-data=504 ZI-data=23160
- ************************************************/
- //任务优先级
- #define START_TASK_PRIO 1 //操作系统主任务
- //任务堆栈大小
- #define START_STK_SIZE 128
- //任务句柄
- TaskHandle_t StartTask_Handler;
- //任务函数
- void start_task(void *pvParameters);
- ///////////////////////////////////////
- //任务优先级
- #define KEY_TASK_PRIO 2 //按键任务
- //任务堆栈大小
- #define KEY_STK_SIZE 128
- //任务句柄
- TaskHandle_t KeyTask_Handler;
- //任务函数
- void key_task(void *pvParameters);
- ///////////////////////////////////////
- //任务优先级
- #define TASK1_TASK_PRIO 3 //任务1
- //任务堆栈大小
- #define TASK1_STK_SIZE 128
- //任务句柄
- TaskHandle_t Task1Task_Handler;
- //任务函数
- void task1_task(void *pvParameters);
- ///////////////////////////////////////
- //任务优先级
- #define TASK2_TASK_PRIO 4 //任务2
- //任务堆栈大小
- #define TASK2_STK_SIZE 128
- //任务句柄
- TaskHandle_t Task2Task_Handler; //TaskHandle_t Task2Task_Handler KEY_0外中断恢复任务2
- //任务函数
- void task2_task(void *pvParameters);
- ///////////////////////////////////////
- #include "stm32f10x.h"
- /*************LCD刷屏时使用的颜色*****************/
- int lcd_discolor[14]={WHITE,BLACK,BLUE,BRED,
- GRED,GBLUE,RED,MAGENTA,
- GREEN,CYAN,YELLOW,BROWN,
- BRRED,GRAY
- };
- /***********************************************/
- int main(void)
- {
- // u8 ss;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
- delay_init(); //延时函数初始化
- uart_init(38400); //初始化串口
- LED_Init(); //初始化LED
- KEY_Init(); //初始化按键
- EXTIX_Init(); //初始化外部中断
- Lcd_Init(); //初始化LCD
- POINT_COLOR = RED;
- LCD_ShowString(30,90,"2022/4/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(); //进入临界区
- //创建KEY任务
- xTaskCreate((TaskFunction_t )key_task, //void key_task(void *pvParameters) key任务函数
- (const char* )"key_task",
- (uint16_t )KEY_STK_SIZE, //任务堆栈大小任务堆栈大小#define KEY_STK_SIZE 128
- (void* )NULL, //
- (UBaseType_t )KEY_TASK_PRIO, //任务优先级 2
- (TaskHandle_t* )&KeyTask_Handler); //任务句柄
- //创建TASK1任务
- xTaskCreate((TaskFunction_t )task1_task, //void task1_task(void *pvParameters) task1任务函数
- (const char* )"task1_task",
- (uint16_t )TASK1_STK_SIZE, //任务堆栈大小#define TASK1_STK_SIZE 128
- (void* )NULL, //
- (UBaseType_t )TASK1_TASK_PRIO, //任务优先级 3
- (TaskHandle_t* )&Task1Task_Handler); //任务句柄
- //创建TASK2任务
- xTaskCreate((TaskFunction_t )task2_task, //void task2_task(void *pvParameters) task2任务函数
- (const char* )"task2_task",
- (uint16_t )TASK2_STK_SIZE, //任务堆栈大小 #define TASK2_STK_SIZE 128
- (void* )NULL, //
- (UBaseType_t )TASK2_TASK_PRIO, //任务优先级 4
- (TaskHandle_t* )&Task2Task_Handler); //任务句柄
-
-
-
- vTaskDelete(StartTask_Handler); //删除开始任务
- taskEXIT_CRITICAL(); //退出临界区
- }
- /****************key任务函数************************/
- void key_task(void *pvParameters)
- {
- u8 key,statflag=0;
- while(1)
- {
- key=KEY_Scan(0);
- switch(key)
- {
- case WKUP_PRES:
- statflag=!statflag;
- if(statflag==1)
- {
- vTaskSuspend(Task1Task_Handler); //挂起任务
- //LCD_ShowString(30,10,200,16,16," \r\n");
- LCD_ShowString(30,60,"Task1 Run\r\n");
- //LCD_ShowString(30,10,"Susp Task1 \r\n");
- LCD_ShowString(30,60,"Task1 Run\r\n");
- }
- else if(statflag==0)
- {
- vTaskResume(Task1Task_Handler); //恢复任务1
- //LCD_ShowString(30,10,200,16,16,"Resum Task1\r\n");
- LCD_ShowString(30,60,"Task1 Run\r\n");
- }
- break;
- case KEY1_PRES:
- vTaskSuspend(Task2Task_Handler); //挂起任务2
- //LCD_ShowString(30,40,200,16,16," \r\n");
- LCD_ShowString(30,60,"Task1 Run\r\n");
- //LCD_ShowString(30,40,200,16,16,"Susp Task2 \r\n");
- LCD_ShowString(30,60,"Task1 Run\r\n");
- break;
- }
- vTaskDelay(10); //延时10ms
- }
- }
- /***************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,"Task1 Run:000");
- while(1)
- {
- task1_num++; //任务执1行次数加1 注意task1_num1加到255的时候会清零!!
- LED2=!LED2;
- vTaskDelay(2000); //延时2s,也就是2000个时钟节拍
- }
- }
- /***************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,"Task2 Run:000");
- while(1)
- {
- task2_num++; //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
- LED3=!LED3;
- printf("任务2已经执行:%d次\r\n",task2_num);
- POINT_COLOR =RED;
- LCD_ShowString(30,60,"Task2 Run\r\n,");
- LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域
- //(u16 x,u16 y,u32 num,u8 len)
- LCD_ShowNum(198,111,task2_num,4); //显示任务执行次数
- vTaskDelay(2000); //延时2s,也就是2000个时钟节拍
- }
- }
复制代码
Keil代码下载:
FreeRTOS编译通过保存.7z
(1.58 MB, 下载次数: 19)
|