STM32day3

1.思维导图

1.总结任务的调度算法,把实现代码再写一下

/* Definitions for myTask02 */
osThreadId_t myTask02Handle;
uint32_t myTask02Buffer[ 64 ];
osStaticThreadDef_t myTask02ControlBlock;
const osThreadAttr_t myTask02_attributes = {.name = "myTask02",.cb_mem = &myTask02ControlBlock,.cb_size = sizeof(myTask02ControlBlock),.stack_mem = &myTask02Buffer[0],.stack_size = sizeof(myTask02Buffer),.priority = (osPriority_t) osPriorityLow,
};
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {.name = "defaultTask",.stack_size = 128 * 4,.priority = (osPriority_t) osPriorityNormal,
};void vApplicationIdleHook( void )
{}
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
//
osThreadId_t abcTaskHandle;
const osThreadAttr_t abcTask_attributes = {.name = "abcTask",.stack_size = 128 * 4,.priority = (osPriority_t) osPriorityHigh,
};
/* USER CODE END FunctionPrototypes */void StartTask02(void *argument);
void StartDefaultTask(void *argument);
void StartAbcTask(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) *//*** @brief  FreeRTOS initialization* @param  None* @retval None*/
void MX_FREERTOS_Init(void) {/* USER CODE BEGIN Init *//* USER CODE END Init *//* USER CODE BEGIN RTOS_MUTEX *//* add mutexes, ... *//* USER CODE END RTOS_MUTEX *//* USER CODE BEGIN RTOS_SEMAPHORES *//* add semaphores, ... *//* USER CODE END RTOS_SEMAPHORES *//* USER CODE BEGIN RTOS_TIMERS *//* start timers, add new ones, ... *//* USER CODE END RTOS_TIMERS *//* USER CODE BEGIN RTOS_QUEUES *//* add queues, ... *//* USER CODE END RTOS_QUEUES *//* Create the thread(s) *//* creation of myTask02 */myTask02Handle = osThreadNew(StartTask02, NULL, &myTask02_attributes);/* creation of defaultTask */defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);/* USER CODE BEGIN RTOS_THREADS *//* add threads, ... *//* USER CODE END RTOS_THREADS *//* USER CODE BEGIN RTOS_EVENTS *//* add events, ... *//* USER CODE END RTOS_EVENTS */}/* USER CODE BEGIN Header_StartTask02 */
/*** @brief  Function implementing the myTask02 thread.* @param  argument: Not used* @retval None*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */for(;;){printf("Genshin brithday\r\n");HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);osDelay(500);}/* USER CODE END StartTask02 */
}/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){number++;printf("在计数=%d\r\n",number);for(int i=0;i<9000000;i++){;}if(number==5){/* Definitions for abcTask */abcTaskHandle = osThreadNew(StartAbcTask, NULL, &abcTask_attributes);}printf("我是土");osDelay(500);}/* USER CODE END StartDefaultTask */
}
void StartAbcTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){printf("我是水\r\n");osDelay(500);}/* USER CODE END StartDefaultTask */
}

2.总结任务的状态以及是怎么样进行转换的

创建任务,在创建态得到许可进入就绪态,  
进度调度进入执行态,执行态时间片用完,回到就绪态,执行的是时间片轮转,时间片大小固定,轮询不是,执行态被释放进入终止态
若执行态收到IO请求,进入阻塞态,阻塞态完成I/O,进入就绪态,就绪态继续和执行态完成状态转换。
状态有
Ready:就绪态,在创建任务后会进入就绪态。
Running:运行态,任务正在运行
Blocked:阻塞态,等待某一个事件进入休眠状态(时间,互斥锁,信号量)
Suspended:挂起态,将任务挂起后任务还是存在的,可以恢复,感觉跟就绪态一样,被杀死,等待重生中。。。
1.什么是FreeRTOS

是开源的实时嵌入式操作系统,轻量级的操作系统,和资源有限的STM32配合在一起刚刚好
2.为什么要引入FreeRTOS

提供了接口标准,便于移植和管理

提供许多第三方固件,便于业务开发

统一了接口,使底层硬件和上层硬件耦合降低,更换硬件平台只需开发人员改变底层硬件的驱动,上层业务应用程序不改动
3.FreeRTOS和Linux操作系统的区别

Linux是一个通用的操作系统,开源,实时拓展模块有preemp-rt,但性能不如FreeRTOS那样可预测。
4.STM32Cubemx配置FreeRTOS工程的步骤

左下角把FreeRTOS点开,选择CMSIS_iv2
5.任务的概念

官方定义:在FreeRTOS中,任务(Task)是并发执行的基本单元,它是一段独立执行的代码,可以被操作系统调度执行。
6.任务的优先级

数字越大,优先级越高,手动分配任务优先级,
7.任务的创建方法

有动态创建和静态创建,除此之外,开启调度器时,系统会自动创建空闲任务。追踪可查
8.任务的状态
9.任务的删除方法

删除自己使用void osThreadExit(void), 自杀后的资源需要系统自动调用空闲任务来释放,资源主要包括TCP(r任务控制块)和栈。

杀死他人osStatus_t osThreadTerminate(osThreadId_t  thread_id),资源没说是由空闲任务释放,那就是杀手释放的,挫骨扬灰,你人还怪好咧!
10.任务的调度算法

抢占式调度,根据优先级大小,判断任务执行顺序,除非时间片被耗尽,打断低优先级任务的执行。时间片轮转,

协作式调度:使用osdelay休眠函数进行协作式调度,在相同优先级之间执行,除非时间片被耗尽,会导致没输出完,
11.空闲任务和空闲任务钩子函数

空闲任务两个目的:释放自杀任务的资源,防止CPU进行空转状态,浪费CPU资源

空闲任务钩子函数:FreeRTOSConfig.h文件是FreeRTOS功能的总管文件,需要开启对应或者关闭对应的功能,设置对应的宏开关就行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/522498.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring对IOC的实现

Ioc控制反转 控制反转是一种思想。 控制反转是为了降低程序耦合度&#xff0c;提高程序扩展力&#xff0c;达到OCP原则&#xff0c;达到DIP原则。 控制反转&#xff0c;反转的是什么&#xff1f; 将对象的创建权利交出去&#xff0c;交给第三方容器负责。将对象和对象之间关系…

硬盘温度过高会怎么办?机箱温度多少算正常?

硬盘温度 硬盘在使用过程中&#xff0c;断电很容易导致数据丢失&#xff0c;但如果温度过高&#xff0c;也可能对硬盘造成损坏。 硬盘的温度是决定电脑能否正常使用的重要因素。 如果长时间读取和存储数据&#xff0c;硬盘的温度会升高。 那么&#xff0c;硬盘的正常温度是多少…

代码随想录day16 栈与队列:前 K 个高频元素(leetcode347)

题目要求&#xff1a;给定一个非空的整数数组&#xff0c;返回其中出现频率前 k 高的元素。 思路&#xff1a;我们需要使用map来统计整个数组中元素出现的频率&#xff0c;然后再根据统计好的频率去排序&#xff0c;取得频率前K高的元素。我们不必使用快排实际上我们使用优先级…

Open CASCADE学习|表面着色显示模型

模型表面着色具有如下作用&#xff1a; 视觉增强&#xff1a;通过为模型表面添加着色&#xff0c;可以使其更加生动和逼真&#xff0c;提高视觉体验。 信息区分&#xff1a;在复杂的模型中&#xff0c;不同的部分或组件可能需要通过不同的颜色来区分&#xff0c;以便更清晰地…

20 卷积层里的填充和步幅【李沐动手学深度学习v2课程笔记】

1. 填充和步幅 在上下左右分别填充一些0 2. 代码实现 2.1 填充 我们创建一个高度和宽度为3的二维卷积层&#xff0c;并在所有侧边填充1个像素。给定高度和宽度为8的输入&#xff0c;则输出的高度和宽度也是8。 import torch from torch import nn# 为了方便起见&#xff0c;…

Xilinx 7系列 FPGA硬件知识系列(九)——FPGA的配置

目录 1 .1配置模式 1.1.1 主模式 1.1.2 从模式 1.2 7种配置模式 1.2.1 主串配置模式 1.2.2 从串配置模式 ​编辑1.2.3 主并配置模式 1.2.4 从并配置模式 1.2.5 JTAG配置模式 ​编辑1.2.6 主SPI配置模式 ​编辑1.2.7 主BPI配置模式 1.2.8 FPGA BPI加载时间…

【牛客】VL74 异步复位同步释放

描述 题目描述&#xff1a; 请使用异步复位同步释放来将输入数据a存储到寄存器中&#xff0c;并画图说明异步复位同步释放的机制原理 信号示意图&#xff1a; clk为时钟 rst_n为低电平复位 d信号输入 dout信号输出 波形示意图&#xff1a; 输入描述&#xff1a; clk为时…

RocketMQ -- 低时延、高性能、高可靠、万亿级容量、灵活扩展的分布式消息流式传输平台

第一章 RocketMQ 概述 一、RocketMQ 简介 1.1 消息队列 MQ&#xff08;Message Queue&#xff09;是一种提供消息队列服务的中间件&#xff0c;也称消息中间件&#xff0c;是一套提供了海量消息生产、存储、消费全过程 API 的软件系统。 MQ 的作用&#xff1a; 限流削峰异步…

静态时序分析:SDC约束命令set_case_analysis详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 目录 指定值 指定端口/引脚列表 简单使用 set_case_analysis命令用于对电路进行特定模式的设定&#xff0c;例如对于一个工作在正常模式下的芯片&#xff0c;…

Igraph入门指南 3

4、图转换到其他R数据结构 图是对实体关系的表达&#xff0c;在igraph中&#xff0c;图可以转换为三种数据结构。 4-1 图转邻接矩阵&#xff1a;as_adjacency_matrix | as_adj&#xff0c;结果是矩阵 邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵&#xff0c;但本函数使用…

Linux学习之线程

目录 线程概念 1.什么是线程&#xff1f; 2.线程的优缺点 3.线程异常 4.线程用途 线程操作 1.如何给线程传参 2.线程终止 3.获取返回值 4.分离状态 5.退出线程 线程的用户级地址空间&#xff1a; 线程的局部存储 线程的同步与互斥 互斥量mutex 数据不一致的主要过…

组合逻辑电路(二)(译码器和编码器)

目录 译码器 简单逻辑门译码器 二进制译码器 2线-4线译码器 3线-8线译码器 二-十进制译码器 4线-10线译码器 七段显示译码器 编码器 二进制普通编码器 二-十进制普通编码器&#xff08;8421BCD码编码器&#xff09; 优先编码器&#xff08;Priority Encoder&#xff09; 译…