当前位置: 首页 > news >正文

4.任务调度

1.基本知识

 

2.任务的状态 

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

3.综合小实验 

4.代码部分 

void StartTaskLED2(void const * argument)
{/* USER CODE BEGIN StartTaskLED2 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);osDelay(500);}/* USER CODE END StartTaskLED2 */
}/* USER CODE BEGIN Header_StartTaskLED1 */
/**
* @brief Function implementing the taskLED1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTaskLED1 */
void StartTaskLED1(void const * argument)
{/* USER CODE BEGIN StartTaskLED1 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);osDelay(1000);}/* USER CODE END StartTaskLED1 */
}/* USER CODE BEGIN Header_StarttaskKEY1 */
/**
* @brief Function implementing the taskKEY1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StarttaskKEY1 */
void StarttaskKEY1(void const * argument)
{/* USER CODE BEGIN StarttaskKEY1 *//* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET){osDelay(20);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET){printf("KEY1摁下\r\n");if(taskLED1Handle==NULL){printf("任务1不存在,准备创建任务1\r\n");osThreadDef(taskLED1, StartTaskLED1, osPriorityNormal, 0, 128);taskLED1Handle = osThreadCreate(osThread(taskLED1), NULL);if(taskLED1Handle!=NULL){printf("任务1创建完成\r\n");}}else{printf("删除任务1\r\n");osThreadTerminate(taskLED1Handle);//删除任务taskLED1Handle=NULL;}}while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET);}osDelay(1);}/* USER CODE END StarttaskKEY1 */
}/* USER CODE BEGIN Header_StarttaskKEY2 */
/**
* @brief Function implementing the taskKEY2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StarttaskKEY2 */
void StarttaskKEY2(void const * argument)
{/* USER CODE BEGIN StarttaskKEY2 */static int flag=0;/* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET){osDelay(20);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET){printf("KEY2摁下\r\n");if(flag==0){osThreadSuspend(taskLED2Handle);//挂起任务printf("任务二已经被暂停\r\n");flag=1;}else{osThreadResume(taskLED2Handle);//恢复任务printf("任务二已经被恢复\r\n");flag=0;}}while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET);}osDelay(1);}/* USER CODE END StarttaskKEY2 */
}/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application *//* USER CODE END Application */

http://www.lryc.cn/news/384502.html

相关文章:

  • Github 2024-06-27 Go开源项目日报Top10
  • 【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(一)
  • 「C系列」C 排序算法
  • Power BI可视化表格矩阵如何保持样式导出数据?
  • 《UDS协议从入门到精通》系列——图解0x35:请求上传
  • Tailwindcss 扩展默认配置来自定义颜色
  • C++设计模式---享元模式
  • 智慧园区大数据云平台建设方案(Word原件)
  • 【学习】如何利用Python技术进行软件测试相关工作
  • Qt:3.项目创建、对象树、乱码问题、Qt命名规则
  • C# 入门—实现 Hello, World!
  • 【项目实训】前端页面初探索(前期探索)
  • 机器人控制系列教程之动力学建模(2)
  • Golang | Leetcode Golang题解之第200题岛屿数量
  • Linux系统启动流程
  • Vue 学习之 axios
  • Python学习笔记17 -- 猜数字小游戏2
  • 【系统架构设计师】七、信息安全技术基础知识(信息安全的概念|信息安全系统的组成框架|信息加解密技术)
  • CMMM Plus+ Calculus Update 超级游戏大作 游戏说明
  • Java OA系统任务协作模块
  • 深入解析Maven常用命令
  • 【Docker】镜像
  • 力扣最新详解5道题:两数之和三数之和四数之和
  • 通讯:单片机串口和电脑通讯
  • ubuntu22.04 设置双屏
  • 【FPGA-常见问题及解决方案】
  • 【第3章】MyBatis-Plus持久层接口之Service Interface(上)
  • Nodemon的入门及使用
  • cesium 实现三维无人机航拍过程实景效果
  • Rust:使用 Warp 框架编写基于 HTTPS 的 RESTful API