• freeRTOS学习day2任务创建(静态创建)


    静态创建相比较更加麻烦

    1. #include "sys.h"
    2. #include "delay.h"
    3. #include "usart.h"
    4. #include "led.h"
    5. #include "FreeRTOS.h"
    6. #include "task.h"
    7. #define START_TASK_PRIO 1 //任务优先级
    8. #define START_STK_SIZE 120 //任务堆栈
    9. StackType_t StartTaskStack[START_STK_SIZE];
    10. StaticTask_t StartTaskTCB;
    11. TaskHandle_t Start_Handler;
    12. void start_task(void *pvParameters);
    13. #define Task1_TASK_PRIO 2 //任务优先级
    14. #define Task1_STK_SIZE 120 //任务堆栈
    15. StackType_t Task1Stack[START_STK_SIZE];
    16. StaticTask_t Task1TCB;
    17. TaskHandle_t Task1_Handler;
    18. void task1_task(void *pvParameters);
    19. #define Task2_TASK_PRIO 3 //任务优先级
    20. #define Task2_STK_SIZE 120 //任务堆栈
    21. StackType_t Task2Stack[START_STK_SIZE];
    22. StaticTask_t Task2TCB;
    23. TaskHandle_t Task2_Handler;
    24. void task2_task(void *pvParameters);
    25. #define Task3_TASK_PRIO 4 //任务优先级
    26. #define Task3_STK_SIZE 120 //任务堆栈
    27. StackType_t Task3Stack[START_STK_SIZE];
    28. StaticTask_t Task3TCB;
    29. TaskHandle_t Task3_Handler;
    30. void task3_task(void *pvParameters);
    31. void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );
    32. //*******************下面注释掉的代码是通过 位带 操作实现IO口控制**************************************
    33. //空闲任务
    34. static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
    35. static StaticTask_t IdleTaskTCB;
    36. //定时器任务
    37. static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
    38. static StaticTask_t TimerTaskTCB;
    39. //空闲任务所需内存
    40. void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
    41. {
    42. *ppxIdleTaskTCBBuffer=&IdleTaskTCB;
    43. *ppxIdleTaskStackBuffer=IdleTaskStack;
    44. *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
    45. }
    46. //定时器任务所需内存
    47. void vApplicationGetTimerTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
    48. {
    49. *ppxIdleTaskTCBBuffer=&TimerTaskTCB;
    50. *ppxIdleTaskStackBuffer=TimerTaskStack;
    51. *pulIdleTaskStackSize=configTIMER_TASK_STACK_DEPTH;
    52. }
    53. int main(void)
    54. {
    55. uart_init(115200);
    56. delay_init(168); //初始化延时函数
    57. LED_Init(); //初始化LED端口
    58. while(1)
    59. {
    60. xTaskCreateStatic( (TaskFunction_t) start_task,
    61. ( char * ) "start_task",
    62. ( uint32_t) START_STK_SIZE,
    63. (void *) NULL,
    64. (UBaseType_t) START_TASK_PRIO,
    65. (StackType_t *) StartTaskStack,
    66. (StaticTask_t *) &StartTaskTCB);
    67. vTaskStartScheduler();// 开启任务调度器 注意一定要开启
    68. }
    69. }
    70. //创建开始任务
    71. void start_task(void *pvParameters)
    72. {
    73. //创建Task1
    74. xTaskCreateStatic( (TaskFunction_t) task1_task,
    75. ( char * ) "task1_task",
    76. ( uint32_t) Task1_STK_SIZE,
    77. (void *) NULL,
    78. (UBaseType_t) Task1_TASK_PRIO,
    79. (StackType_t *) Task1Stack,
    80. (StaticTask_t *) &Task1TCB);
    81. //创建Task2
    82. xTaskCreateStatic( (TaskFunction_t) task2_task,
    83. ( char * ) "task2_task",
    84. ( uint32_t) Task2_STK_SIZE,
    85. (void *) NULL,
    86. (UBaseType_t) Task2_TASK_PRIO,
    87. (StackType_t *) Task2Stack,
    88. (StaticTask_t *) &Task2TCB);
    89. //创建Task3
    90. xTaskCreateStatic( (TaskFunction_t) task3_task,
    91. ( char * ) "task3_task",
    92. ( uint32_t) Task3_STK_SIZE,
    93. (void *) NULL,
    94. (UBaseType_t) Task3_TASK_PRIO,
    95. (StackType_t *) Task3Stack,
    96. (StaticTask_t *) &Task3TCB);
    97. vTaskDelete(Start_Handler);
    98. }
    99. void task1_task(void *pvParameters)
    100. {
    101. while(1)
    102. {
    103. printf("task 1 is ok\r\n");
    104. vTaskDelay(500);
    105. }
    106. }
    107. void task2_task(void *pvParameters)
    108. {
    109. while(1)
    110. {
    111. printf("task 2 is ok\r\n");
    112. vTaskDelay(800);
    113. }
    114. }
    115. void task3_task(void *pvParameters)
    116. {
    117. while(1)
    118. {
    119. printf("task 3 is ok\r\n");
    120. vTaskDelay(1000);
    121. }
    122. }

  • 相关阅读:
    MASM32编写TcpStatC再进阶 显示PID和对应进程说明符
    如何下载PDF版本的专利
    OpenCV项目实战(2)— 如何用OpenCV实现弹球动画
    Gartner发布中国科技报告:数据编织和大模型技术崭露头角
    worthington细胞分离技术丨生存能力测量优化方案
    【校招VIP】前端网络之路由选择协议
    selenium 网页自动化-在访问一个网页时弹出的浏览器窗口,我该如何处理?
    计算机毕业设计Python+Django的学生作业管理系统
    k8s优雅停服
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
  • 原文地址:https://blog.csdn.net/weixin_64975583/article/details/133988374