示例1:FreeRTOS移植详解_基于HAL库工程

1、开发环境

(1)Keil MDK: V5.38.0.0

(2)STM32CubeMX: V6.8.1

(3)MCU: STM32F103C8(F1系列软仿真最方便)

(4)ARM编译器:V5(使用V6编译会报错)

2、移植准备工作

(1)用于移植FreeRTOS的基础工程。

  • 时钟已配置好
  • 串口已配置好
  • printf已经重定向到串口1

(2)FreeRTOS官网下载的带示例的源码。

(3)printf重定向程序

int fputc( int ch, FILE *f )
{USART_TypeDef *USARTx = USART1;while( (USARTx->SR & (1<<7)) == 0);  // 等待上次的数据发送完成USARTx->DR = ch;return ch;
}

3、添加FreeRTOS源码

(1)在基础工程中新建Middlewares文件夹。如下图所示:

(2)将FreeRTOS源码的FreeRTOS整个文件复制到工程的Middlewares文件夹中。

(3)FreeRTOS文件下只保留Source,其余均删除。

(4)Source目录下保留以下文件。

(5)portable目录下保留以下文件。

 (6)RVDS目录下保留用到的架构文件,STM32F1系列使用ARM_CM3。

4、添加FreeRTOSConfig.h文件

(1)FreeRTOSConfig.h 是 FreeRTOS 操作系统的配置文件, FreeRTOS 操作系统是可裁剪的,用
户可以根据需求对 FreeRTOS 进行裁剪,裁剪掉不需要用到的 FreeRTOS 功能,以此来节约 MCU中寸土寸金的内存资源。

(2)FreeRTOSConfig.h获取途径

  • 自己编写
  • FreeRTOS官方源码中Demo(示例工程)下的FreeRTOSConfig.h。(后续根据需要在进行相应修改)

(3)将官方示例中的FreeRTOSConfig.h文件复制到“FreeRTOS_01_Create_Task\Middlewares\FreeRTOS\Source\portable”目录下。也可选择其他自己认为更合适的目录。

5、将FreeRTOS源码添加到Keil工程

(1)KeilMDK打开工程,新建两个文件分组,分别为 Middlewares/FreeRTOS_CORE 和
Middlewares/FreeRTOS_PORT,如下图所示:

(2)Middlewares/FreeRTOS_CORE 分组用于存放 FreeRTOS 的内核 C 源码文件,将 “FreeRTOS_01_Create_Task\Middlewares\FreeRTOS\Source”目录下的.c文件添加到该分组。

(3)Middlewares/FreeRTOS_PORT 分组用于存放 FreeRTOS 内核的移植文件。

  • 添加“Middlewares\FreeRTOS\Source\portable\RVDS\ARM_CM3”目录下的port.c文件。
  • 添加“Middlewares\FreeRTOS\Source\portable\MemMang”目录下的heap_4.c文件。

 (4)添加头文件路径。

6、修改stm32f1xx_it.c文件

(1)添加下面三个函数。

extern void xPortPendSVHandler(void);
extern void xPortSysTickHandler(void);
extern void vPortSVCHandler(void);

(2)修改SVC_Handler函数。

(3)修改PendSV_Handler函数。

(4)修改SysTick_Handler函数。

7、修改时基

(1)在STM32 HAL的项目中,一般需要考虑两个时基:

  • HAL时基、SYS时基源
  • 操作系统时基

(2)在裸机程序中,SYS时基源默认使用SysTick;在RTOS中,SYS时基源修改为其他定时器,RTOS上基使用SysTick。

(3)修改SYS时基为其他定时器,这里修改为TIM4。

(4)SYS时基源和RTOS时基源也可以共用SysTick,但CubeMX不建议这么用,既然不建议,那我们就不用呗。

8、创建任务示例

8.1、程序结构

(1)芯片厂商提供的芯片操作库,如STM32的标准库和HAL库。

(2)FreeRTOS的源码。

(3)用户编写的源码。

8.2、程序编写

(1)使用两个函数分别创建两个任务;需要包含头文件"FreeRTOS.h"和"task.h"。

(2)任务1的代码

/*任务1的函数*/
void vTask1( void * param)
{while(1){printf("1");}
}

(2)任务2代码

/*任务2的函数*/
void vTask2( void * param)
{while(1){printf("2");}
}

(3)main函数

int main( void )
{...xTaskCreate(vTask1, "task1", 100, NULL, 1, NULL);   /*创建任务1*/xTaskCreate(vTask2, "task2", 100, NULL, 1, NULL);   /*创建任务2*//* 启动调度器 */vTaskStartScheduler();
}

(4)运行效果(也可以软件仿真)

8.3、完整工程下载地址

(1)完整工程存储再码云。

(2)FreeRTOS_CSDN: 用来保存FreeRTOS学习使用中用到的程序

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

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

相关文章

Android性能优化----执行时间优化

作者&#xff1a;lu人皆知 在APP做启动优化时&#xff0c;Application会做一些初始化的工作&#xff0c;但不要在Application中做耗时操作&#xff0c;然而有些初始化工作可能是很耗时的&#xff0c;那怎么办&#xff1f;初始化操作可以开启子线程来完成。 计算执行时间 常规…

MySQL的select ... where ...会加锁吗?

先说答案&#xff1a;不会。但select … where … lock in share mode会加锁。实验如下。 存储引擎innodb&#xff0c;MySQL版本5.7。 1&#xff1a;select … where … 如下图&#xff1a; 1&#xff1a;select … where … lock in share mode 如下图&#xff1a; 接着我…

【SpringCloud】SpringCloudAlibaba官网资料

出现原因 Spring Cloud Netflix Projects Entering Maintenance Mode 官网 博客 https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md官网 https://spring.io/projects/spring-cloud-alibaba#overview英文 https://github.com/alibaba/spring-cloud-…

五种消息模型简单说明

五种消息模型简单说明 RabbitMQ提供了6种消息模型&#xff0c;但是第6种其实是RPC&#xff0c;并不是MQ&#xff0c;因此不予学习。那么也就剩下5种。但是其实3、4、5这三种都属于订阅模型&#xff0c;只不过进行路由的方式不同。  我们通过一个demo工程来了解下RabbitMQ的…

pytest自动化框架运行全局配置文件pytest.ini

还记得在之前的篇章中有讲到Pytest是目前主要流行的自动化框架之一&#xff0c;他有基础的脚本编码规则以及两种运行方式。 pytest的基础编码规则是可以进行修改&#xff0c;这就是今日文章重点。 看到这大家心中是否提出了两个问题&#xff1a;pytest的基础编码规则在哪可以…

【算法C++实现】5、二叉树

二叉树节点结构体 class Node { public:int val;Node* left;Node* right;Node(int a) : val(a), left(nullptr), right(nullptr) {}Node(int a, Node* l, Node* r): val(a), left(l), right(r) {}}1、递归遍历 递归遍历二叉树&#xff0c;每个节点的遍历顺序叫递归序&#xf…

软件工程模型-架构师之路(四)

软件工程模型 敏捷开发&#xff1a; 个体和交互 胜过 过程和工具、可以工作的软件 胜过 面面俱到的文件、客户合作胜过合同谈判、响应变化 胜过 循序计划。&#xff08;适应需求变化&#xff0c;积极响应&#xff09; 敏捷开发与其他结构化方法区别特点&#xff1a;面向人的…

代码随想录第27天|39. 组合总和,40.组合总和II,131.分割回文串

39. 组合总和 分析这道题的搜索过程如下&#xff1a; 因为这道题没有限制要搜索几层&#xff0c;所以可以一直搜索直到sumtarget或者sum>target就return 回溯三部曲 1.递归函数参数 本题还需要startIndex来控制for循环的起始位置&#xff0c;对于组合问题&#xff0c;什么…

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布

[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础…

在ARM服务器上一键安装Proxmox VE(以在Oracle Cloud VPS上为例)(甲骨文)

前言 如题&#xff0c;具体用到的说明文档如下 virt.spiritlhl.net 具体流程 首先是按照说明&#xff0c;先得看看自己的服务器符不符合安装 Proxmox VE的条件 https://virt.spiritlhl.net/guide/pve_precheck.html#%E5%90%84%E7%A7%8D%E8%A6%81%E6%B1%82 有提到硬件和软…

CSS 选择器

前言 基础选择器 以下是几种常见的基础选择器。 标签选择器&#xff1a;通过HTML标签名称选择元素。 例如&#xff1a; p {color: red; } 上述样式规则将选择所有<p>标签 &#xff0c;并将其文字颜色设置为红色。 类选择器&#xff1a;通过类名选择元素。使用类选择…

课程项目设计--spring security--用户管理功能--宿舍管理系统--springboot后端

写在前面&#xff1a; 还要实习&#xff0c;每次时间好少呀&#xff0c;进度会比较慢一点 本文主要实现是用户管理相关功能。 前文项目建立 文章目录 验证码功能验证码配置验证码生成工具类添加依赖功能测试编写controller接口启动项目 security配置拦截器配置验证码拦截器 …

电脑上安装,多版本node

手上有一个vue3的项目&#xff0c;sass配置如下图所示&#xff1a; 安装了Python3.10和node 16.14.0&#xff0c;项目能正常install 跟run。 因工作需要&#xff0c;收上有一个vue2的项目&#xff0c;sass配置如下图所示&#xff1a; 执行npm intsall 的时候一直报Python2找不…

2022年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数组逆序重放 将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。 输入 输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两个整数之间用空格分隔。 输出 输出为一行:输出逆序后数组的整数,每两个整数之间…

Java云原生框架Quarkus初探

Java云原生框架Quarkus初探 Quarkus 介绍 Quarkus 是一个云原生&#xff0c;容器优先的Java应用框架&#xff0c;它号称是超音速和亚原子的框架&#xff0c;主要特点是构建速度、启动速度快和占用资源少等特点。它为OpenJDK HotSpot和GraalVM量身定制&#xff0c; 根据Java库和…

常用消息中间件介绍

RocketMQ 阿里开源&#xff0c;阿里参照kafka设计的&#xff0c;Java实现 能够保证严格的消息顺序 提供针对消息的过滤功能 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RabbitMQ Erlang实现&#xff0c;非常重量级&#xff0c;更适…

Nevron 3DChart Crack,可视化界面在运行时可用

Nevron 3DChart Crack,可视化界面在运行时可用 3DChart使用OpenGL 3D图形引擎创建复杂的2D和3D图表&#xff0c;这些图表可以包含静态或动画图像。3DChart包括一个用于生成图表模板的独立应用程序和一个ASP服务器配置实用程序。该组件还包括一个专门设计用于与3DChart集成的工具…

java版本企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发

java版本企业电子招标采购系统源码Spring Cloud Spring Boot 二次开发 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草…

Scratch 游戏 之 随机大地图生成教程

在很多生存 / 沙盒类游戏中&#xff0c;地图往往是随机生成的&#xff0c;例如&#xff1a;饥荒、我的世界等。那我们该如何在scratch中实现这一点呢&#xff1f; 在scratch中有两种办法可以实现——画笔和克隆体。我们这次先聊克隆体。 我们可以先将克隆体设置为方形的&#x…