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

news/2024/11/16 19:48:26/

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.ppmy.cn/news/1050059.html

相关文章

马蹄集 第九次oj赛

目录 MT2188单条件和 8421码 余3码 永恒之2 新十六进制 人脑计算机 二进制&#xff1f;不同&#xff01; 三进制计算机1 三进制计算机2 excel的烦恼 MT2188单条件和 号难度&#xff1a;黄金© 时间限制&#xff1a;1秒 巴占用内存&#xff1a;128M ★收藏△报错 “单…

如何将PDF文件转换为PPT文件?

如何将pdf转换成ppt&#xff1f;PDF文件作为常用的文件格式&#xff0c;不仅可以在教学过程中使用&#xff0c;还可以在营销展会、培训讲座等过程中使用。欧迪芬文件的使用&#xff0c;能够在一定程度上提升我们的办公效率。对于PDF文件来说&#xff0c;其中包含的元素非常多&a…

Spring练习-29(角色添加操作)

1、点击新建 2、添加角色名称和信息之后&#xff0c;添加到数据库当中&#xff0c;与此同时你的页面要跳回 3、跳回角色列表页面 4、那是入口&#xff0c;入口就是保存 5、当你保存到表单里就是提交呀&#xff01; 6、流程是我把数据封装给某个方法&#xff1a;------》封装给一…

HTTPS 握手过程

HTTPS 握手过程 HTTP 通信的缺点 通信使用明文&#xff0c;内容可能被窃听(重要密码泄露)不验证通信方身份&#xff0c;有可能遭遇伪装(跨站点请求伪造)无法证明报文的完整性&#xff0c;有可能已遭篡改(运营商劫持) HTTPS 握手过程 客户端发起 HTTPS 请求 用户在浏览器里…

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

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

Java中的装箱和拆箱以及经典的面试题:1.三元运行符是一个整体,精度自动转换,if_else是单独的。2.自动装箱和拆箱的底层源码

1.在JDK1.5之前是手动装箱和手动拆箱的 手动装箱的2种实现方式&#xff1a; &#xff08;1&#xff09;Integer.valueOf(n) &#xff08;2&#xff09;new Integer(n) 手动拆箱的实现方法&#xff1a;integer.intValue() 2.在JDK1.5以后(包含1.5)是自动装箱和自动拆箱的 自动装…

C# 流Stream详解(1)——读写txt和二进制文件

【读写txt文件】 电脑手机上有各种各样的文件&#xff0c;例如视频文件、图片文件、文本文件&#xff0c;其中读写txt文件是最简单的&#xff0c;有多种方式&#xff0c; 使用StreamReader和StreamWriter //读取文件 string path "C:\example.txt"; // 文件路径 …

《你当像鸟飞往你的山》 书目总结

《你当像鸟飞往你的山》 书目总结