• 4.任务调度


    1.基本知识

     

    2.任务的状态 

    FreeRTOS中任务共存在4种状态:
    Running 运行态
    当任务处于实际运行状态称之为运行态,即CPU的使用权被这个任务占用(同一时间仅一个任务处于运行态)。
    Ready 就绪态
    处于就绪态的任务是指那些能够运行(没有被阻塞和挂起),但是当前没有运行的任务,因为同优先级或更高优先级的任务正在运行。
    Blocked 阻塞态
    如果一个任务因延时,或等待信号量、消息队列、事件标志组等而处于的状态被称之为阻塞态。
    Suspended 挂起态
    类似暂停,通过调用函数 vTaskSuspend() 对指定任务进行挂起,挂起后这个任务将不被执行,只有调用函数 xTaskResume() 才可以将这个任务从挂起态恢复。

    3.综合小实验 

    4.代码部分 

    1. void StartTaskLED2(void const * argument)
    2. {
    3. /* USER CODE BEGIN StartTaskLED2 */
    4. /* Infinite loop */
    5. for(;;)
    6. {
    7. HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
    8. osDelay(500);
    9. }
    10. /* USER CODE END StartTaskLED2 */
    11. }
    12. /* USER CODE BEGIN Header_StartTaskLED1 */
    13. /**
    14. * @brief Function implementing the taskLED1 thread.
    15. * @param argument: Not used
    16. * @retval None
    17. */
    18. /* USER CODE END Header_StartTaskLED1 */
    19. void StartTaskLED1(void const * argument)
    20. {
    21. /* USER CODE BEGIN StartTaskLED1 */
    22. /* Infinite loop */
    23. for(;;)
    24. {
    25. HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
    26. osDelay(1000);
    27. }
    28. /* USER CODE END StartTaskLED1 */
    29. }
    30. /* USER CODE BEGIN Header_StarttaskKEY1 */
    31. /**
    32. * @brief Function implementing the taskKEY1 thread.
    33. * @param argument: Not used
    34. * @retval None
    35. */
    36. /* USER CODE END Header_StarttaskKEY1 */
    37. void StarttaskKEY1(void const * argument)
    38. {
    39. /* USER CODE BEGIN StarttaskKEY1 */
    40. /* Infinite loop */
    41. for(;;)
    42. {
    43. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
    44. {
    45. osDelay(20);
    46. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
    47. {
    48. printf("KEY1摁下\r\n");
    49. if(taskLED1Handle==NULL)
    50. {
    51. printf("任务1不存在,准备创建任务1\r\n");
    52. osThreadDef(taskLED1, StartTaskLED1, osPriorityNormal, 0, 128);
    53. taskLED1Handle = osThreadCreate(osThread(taskLED1), NULL);
    54. if(taskLED1Handle!=NULL)
    55. {
    56. printf("任务1创建完成\r\n");
    57. }
    58. }
    59. else{
    60. printf("删除任务1\r\n");
    61. osThreadTerminate(taskLED1Handle);//删除任务
    62. taskLED1Handle=NULL;
    63. }
    64. }
    65. while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET);
    66. }
    67. osDelay(1);
    68. }
    69. /* USER CODE END StarttaskKEY1 */
    70. }
    71. /* USER CODE BEGIN Header_StarttaskKEY2 */
    72. /**
    73. * @brief Function implementing the taskKEY2 thread.
    74. * @param argument: Not used
    75. * @retval None
    76. */
    77. /* USER CODE END Header_StarttaskKEY2 */
    78. void StarttaskKEY2(void const * argument)
    79. {
    80. /* USER CODE BEGIN StarttaskKEY2 */
    81. static int flag=0;
    82. /* Infinite loop */
    83. for(;;)
    84. {
    85. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET)
    86. {
    87. osDelay(20);
    88. if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET)
    89. {
    90. printf("KEY2摁下\r\n");
    91. if(flag==0)
    92. {
    93. osThreadSuspend(taskLED2Handle);//挂起任务
    94. printf("任务二已经被暂停\r\n");
    95. flag=1;
    96. }
    97. else{
    98. osThreadResume(taskLED2Handle);//恢复任务
    99. printf("任务二已经被恢复\r\n");
    100. flag=0;
    101. }
    102. }
    103. while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET);
    104. }
    105. osDelay(1);
    106. }
    107. /* USER CODE END StarttaskKEY2 */
    108. }
    109. /* Private application code --------------------------------------------------*/
    110. /* USER CODE BEGIN Application */
    111. /* USER CODE END Application */

  • 相关阅读:
    Java随笔-HTTP
    Golang Map 基本原理
    Flink 1.13 源码解析——Flink 作业提交流程
    期货交易如何定义趋势?
    c++智能指针[ shared_ptr / unique_ptr / weak_ptr ]介绍与使用
    从Langchain到ReAct,在大模型时代下全新的应用开发核心
    多线程顺序运行的几种方法,面试可以随便问
    Yakit工具篇:子域名收集的配置和使用
    深入理解Spring中的Ioc
    photoshop插件开发入门(java,android,ios)
  • 原文地址:https://blog.csdn.net/m0_74057742/article/details/140000056