main.c

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "timer.h"
  6. #include "lcd.h"
  7. #include "FreeRTOS.h"
  8. #include "task.h"
  9. /************************************************
  10. ALIENTEK Mini STM32F103 开发板 FreeRTOS实验6-1
  11. FreeRTOS任务创建和删除(动态方法)-库函数版本
  12. 技术支持:www.openedv.com
  13. 淘宝店铺:http://eboard.taobao.com
  14. 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
  15. 广州市星翼电子科技有限公司
  16. 作者:正点原子 @ALIENTEK
  17. ************************************************/
  18. //任务优先级
  19. #define START_TASK_PRIO 1
  20. //任务堆栈大小
  21. #define START_STK_SIZE 128
  22. //任务句柄
  23. TaskHandle_t StartTask_Handler;
  24. //任务函数
  25. void start_task(void *pvParameters);
  26. //任务优先级
  27. #define TASK1_TASK_PRIO 2
  28. //任务堆栈大小
  29. #define TASK1_STK_SIZE 128
  30. //任务句柄
  31. TaskHandle_t Task1Task_Handler;
  32. //任务函数
  33. void task1_task(void *pvParameters);
  34. //任务优先级
  35. #define TASK2_TASK_PRIO 3
  36. //任务堆栈大小
  37. #define TASK2_STK_SIZE 128
  38. //任务句柄
  39. TaskHandle_t Task2Task_Handler;
  40. //任务函数
  41. void task2_task(void *pvParameters);
  42. //LCD刷屏时使用的颜色
  43. int lcd_discolor[14]={ WHITE, BLACK, BLUE, BRED,
  44. GRED, GBLUE, RED, MAGENTA,
  45. GREEN, CYAN, YELLOW,BROWN,
  46. BRRED, GRAY };
  47. int main(void)
  48. {
  49. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
  50. delay_init(); //延时函数初始化
  51. uart_init(115200); //初始化串口
  52. LED_Init(); //初始化LED
  53. LCD_Init(); //初始化LCD
  54. POINT_COLOR = RED;
  55. LCD_ShowString(30,10,200,16,16,"ATK STM32F103/F407");
  56. LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 6-1");
  57. LCD_ShowString(30,50,200,16,16,"Task Creat and Del");
  58. LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
  59. LCD_ShowString(30,90,200,16,16,"2016/11/25");
  60. //创建开始任务
  61. xTaskCreate((TaskFunction_t )start_task, //任务函数
  62. (const char* )"start_task", //任务名称
  63. (uint16_t )START_STK_SIZE, //任务堆栈大小
  64. (void* )NULL, //传递给任务函数的参数
  65. (UBaseType_t )START_TASK_PRIO, //任务优先级
  66. (TaskHandle_t* )&StartTask_Handler); //任务句柄
  67. vTaskStartScheduler(); //开启任务调度
  68. }
  69. //开始任务任务函数
  70. void start_task(void *pvParameters)
  71. {
  72. taskENTER_CRITICAL(); //进入临界区
  73. //创建TASK1任务
  74. xTaskCreate((TaskFunction_t )task1_task,
  75. (const char* )"task1_task",
  76. (uint16_t )TASK1_STK_SIZE,
  77. (void* )NULL,
  78. (UBaseType_t )TASK1_TASK_PRIO,
  79. (TaskHandle_t* )&Task1Task_Handler);
  80. //创建TASK2任务
  81. xTaskCreate((TaskFunction_t )task2_task,
  82. (const char* )"task2_task",
  83. (uint16_t )TASK2_STK_SIZE,
  84. (void* )NULL,
  85. (UBaseType_t )TASK2_TASK_PRIO,
  86. (TaskHandle_t* )&Task2Task_Handler);
  87. vTaskDelete(StartTask_Handler); //删除开始任务
  88. taskEXIT_CRITICAL(); //退出临界区
  89. }
  90. //task1任务函数
  91. void task1_task(void *pvParameters)
  92. {
  93. u8 task1_num=0;
  94. POINT_COLOR = BLACK;
  95. LCD_DrawRectangle(5,110,115,314); //画一个矩形
  96. LCD_DrawLine(5,130,115,130); //画线
  97. POINT_COLOR = BLUE;
  98. LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
  99. while(1)
  100. {
  101. task1_num++; //任务执1行次数加1 注意task1_num1加到255的时候会清零!!
  102. LED0=!LED0;
  103. printf("任务1已经执行:%d次\r\n",task1_num);
  104. if(task1_num==5)
  105. {
  106. vTaskDelete(Task2Task_Handler);//任务1执行5次删除任务2
  107. printf("任务1删除了任务2!\r\n");
  108. }
  109. LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域
  110. LCD_ShowxNum(86,111,task1_num,3,16,0x80); //显示任务执行次数
  111. vTaskDelay(1000); //延时1s,也就是1000个时钟节拍
  112. }
  113. }
  114. //task2任务函数
  115. void task2_task(void *pvParameters)
  116. {
  117. u8 task2_num=0;
  118. POINT_COLOR = BLACK;
  119. LCD_DrawRectangle(125,110,234,314); //画一个矩形
  120. LCD_DrawLine(125,130,234,130); //画线
  121. POINT_COLOR = BLUE;
  122. LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
  123. while(1)
  124. {
  125. task2_num++; //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
  126. LED1=!LED1;
  127. printf("任务2已经执行:%d次\r\n",task2_num);
  128. LCD_ShowxNum(206,111,task2_num,3,16,0x80); //显示任务执行次数
  129. LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域
  130. vTaskDelay(1000); //延时1s,也就是1000个时钟节拍
  131. }
  132. }

程序下载:

FreeRTOS实验6-2 FreeRTOS任务创建和删除实验(静态方法).zip