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

FreeRTOS的裁剪与移植

文章目录

  • 1 FreeRTOS裁剪与移植
    • 1.1 FreeRTOS基础
      • 1.1.1 RTOS与GPOS
      • 1.1.2 堆与栈
      • 1.1.3 FreeRTOS核心文件
      • 1.1.4 FreeRTOS语法
    • 1.2 FreeRTOS移植和裁剪

1 FreeRTOS裁剪与移植

1.1 FreeRTOS基础

1.1.1 RTOS与GPOS

​ 实时操作系统(RTOS):是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应高可靠性是其主要特点。相比与通用操作系统,他的实时性更强,但是像FreeRTOS这样的实时操作系统也会阉割掉文件系统等部分。

实时操作系统一般有如下要求:

  • 可以多任务运行
  • 有能够处理优先次序的“进程栈”(即可以区分任务的优先级别来运行,进程栈并不真的是进程,在单片机中说成是线程更合理,因为没有MMU来实现虚拟地址到物理地址的映射)
  • 一个中断水平的充分数量:指的是系统能够处理的中断优先级水平的数量。

​ 通用操作系统(GPOS):具有多种类型操作特征的操作系统。可以同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。一般来说也叫做分时系统,其通过分时间片的方式实现多进程的“同时”运行,通用操作系统有五个主要管理功能,分别是:进程管理,内存管理,文件管理,设备管理,网络管理等功能。同时我们这里再复习一下通用操作系统中的五态转换:

在这里插入图片描述

1.1.2 堆与栈

  • 堆(heap):就是一段空闲的内存,一般在bss区之上,需要我们自己进行malloc和free申请和释放。
  • 栈(stack):一般用来存放局部变量(除了静态static的局部变量)和运行环境,同时环境变量也会存储在这里。同时,我们可以从堆中申请一部分的内存当作栈使用。重点是要理解压栈出栈的操作,递归函数的返回值是如何存储的

1.1.3 FreeRTOS核心文件

目录结构

在这里插入图片描述

FreeRTOS/Demo/示例/下文件作用:主要是各个平台的示例工程
FreeRTOSConfig.h不同的配置头文件,其中包括了调度算法等。
Common独立的通用代码,大部分废弃
FreeRTOS/Source/下文件作用
task.c必须选择,任务
list.c必须选择,列表
queue.c基本必选,队列,信号量等
timer.c可选,计时器
event_groups.c可选,事件组
stream_buffer.c可选,缓冲功能
include头文件
portable/RVDS移植需要的文件,要根据不同的内核(例如M4内核)来选择,其中的FreeRTOS.h最重要,是必须被包含的头文件
portable/MemMang内存管理的函数,heap1.2.3.4.5,一般使用heap4

1.1.4 FreeRTOS语法

FreeRTOS中有两个最基本的自定义数据类型:

  • TickType_t :中断处理次数tick_count ,可能时16位,也可能是32位的,根据处理器来选择。
  • BaseType_t:该架构最高效的数据类型,一般情况下是32位的,也是根据处理器和效率来综合选择的。

变量名,函数名,宏的命名规则

变量名前缀含义
cchar
sshort或int16_t
llong_或int32_t
x其他非标准类型,例如:结构体,FreeRTOS中自定义的TickType_t等
uunsigned无符号型
p指针
ucuint8_t,unsigned char
pcchar 指针
函数名前缀含义
vTaskPrioritySet()返回值类型是void,该函数在task.h中声明
xQueueCreate()返回值是非标准类型,该函数在queue.H中声明
pvTimerGetTimerID()返回值是void指针,该函数在timer.h中声明
宏的前缀含义:在那个.h中声明
port(例如portMAX_DELAY)在portable.h和portmacro.h中声明
task在task.h中声明
pd在projdefs.h中声明
configFreeRTOSConfig.h中声明
err在projdefs.h中声明
通用宏
pdTRUE1
pdFALSE0
pdPASS1
pdFAIL0

1.2 FreeRTOS移植和裁剪

​ 移植原理:FreeRTOS的本质就是一堆用来实现实时操作系统的.c .h 和配置文件,所以我们只需要将对应的文件和移植平台对应的配置文件加入到keil或者其他IDE中对应的位置之后一起编译后烧录,就能实现FreeRTOS的移植了。这里我们以L431RCT6为例子进行移植。

移植步骤:

一,在keil(或其他编译器)的代码中创建freertos文件夹,之后再创建inc,src,port文件夹。(例如下图,注意看路径,我keil生成的代码在keilcode文件夹中,然后我创立了一个test1的项目文件夹,之后在test1文件夹中我建立了freertos文件夹来存放freertos相关的文件,然后在freertos文件夹中创立这三个文件夹)。

在这里插入图片描述

二,将FreeRTOS/Source/下的.c文件复制到/src中,将FreeRTOS/Source/include下的头文件复制到/inc中。

三,根据需要移植的板子的内核(M3/M4等)来选择,将FreeRTOS/Source/portable/RVDS中的port.c复制到/port中,再将portmacro.h复制到/inc中。

四,根据需要的内存管理方式,将FreeRTOS/Source/portable/MemMang中的heap1,2,3,4,5中的一个复制到port中。

五,从FreeRTOS/Demo文件夹中,找到与需要移植的板子架构最相近的架构的文件夹,复制其中的FreeRTOSConfig.h文件夹到/inc中。(F103的配置文件也适用于L431的配置文件,这里我们用的就是F103的配置文件,同时F103也是比较常用滴!)。

六,在keil中点击魔术棒,将之前的整理好的文件夹路径添加进来。

在这里插入图片描述

七,点击项目管理的图标,在侧面添加这些文件方便我们后面编辑。

在这里插入图片描述

八,修改FreeRTOSConfig.h配置文件

//我们在FreeRTOSConfig.h中添加如下宏定义
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler//这三个函数主要负责的是重新定向这三种中断,让FreeRTOS接手系统

此时编译,一般会出现如下错误:

在这里插入图片描述

这是因我们使用FreeRTOS的中断,时钟等函数替代掉原生的这些函数时,没有删除掉原有的函数定义,这时候我们需要:

//删除(注释掉)原有的
void SysTick_Handler()函数
void PendSV_Handler()函数
void SVC_Handler()函数

九,这个时候再编译,就可以啦!移植成功!需要注意的是,若编译通过,但是FreeRTOS的任务调度器并不运行,那么大概率是xPortSysTickHandler和SysTick_Handler没有重新#define的问题(也就是忘记了修改Config.h配置文件)。也就是原有的systick和FreeRTOS中的systick冲突了。解决方法如上,在FreeRTOSCongfig.h中需要重新#define。

十,注意,CubeMX中的时钟源需要进行更改,不要忘记:,否则也会出现编译通过但是任务调度器不工作的问题

在这里插入图片描述

相关文章:

FreeRTOS的裁剪与移植

文章目录 1 FreeRTOS裁剪与移植1.1 FreeRTOS基础1.1.1 RTOS与GPOS1.1.2 堆与栈1.1.3 FreeRTOS核心文件1.1.4 FreeRTOS语法 1.2 FreeRTOS移植和裁剪 1 FreeRTOS裁剪与移植 1.1 FreeRTOS基础 1.1.1 RTOS与GPOS ​ 实时操作系统(RTOS):是指当…...

能求一个数字的字符数量的程序

目录 开头程序程序的流程图程序输入与打印的效果例1输入输出 例2输入输出 关于这个程序的一些实用内容结尾 开头 大家好&#xff0c;我叫这是我58&#xff0c;今天&#xff0c;我们先来看一下下面的程序。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>…...

PTA-线性表实验(JAVA)

题目1&#xff1a;Josephus环的问题及算法 【实验内容】 编程实现如下功能&#xff1a; 题意说明&#xff1a;古代某法官要判决n个犯人的死刑&#xff0c;他有一条荒唐的法律&#xff0c;将犯人站成一个圆圈&#xff0c;从第start个犯人开始数起&#xff0c;每数到第distance的…...

LeetCode:494. 目标和

题目 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前添…...

HarmonyOS Next开发学习手册——选项卡 (Tabs)

当页面信息较多时&#xff0c;为了让用户能够聚焦于当前显示的内容&#xff0c;需要对页面内容进行分类&#xff0c;提高页面空间利用率。 Tabs 组件可以在一个页面内快速实现视图内容的切换&#xff0c;一方面提升查找信息的效率&#xff0c;另一方面精简用户单次获取到的信息…...

LeetCode2710.移除字符串中的尾随零

cpp class Solution { public:string removeTrailingZeros(string num) {int flag 0;string s num;int size num.length();for (int i num.length() - 1; i > 0; i--) {if (num[i] ! 0)break;if (num[i] 0) {size--;}}s.resize(size);return s;} };...

PPT录屏怎么录?PPT录屏,3种方法简单操作

在数字化时代&#xff0c;PPT已经成为我们日常工作、学习和生活中不可或缺的一部分。无论是商务报告、教学课件还是产品展示&#xff0c;PPT都能帮助我们更加生动、直观地传递信息。然而&#xff0c;有时候我们会面临PPT录屏怎么录的问题。这时&#xff0c;一个好的PPT录屏功能…...

HarmonyOS开发:应用完整性校验

简介 为了确保应用的完整性和来源可靠&#xff0c;OpenHarmony需要对应用进行签名和验签。 应用开发阶段&#xff1a; 开发者完成开发并生成安装包后&#xff0c;需要开发者对安装包进行签名&#xff0c;以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校…...

【MySQL基础篇】SQL指令:DQL及DCL

1、DQL DQL - 介绍 DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据表中的记录。&#xff08;在MySQL中应用是最为广泛的&#xff09; 查询关键字&#xff1a;SELECT DQL - 语法 SELECT 字段列表 FROM 表名列表 WHER…...

[C++][设计模式][适配器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将”一些现存的对象“放在新的环境中应用&#xff0c;但是新环境要求的接口是这些现存对象所不满足如何应对这些”迁移的变化“&#xff1f;如何既能利用现…...

8080时序驱动TFT显示屏 驱动IC GC9307

8080时序总共有控制线 CS片选线 DC(命令数据控制线) RD读控制线 WR写控制线 和N条数据线。 控制底层代码如下; 写读代码,读的代码反过来就行 inline void TFT8080WriteDat(unsigned char dat) {CS_L;//开始片选DC_H;//写数据 // RD_H;//禁止读WR_H;//禁止写WR_L;//写入…...

K8S 集群节点缩容

环境说明&#xff1a; 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233&#xff08;需下线&#xff09;192.168.99.2332C4Gwoker1.23.1720.10.24 1. K8S 集群节点缩容 当集群中有…...

Web-HTML-事件

1 需求 2 语法 3 示例 4 参考资料 HTML 事件 | 菜鸟教程...

Installed Build Tools revision xxx is corrupted. Remove and install again 解决

1.在buildTools文件下找到对应的sdk版本&#xff0c;首先将版本对应目录下的d8.bat改名为dx.bat。 2.在lib文件下将d8.jar改名为dx.jar。 3.重新编译工程即可...

AI 与 Python 实战干货:基于深度学习的图像识别

《AI 与 Python 实战干货&#xff1a;基于深度学习的图像识别》 今天咱不啰嗦&#xff0c;直接上干货&#xff01; 在 AI 领域&#xff0c;特别是图像识别方面&#xff0c;Python 简直是一把利器。咱就以手写数字识别为例&#xff0c;来看看怎么用 Python 实现一个深度学习模…...

万字长文详解数据结构:树 | 第6章 | Java版大话数据结构 | 二叉树 | 哈夫曼树 | 二叉树遍历 | 构造二叉树 | LeetCode练习

&#x1f4cc;本篇分享的大话数据结构中&#x1f384;树&#x1f384;这一章的知识点&#xff0c;在此基础上&#xff0c;增加了练习题帮助大家理解一些重要的概念✅&#xff1b;同时&#xff0c;由于原文使用的C语言代码&#xff0c;不利于学习Java语言的同学实践&#xff0c;…...

NPOI入门指南:轻松操作Excel文件的.NET库

目录 引言 一、NPOI概述 二、NPOI的主要用途 三、安装NPOI库 四、NPOI基本使用 六、性能优化和内存管理 七、常见问题与解决方案 八、结论 附录 引言 Excel文件作为数据处理的重要工具&#xff0c;广泛应用于各种场景。然而&#xff0c;在没有安装Microsoft Office的…...

【高性能服务器】服务器概述

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 服务器概述 服…...

003 SSM框架整合

文章目录 整合web.xmlapplicationContext-dao.xmlapplicationContext-service.xmlspringmvc.xmldb.propertieslog4j.propertiespom.xml 测试sqlItemController.javaItemMapper.javaItem.javaItemExample.javaItemService.javaItemServiceImpl.javaItemMapper.xml 整合 将工程的…...

web刷题记录(7)

[HDCTF 2023]SearchMaster 打开环境&#xff0c;首先的提示信息就是告诉我们&#xff0c;可以用post传参的方式来传入参数data 首先考虑的还是rce&#xff0c;但是这里发现&#xff0c;不管输入那种命令&#xff0c;它都会直接显示在中间的那一小行里面&#xff0c;而实际的命令…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...