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-2
  11. FreeRTOS任务创建和删除(静态方法)-库函数版本
  12. 技术支持:www.openedv.com
  13. 淘宝店铺:http://eboard.taobao.com
  14. 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
  15. 广州市星翼电子科技有限公司
  16. 作者:正点原子 @ALIENTEK
  17. ************************************************/
  18. //空闲任务任务堆栈
  19. static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
  20. //空闲任务控制块
  21. static StaticTask_t IdleTaskTCB;
  22. //定时器服务任务堆栈
  23. static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
  24. //定时器服务任务控制块
  25. static StaticTask_t TimerTaskTCB;
  26. //任务优先级
  27. #define START_TASK_PRIO 1
  28. //任务堆栈大小
  29. #define START_STK_SIZE 128
  30. //任务堆栈
  31. StackType_t StartTaskStack[START_STK_SIZE];
  32. //任务控制块
  33. StaticTask_t StartTaskTCB;
  34. //任务句柄
  35. TaskHandle_t StartTask_Handler;
  36. //任务函数
  37. void start_task(void *pvParameters);
  38. //任务优先级
  39. #define TASK1_TASK_PRIO 2
  40. //任务堆栈大小
  41. #define TASK1_STK_SIZE 128
  42. //任务堆栈
  43. StackType_t Task1TaskStack[TASK1_STK_SIZE];
  44. //任务控制块
  45. StaticTask_t Task1TaskTCB;
  46. //任务句柄
  47. TaskHandle_t Task1Task_Handler;
  48. //任务函数
  49. void task1_task(void *pvParameters);
  50. //任务优先级
  51. #define TASK2_TASK_PRIO 3
  52. //任务堆栈大小
  53. #define TASK2_STK_SIZE 128
  54. //任务堆栈
  55. StackType_t Task2TaskStack[TASK2_STK_SIZE];
  56. //任务控制块
  57. StaticTask_t Task2TaskTCB;
  58. //任务句柄
  59. TaskHandle_t Task2Task_Handler;
  60. //任务函数
  61. void task2_task(void *pvParameters);
  62. //LCD刷屏时使用的颜色
  63. int lcd_discolor[14]={ WHITE, BLACK, BLUE, BRED,
  64. GRED, GBLUE, RED, MAGENTA,
  65. GREEN, CYAN, YELLOW,BROWN,
  66. BRRED, GRAY };
  67. //获取空闲任务地任务堆栈和任务控制块内存,因为本例程使用的
  68. //静态内存,因此空闲任务的任务堆栈和任务控制块的内存就应该
  69. //有用户来提供,FreeRTOS提供了接口函数vApplicationGetIdleTaskMemory()
  70. //实现此函数即可。
  71. //ppxIdleTaskTCBBuffer:任务控制块内存
  72. //ppxIdleTaskStackBuffer:任务堆栈内存
  73. //pulIdleTaskStackSize:任务堆栈大小
  74. void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
  75. StackType_t **ppxIdleTaskStackBuffer,
  76. uint32_t *pulIdleTaskStackSize)
  77. {
  78. *ppxIdleTaskTCBBuffer=&IdleTaskTCB;
  79. *ppxIdleTaskStackBuffer=IdleTaskStack;
  80. *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
  81. }
  82. //获取定时器服务任务的任务堆栈和任务控制块内存
  83. //ppxTimerTaskTCBBuffer:任务控制块内存
  84. //ppxTimerTaskStackBuffer:任务堆栈内存
  85. //pulTimerTaskStackSize:任务堆栈大小
  86. void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
  87. StackType_t **ppxTimerTaskStackBuffer,
  88. uint32_t *pulTimerTaskStackSize)
  89. {
  90. *ppxTimerTaskTCBBuffer=&TimerTaskTCB;
  91. *ppxTimerTaskStackBuffer=TimerTaskStack;
  92. *pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
  93. }
  94. int main(void)
  95. {
  96. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
  97. delay_init(); //延时函数初始化
  98. uart_init(115200); //初始化串口
  99. LED_Init(); //初始化LED
  100. LCD_Init(); //初始化LCD
  101. POINT_COLOR = RED;
  102. LCD_ShowString(30,10,200,16,16,"ATK STM32F103/407");
  103. LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 6-2");
  104. LCD_ShowString(30,50,200,16,16,"Task Creat and Del");
  105. LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
  106. LCD_ShowString(30,90,200,16,16,"2016/11/25");
  107. //创建开始任务
  108. StartTask_Handler=xTaskCreateStatic((TaskFunction_t )start_task, //任务函数
  109. (const char* )"start_task", //任务名称
  110. (uint32_t )START_STK_SIZE, //任务堆栈大小
  111. (void* )NULL, //传递给任务函数的参数
  112. (UBaseType_t )START_TASK_PRIO, //任务优先级
  113. (StackType_t* )StartTaskStack, //任务堆栈
  114. (StaticTask_t* )&StartTaskTCB); //任务控制块
  115. vTaskStartScheduler(); //开启任务调度
  116. }
  117. //开始任务任务函数
  118. void start_task(void *pvParameters)
  119. {
  120. taskENTER_CRITICAL(); //进入临界区
  121. //创建TASK1任务
  122. Task1Task_Handler=xTaskCreateStatic((TaskFunction_t )task1_task,
  123. (const char* )"task1_task",
  124. (uint32_t )TASK1_STK_SIZE,
  125. (void* )NULL,
  126. (UBaseType_t )TASK1_TASK_PRIO,
  127. (StackType_t* )Task1TaskStack,
  128. (StaticTask_t* )&Task1TaskTCB);
  129. //创建TASK2任务
  130. Task2Task_Handler=xTaskCreateStatic((TaskFunction_t )task2_task,
  131. (const char* )"task2_task",
  132. (uint32_t )TASK2_STK_SIZE,
  133. (void* )NULL,
  134. (UBaseType_t )TASK2_TASK_PRIO,
  135. (StackType_t* )Task2TaskStack,
  136. (StaticTask_t* )&Task2TaskTCB);
  137. vTaskDelete(StartTask_Handler); //删除开始任务
  138. taskEXIT_CRITICAL(); //退出临界区
  139. }
  140. //task1任务函数
  141. void task1_task(void *pvParameters)
  142. {
  143. u8 task1_num=0;
  144. POINT_COLOR = BLACK;
  145. LCD_DrawRectangle(5,110,115,314); //画一个矩形
  146. LCD_DrawLine(5,130,115,130); //画线
  147. POINT_COLOR = BLUE;
  148. LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
  149. while(1)
  150. {
  151. task1_num++; //任务执1行次数加1 注意task1_num1加到255的时候会清零!!
  152. LED0=!LED0;
  153. printf("任务1已经执行:%d次\r\n",task1_num);
  154. if(task1_num==5)
  155. {
  156. vTaskDelete(Task2Task_Handler);//任务1执行5次删除任务2
  157. printf("任务1删除了任务2!\r\n");
  158. }
  159. LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域
  160. LCD_ShowxNum(86,111,task1_num,3,16,0x80); //显示任务执行次数
  161. vTaskDelay(1000); //延时1s,也就是1000个时钟节拍
  162. }
  163. }
  164. //task2任务函数
  165. void task2_task(void *pvParameters)
  166. {
  167. u8 task2_num=0;
  168. POINT_COLOR = BLACK;
  169. LCD_DrawRectangle(125,110,234,314); //画一个矩形
  170. LCD_DrawLine(125,130,234,130); //画线
  171. POINT_COLOR = BLUE;
  172. LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
  173. while(1)
  174. {
  175. task2_num++; //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
  176. LED1=!LED1;
  177. printf("任务2已经执行:%d次\r\n",task2_num);
  178. LCD_ShowxNum(206,111,task2_num,3,16,0x80); //显示任务执行次数
  179. LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域
  180. vTaskDelay(1000); //延时1s,也就是1000个时钟节拍
  181. }
  182. }

程序下载:

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