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

news2024/11/16 16:32:32

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

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

相关文章

《YOLO小目标检测》专栏介绍 CSDN独家改进创新实战专栏目录

&#x1f4a1;&#x1f4a1;&#x1f4a1;Yolo小目标检测&#xff0c;独家首发创新&#xff08;原创&#xff09;&#xff0c;适用于Yolov5、Yolov7、Yolov8等各个Yolo系列&#xff0c;专栏文章提供每一步步骤和源码&#xff0c;带你轻松实现小目标检测涨点 &#x1f4a1;&…

【二分查找篇】速刷牛客TOP101 高效刷题指南

文章目录 17、BM17 二分查找-I18、BM18 二维数组中的查找19、BM19 寻找峰值20、BM20 数组中的逆序对21、BM21 旋转数组的最小数字22、BM22 比较版本号23、BM23 二叉树的前序遍历 17、BM17 二分查找-I 思路步骤&#xff1a; step 1&#xff1a;从数组首尾开始&#xff0c;每次取…

wustojc日期格式变化

#include <stdio.h> int main() {char a[10];for(int i0;i<10;i){//用一个耍聪明的方法&#xff0c;全部用数组存储&#xff1b;面向结果编程a[0]getchar();}printf("%c%c%c%c%c%c%c%c%c%c",a[6],a[7],a[8],a[9],a[2],a[0],a[1],a[5],a[3],a[4]);return 0;}…

什么是跳跃表 ? 说一说跳跃表的查询和新增流程 ?

1.什么是跳跃表&#xff08;Skip List&#xff09; 跳跃表是 ZSet 有序列表底层的一种实现&#xff0c;也成为跳表。它通过添加多层链表的方式&#xff0c;用于在有序集合中进行高效的查找操作。 简单跳跃表的结构图&#xff1a; 从图中可以看出跳跃表有这些特征&#xff1a; …

Nginx-URLRewrite伪静态

URLRwrite是指将真实地址隐藏&#xff0c;用户访问是通过伪地址进行访问&#xff0c;这样可以隐藏URL中的传参等等 URLwrite演示&#xff0c;浏览器输入伪URL&#xff0c;回车会跳转到真实URL Rewrite匹配规则 redirect是指当请求伪装地址后&#xff0c;页面会直接跳转到真实…

基于微信小程序的上门维修评价系统_22c7h-

随着科学研究的不断深入&#xff0c;有关上门维修的各种信息量也在成倍增长。面对庞大的信息量&#xff0c;就需要有上门维修系统来提高管理工作的效率。通过这样的系统&#xff0c;我们可以做到信息的规范管理和快速查询&#xff0c;从而减少了管理方面的工作量。 建立基于微信…

聊聊 Docker

聊聊 Docker Docker 是什么&#xff1f; 定义 Docker 是一款 开源的应用容器引擎。 简单来说&#xff0c;就是 以容器虚拟化技术为基础的软件。可以把应用程序和所依赖的包一起打包到一个可移植的镜像中&#xff0c;发布到 Linux 或者 Windows 上运行。&#xff08;代码 运…

数据通信——传输层(传输层概述)

引言 终于到传输层了&#xff0c;网络层还有很多需要补充的&#xff0c;后期在慢慢填补了。 我们看哈&#xff01;在物理层我们设计出来各种硬件&#xff0c;然后使它们在物理上相互连接&#xff0c;信号以比特流的形式进行发送&#xff1b;随后&#xff0c;在数据链路层&#…

Mybatis介绍和搭建(详细搭建步骤)

目录 一、mybatis介绍 官方简介 通俗易懂 二、搭建步骤 1.创建Maven项目 2.创建数据库并建表和相关类 3.创建全局配置文件,配置数据库连接信息 4.配置sql映射文件 5.测试 一、mybatis介绍 官方简介 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存…

C语言和JavaScript中的默认排序行为对比

前言 今天在js里使用sort时遇见了一个不理解的现象 即使用sort默认排序后 9 从排序前的第一位被排到了最后一位.一开始我对js sort的理解和c一样&#xff0c;然后通过查阅后发现并不是这样. 正文 排序是一项常见而重要的操作。不同的编程语言提供了不同的排序函数&#xf…

Vue开发中如何解决国际化语言切换问题

Vue开发中如何解决国际化语言切换问题 引言&#xff1a; 在如今的全球化时代&#xff0c;应用程序的国际化变得越来越重要。为了让不同地区的用户能够更好地使用应用程序&#xff0c;我们需要对内容进行本地化&#xff0c;以适应不同语言和文化环境。对于使用Vue进行开发的应用…

ROS2 中的分布式系统

一、说明 当您运行 ROS2 应用程序时&#xff0c;通常需要在不同机器的不同位置运行 ROS2 节点。由于 ROS2 在抽象的 DDS 层中使用节点之间的通信&#xff0c;因此我们可以非常轻松地安排通信。 为了充分理解 ROS2 的架构&#xff0c;我建议您熟悉本文。 出于本文的目的&#xf…

Java 计算生肖,java Data中获取年,根据生日日期获取生肖注解,根据输入时间获取生肖,自定义注解的方式获取生肖 根据年份时间获取十二生肖

最近&#xff0c;开发中需要增加生肖&#xff0c;但是不想增加字段&#xff0c;于是通过注解的方式&#xff0c;实现生日与生肖的转换。 话不多说&#xff0c;直接上代码&#xff0c;如下&#xff1a; 实体类中的字段&#xff0c;添加自定义注解&#xff08;ToChineseZodiacSe…

各地区-不同行业-就业、失业、工资144个指标(1990-2021年)

一、数据介绍 数据名称&#xff1a;各地区-不同行业-就业、失业、工资144个指标 数据年份&#xff1a;1990-2021年&#xff08;1990-2007缺失较多&#xff09; 数据样本&#xff1a;994条 数据整理&#xff1a;自主整理 二、参考文献 [1]戚聿东,刘翠花,丁述磊.数字经济发展…

数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程

几个月之前写的一个项目&#xff0c;通过这个项目&#xff0c;你能学到关于数据库的触发器知识&#xff0c;python的基本语法&#xff0c;python一些第三方库的使用&#xff0c;包括python如何将前后端连接起来&#xff08;界面和数据&#xff09;&#xff0c;还有界面的设计等…

Python OCR 使用easyocr库将图片中的文章提取出来

Python OCR 使用easyocr库将图片中的文章提取出来 初环境内容步骤一&#xff1a;安装easyocr库步骤二&#xff1a;导入必要的库步骤三&#xff1a;创建OCR阅读器对象步骤四&#xff1a;指定要识别的图片路径步骤五&#xff1a;执行OCR识别并提取文章内容步骤六&#xff1a;遍历…

vscode如何关闭受限模式

受限模式旨在实现安全地浏览代码 第一步&#xff1a; 第二步&#xff1a;输入trust,找到Security.workspace.trust,取消勾选 第三步&#xff1a; 重启vscode.

企业都在用的热门客服系统

客户服务是现如今企业抢占市场的重要因素。客户越来越重视企业服务&#xff0c;而优质的客户服务也会为企业带来正向且长期的收益。而市场上这么多客户服务系统哪个好用&#xff1f; 企业选购好用的客户服务系统的时候要注意以下几点&#xff1a; 一、选购注意事项&#xff1…

TheGem主题 - 创意多用途和高性能WooCommerce WordPress主题/网站

TheGem主题概述 – 适合所有人的TheGem 作为设计元素、样式和功能的终极 Web 构建工具箱而设计和开发&#xff0c;TheGem主题将帮助您在几分钟内构建一个令人印象深刻的高性能网站&#xff0c;而无需触及一行代码。不要在编码上浪费时间&#xff0c;探索你的创造力&#xff01…

Python“牵手”1688商品详情数据采集方法,1688API申请步骤说明

1688平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。 1688API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问1688平台的数据&#xff0c;包括商品信息、店铺信息、物流信息&#xff0c;评论数据&#xff0c;店铺订…