STM32day3

news2024/12/26 23:25:52

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.coloradmin.cn/o/1501943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL容器安装

docker中的centos7中安装 选择对应的版本然后在容器中的centos7中执行下面命令 但是启动容器的时候需要注意 开启端口映射开启特权模式启动init进程 docker run -itd --name centos-postgresql -p 5433:5432 --privilegedtrue centos:centos7 /usr/sbin/init 启动然后进入后先…

Mysql的Cardinality值

什么是Cardinality值&#xff1f; Cardinality值是Mysql做索引优化时一个非常关键的值&#xff0c;优化器会根据这个值来判断是否使用这个索引&#xff0c;它表示索引中唯一值的数目估计值&#xff0c;该值应该尽可能接近1&#xff0c;如果非常小&#xff0c;则用户需要考虑是否…

Clickhouse表引擎介绍

作者&#xff1a;俊达 1 引擎分类 ClickHouse表引擎一共分为四个系列&#xff0c;分别是Log、MergeTree、Integration、Special。其中包含了两种特殊的表引擎Replicated、Distributed&#xff0c;功能上与其他表引擎正交&#xff0c;根据场景组合使用。 2 Log系列 Log系列…

运维知识点-Apache HTTP Server

Apache 介绍 介绍 Apache是一个开源的Web服务器软件&#xff0c;全称为Apache HTTP Server&#xff0c;由Apache软件基金会开发和维护。它是目前全球使用最广泛的Web服务器软件之一&#xff0c;占全球所有网络服务器的很大比例。Apache服务器具有跨平台的特性&#xff0c;可以…

ChatGPT Plus 支付出现「您的银行卡被拒绝/your card has been declined」怎么办?

ChatGPT Plus 支付出现「您的银行卡被拒绝/your card has been declined」怎么办&#xff1f; 在订阅 ChatGPT Plus 或者 OpenAI API 时&#xff0c;有时候会出现已下报错 &#xff1a; Your card has been declined. 您的银行卡被拒绝 出现这种错误&#xff0c;有以下几个解…

Linux操作系统的vim常用命令和vim 键盘图

在vi编辑器的命令模式下&#xff0c;命令的组成格式是&#xff1a;nnc。其中&#xff0c;字符c是命令&#xff0c;nn是整数值&#xff0c;它表示该命令将重复执行nn次&#xff0c;如果不给出重复次数的nn值&#xff0c;则命令将只执行一次。例如&#xff0c;在命令模式下按j键表…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放Video Mixer多路视频拼接应用本方案的SDI接收OSD动态字符叠加…

防火墙配置实验

配置 配置IPSec FW1 FW3 NAT策略 FW1 FW3 安全策略 FW1 FW3 最后测试

软考高级:系统工程生命周期方法(计划驱动方法、渐进迭代式方法等)概念和例子

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Windows按文件类型指定默认应用程序方法,.py文件设置默认打开程序实例演示

有两种方法可以设置按文件类型指定默认应用。 一个是系统的设置&#xff0c;但是部分类型里面是没有的&#xff0c;这种就要通过注册表来添加。 如果没有的话&#xff0c;通过 winR 打开运行&#xff0c;然后输入 regedit 打开注册表&#xff0c;在 计算机\HKEY_CLASSES_ROO…

【leetcode热题】重排链表

给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示…

<商务世界>《第8课 Leads——MQL——SQL——商机——成交》

1 各种概念 英文缩写概念Traffic流量Leads潜在客户&#xff0c;销售线索&#xff1b;简称潜在线索MQLMarketing-Qualified Leads市场认可线索SQLSales-Qualified Leads销售认可线索OPPOpportunity商机Account成单客户 2 线索到商机 一般企业会把自身线索进行如下的划分&…

ubuntu18.04编译OpenCV-3.4.19+OpenCV_contrib-3.4.19

首先确保安装了cmake工具 安装opencv依赖文件 sudo apt-get install build-essential sudo apt-get install git libgtk-3-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev li…

瑞_23种设计模式_模板方法模式

文章目录 1 模板方法模式&#xff08;Template Pattern&#xff09; ★ 钩子函数1.1 介绍1.2 概述1.3 模板方法模式的结构1.4 模板方法模式的优缺点1.5 模板方法模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;InputStre…

Javaweb day13 day14 day15

spring boot 快速入门 写法 http协议 请求协议 响应协议 协议解析 Tomcat

功能强大使用简单的截图/贴图工具,PixPin

一、下载链接 PixPin 截图/贴图/长截图/文字识别/标注 | PixPin 截图/贴图/长截图/文字识别/标注 (pixpinapp.com) 二、功能 截图/贴图/长截图/文字识别/标注 三、安装教程 根据提示安装即可&#xff1a; 四、快捷键 1.软件自带快捷键&#xff08;右击PixPin查看 &#xff09…

Tomcat的安装

下载Tomcat&#xff08;这里以Tomcat8.5为例&#xff09; 直接进入官网进行下载&#xff0c;Tomcat官网 选择需要下载的版本&#xff0c;点击下载这里一定要注意&#xff1a;下载路径一定要记住&#xff0c;并且路径中尽量不要有中文&#xff01;&#xff01;&#xff01;&…

C/C++编程-理论学习-通信协议理论

通信协议理论 protobuf简述使用简介proto 文件为了nanopb 编译.proto文件修改生成器行为 streamsoutput streamsinput streams Data types(数据类型)Field callbacks(字段回调)Encoding callbacks(编码回调)Message descriptor(信息描述)三个关键字required、optional、repeate…

【编程实践】matlab中的转义字符

简记 这个报错是因为在sprintf函数中使用了无效的转义字符\U。在MATLAB中&#xff0c;转义字符\U是无效的&#xff0c;因此会导致警告。 检查sprintf函数中的格式化字符串是否包含了无效的转义字符。确保只使用MATLAB支持的转义字符。 如果想要输出一个反斜杠字符\&#xff0c…

Graphpad Prism10.2.1(395) 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…