STM32-FreeRTOS快速学习

news2024/9/24 9:25:12

定义

FreeRTOS 满足实施系统对任务响应时间的要求。
实时操作系统、轻量级(内核小,只需要几KB的ROM和RAM)、
提供了一些内核功能,如任务管理、时间管理、内存管理和通信机制等。

和裸机的区别

裸机:无操作系统,直接操作系统,缺乏任务调度难以管理多任务。只能顺序执行任务
多任务管理:可以创建多个任务,通过时间片轮转算法进行任务切换。
任务管理

# 裸机
void music()
void movie()
void main(){
	while(1){
		music();
		movie();
	}
}
# freeRTOS通过时间片轮转算法不断切换任务,实现了音画基本同步,提高了用户体验
void task1(){
	music();
}
void task2(){
	movie();
}
void main(){
	while(1){
		task1();
		taks2();
	}
}

提供内存管理、任务间通信机制

利用CUBMX快速配置FreeRTOS

freeRTOS需要使用systick滴答时钟作为系统提供时基,因此需要更换stm32内核的时基为其他定时器
在这里插入图片描述
在这里插入图片描述
生成多出的代码
在这里插入图片描述

osThreadDef 为FreeRTOS用于定于任务的宏
osThreadDef(name, thread, priority, instances, stacksz)

name为任务的名称,thread为任务的处理函数(函数指针,传入函数名即可),priority为任务的优先级,instances为任务的实例数,stacksz为任务的堆大小 栈

osThreadCreate用于创建任务的函数
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
thread_def为任务定义的指针,argument为传递给任务处理函数的参数

CUBMEX创建了一个默认的任务
在这里插入图片描述
在FreeRTOS.init中创建了任务

  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

也创建了对应的任务处理函数

/* 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 const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}
# 上面defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL)中
# 传递参数为NULL,所以这里StartDefaultTask()里的argument也为NULL

手动创建第一个自己的任务

仿照CUBMEX创建的默认任务,在main.c中创建自己的任务,实现每 500ms led闪烁一次

#导入头文件
#include "FreeRTOS.h"
#include "task.h"

osThreadId myTaskHandle;#任务句柄ID
void myTask1(void const * argument)
{
  for(;;)
  {
	  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
	  osDelay(500);//每 500ms LED闪烁一次
  }
}

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  osThreadDef(myTask, myTask1, osPriorityNormal, 0, 128);
  myTaskHandle = osThreadCreate(osThread(myTask), NULL);

堆、栈、FreeRTOS里的任务栈

:操作系统里非常大的一块内存,比如malloc函数就是申请堆里的一块区域使用,不过不free释放,那么申请一块就少一块。

:存储局部变量和函数调用消息的数据结构。栈的大小在程序编译时确定,通常较小。

void func(){
}
int main(void){
	int a=0;
	int b=0;
	func();
	return 0;
}

执行完func()函数如何跳回主函数,这就使用到了栈。

在这里插入图片描述
堆的分配是动态的,由人决定;堆的分配是静态的,由编译器自动控制,编译时确定,运行时无法改变。
堆的分配效率低,需要运行时动态分配和释放。栈的分配效率高,由编译器编译时确定分配大小。

FreeRTOS里的任务栈:创建每一个任务都分配了一块栈空间,任务栈的大小在创建任务时指定,任务栈无需我们管理。

FreeRTOSCongfig.h(FreeRTOS的大总管)

该文件主要包含了各种宏定义,有功能宏、API宏…,可以对FreeRTOS灵活配置。详细可参考各种宏的说明
包含任务调度器、内存管理、时间管理、中断处理等方面的配置。
一部分如下图
在这里插入图片描述
常用比较重要的6个宏:
configUSE_PREEMPTION定义任务调度器的抢占式调度或者协同式调度。

为 1 时 RTOS 使用抢占式调度器,即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程;为 0 时 RTOS 使用协作式调度器(时间片)高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占 CPU 运行。

configUSE_IDLE_HOOK 定义是否使用空闲任务钩子函数。

configUSE_TICK_HOOK 定义是否使用系统滴答钩子函数。c

configTICK_RATE_HZ 定义是否使用系统滴答频率。

configCPU_CLOCK_HZ 定义系统时钟频率。

configMAX_PRIORITIES 定义系统支持的最大任务优先级。

任务调度算法

多个任务的执行顺序、时间如何确定。
实时系统的调度需求:响应时间要要求、任务优先级、资源利用率。
FreeRTOS的任务调度算法分为抢占式调度算法(优先级抢占式调度算法、时间片轮转调度算法)、非抢占式调度算法(优先级调度算法、先来先服务调度算法)。

优先级抢占式调度算法:任务优先级越高执行的机会越大,相同时执行时间片轮转调度算法。 满足实时操作系统的响应要求、有优先级管理,缺点是优先级低的任务可能被长时间阻塞。

时间片轮转调度算法:每个任务被分配一个时间片,时间片用完后任务被挂起,等待下一次调度。 公平分配CPU时间片、避免优先级低的任务被长时间阻塞。 缺点无法满足实时操作系统的响应要求。
FreeRTOS默认开启优先级抢占式调度算法、时间片轮转调度算法结合使用。

利用CUBMX创建任务

在这里插入图片描述
可以看到生成的代码和手动配置的代码一样
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

产品系统的UI暗色系和浅色系模式切换是符合人体视觉工程学的设计

视觉革命:UI设计中的暗夜与黎明 UI设计如同夜空中最亮的星辰,引领着用户穿梭于信息的海洋。而今,一场视觉革命正在悄然上演,它关乎于我们的眼睛,关乎于我们的体验——那就是产品系统的UI暗色系和浅色系模式的切换。如…

【机器学习】Jupyter Notebook如何使用之基本步骤和进阶操作

引言 Jupyter Notebook 是一个交互式计算环境,它允许创建包含代码、文本和可视化内容的文档 文章目录 引言一、基本步骤1.1 启动 Jupyter Notebook1.2 使用 Jupyter Notebook 仪表板1.3 在笔记本中工作1.4 常用快捷键1.5 导出和分享笔记本 二、进阶用法2.1 组织笔…

Excel超级处理器,工作簿文件.xls/.xlsx/.csv相互批量转换

如何将.xlsx文件转成.csv文件,.xls转换成.xlsx文件,以及.xls文件转成.csv文件或.csv转换成.xlsx文件,如果是单个文件转换,那么将当前文件另存为,保存类型,选择即可。如下图所示: 如果是多个文件…

【AutoDL】AutoDL+Xftp+Xshell+VSCode配合使用教程

身边没有显卡资源或不足以训练模型时,可以租赁服务器的显卡。 1、AutoDL Step :注册账号->选择显卡->选择环境->开机启动 1.1 首先打开AutoDL官网,注册账号 1.2 租赁自己想要的显卡资源 1.3 选择基础环境。 此处,我们让其自动配置…

[网络通信原理]——TCP/IP模型—网络层

网络层 网络层概述 网络层位于OSI模型的第三层,它定义网络设备的逻辑地址,也就是我们说的IP地址,能够在不同的网段之间选择最佳数据转发路径。在网络层中有许多协议,其中主要的协议是IP协议。 IP数据包格式 IP数据报是可变长度…

Linux服务器配置Python+PyTorch+CUDA深度学习环境

参考博主Linux服务器配置PythonPyTorchCUDA深度学习环境_linux cuda环境配置-CSDN博客 https://blog.csdn.net/NSJim/article/details/115386936?ops_request_misc&request_id&biz_id102&utm_termlinux%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E6%8C%89pytorch%20c…

微信答题小程序产品研发-需求分析与原型设计

欲知应候何时节,六月初迎大暑风。 我前面说过,我决意仿一款答题小程序,所以我做了大量的调研。 题库软件产品开发不仅仅是写代码这一环,它包含从需求调研、分析与构思、设计到开发、测试再到部署上线一系列复杂过程。 需求分析…

子数组和为k子数组和最大

题目1:子数组和为k /*给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。示例 1:输入:nums [1,1,1], k 2 输出:2 示例 2:输入&a…

微软蓝屏事件对企业数字化转型有什么影响?

引言:从北京时间2024年7月19日(周五)下午2点多开始,全球大量Windows用户出现电脑崩溃、蓝屏死机、无法重启等情况。事发后,网络安全公司CrowdStrike称,收到大量关于Windows电脑出现蓝屏报告,公司…

make2exe:自动集成测试

模板Makefile,生成多个C/C模块的集成测试程序。

算法学习day19

一、通过删除字母匹配到字符字典中的最大值 给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个,返回长度最长且字母序最小的字符串。如果…

花几千上万学习Java,真没必要!(二十六)

1、成员内部类: package internalclass.com; //在Java中,成员内部类(也称为非静态内部类)是定义在另一个类(外部类)内部的类。 //成员内部类可以访问外部类的所有成员(包括私有成员&#xff09…

【计算机网络】网络层——IPv4地址(个人笔记)

学习日期:2024.7.24 内容摘要:IPv4地址,分类编址,子网,无分类编址 IPv4地址概述 在TCP/IP体系中,IP地址是一个最基本的概念,IPv4地址就是给因特网上的每一台主机的每一个接口分配一个在全世界…

ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间

前言 在做数据库设计时,为了方便进行数据追踪,通常会有几个字段是每个表都有的,比如创建时间、创建人、更新时间、更新人、备注等,在存储这些时间时,要么存储 WEB 服务器的时间,要么存储数据库服务器的时间…

Java之数组应用-冒泡排序-二分查找

冒泡排序 冒泡(Bubble Sort)排序是一种简单排序算法,它通过依次比较交换两个相邻元素实现功能。每一次冒泡会让至少一个元素移动到它应该在的位置上,这样 n 次冒泡就完成了 n 个数据的排序工作。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”…

python实现图像缩放算法

图像缩放算法 1.最近邻插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点2.双线性插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点3.双三次插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点 1.最近邻插值图像缩放算法详解 最近邻插值(Near…

【网络】计算机网络基础——计算机网络背景和发展、认识网络协议、OSI七层模型、TCP/IP四层模型、网络的传输

文章目录 Linux网络1. 计算机网络背景和发展2. 认识网络协议3. OSI七层模型3.1 物理层3.2 数据链路层3.3 网络层3.4 传输层3.5 会话层3.6 表示层3.7 应用层 4. TCP/IP四层模型5. 网络的传输 Linux网络 1. 计算机网络背景和发展 开始的计算机都是独立模式(计算机之间…

与众不同的社交体验:Facebook的新功能与新变化

在快速变化的社交媒体领域,Facebook不断引入创新功能和变化,以满足用户日益增长的需求,并提供与众不同的社交体验。从增强现实到数据隐私,Facebook的新功能和更新正在塑造一个全新的社交平台。本文将深入探讨这些新功能和变化&…

3W单声道关断模式音频功率放大器AD4150B

前言: 国产功放介绍 NS4890C 2.4W 单声道AB类音频放大器 AD4150B 3W单声道关断模式音频功率放大器 参考价格0.3元 产品概述 AD4150B是一款单声道带关断模式,桥式音频功率放大器。在5.5V工作电压时,平均驱动功率为:3W&#xff08…

计算机网络之http和https的区别(外加http详解)

http协议和各种协议之间的关系 1、DNS解析,获取到访问服务器的IP 2、HTTP生成请求报文请求,请求访问页面资源 3、TCP协议将报文切割成一份一份报文段后,以可靠的方式进行传输 4、IP协议边搜索边中转,将这些数据包传输给接受方…