首页 > 其他分享 >FreeRTOS学习笔记(二)

FreeRTOS学习笔记(二)

时间:2024-07-31 23:53:52浏览次数:15  
标签:文件 FreeRTOS void 笔记 学习 添加 SysTick OS

FreeRTOS移植

一、获取FreeRTOS源码

1.1官网下载

进入官网直接下载

官网:https://www.freertos.org/zh-cn-cmn-s/

在这里插入图片描述

1.2 正点原子网盘下载

正点原子资料v10.4.6

例程git : https://gitee.com/yuan-zhenbin/freertos-code-repository.git

FreeRTOS资料网盘: http://www.openedv.com/docs/book-videos/zdyzshipin/4free/newfreertos.html

二、源码内容

名称内容
Free RTOS内核
Free RTOS-PLUS组件
tools工具
Github-Free RTOS-HomeGithub仓库链接
Quick_Start_Guide快速入门官方指南
Upgrading-to-FreeRTOS-xxx升级指定版本文档链接
History历史更新记录
其他其他

2.1 FreeRTOS内核

名称描述
DemoFreeRTOS演示例程
License相关许可
Source**FreeRTOS内核源码
Test公用以及移植层测试代码
2.1.1 Demo

支持多种芯片架构,多种不同型号芯片

2.1.2 Source
名称描述
include包含头文件✔
portable包含移植文件✔
croutine.c协程相关文件
event_groups.c事件相关文件
list.c列表相关文件✔
queue.c队列相关文件✔
stream_buffer.c流式缓冲区相关文件
tasks.c任务相关文件✔
timer.c软件定时器相关文件
portable文件夹

建立软件硬件的桥梁,根据硬件和编译器选择文件:这里选择Keil、MemMang、RVDS。

名称描述
Keil指向RVDS文件夹
RVDS不同内核芯片的移植文件
MemMang内存管理文件

三、FreeRTOS移植

3.1 准备内容

Free RTOS源码

基础工程

3.2 移植步骤

  1. 添加FreeRTOS源码

  2. 添加FreeRTOS.h

  3. 修改SYSTEM文件夹中的sys.c 、 delay.c 、usart.c

  4. 修改中断相关文件,Systick中断、 SVC中断、 PendSV中断

  5. 添加应用程序,验证是否成功

3.3 进行移植

3.3.1添加RTOS文件

这里选择HAL库内存管理例程作为基础工程

在这里插入图片描述

在Middlewares新建FreeRTOS文件夹

在这里插入图片描述

将FreeRTOS源码部分拷贝进文件夹

在这里插入图片描述

可以选择删除portable中的文件夹,这里只保留Keil、MemMang、RVDS。

在这里插入图片描述

3.3.2将文件添加到工程

打开基础工程,新建两个文件分组。Middlewares/FreeRTOS_CORE和Middlewares/FreeRTOS_PORT

在这里插入图片描述

CORE添加对应的文件

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PORT添加对应的文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

添加头文件路径,将include和portable中对应的内核版本添加到头文件路径中

在这里插入图片描述

在这里插入图片描述

3.3.3 添加FreeRTOSConfig.h文件

裁剪不需要的功能,节约内存资源,有三种获取方式

  • 用户自行缩写,

  • 参考官方demo配置

  • 用正点原子官方写好的

拷贝到基础工程文件的User文件夹

在这里插入图片描述

3.3.4 修改system文件
修改sys.h

使其支持OS

在这里插入图片描述

修改usart.c

Free RTOS没有 µC/OS对于中断的处理机制。删除osintenter和osintexit

删除下列代码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

修改delay.c

删除35行到112

在这里插入图片描述

在这里插入图片描述

添加Free RTOS相关代码

extern void xPortSysTickHandler(void);

在这里插入图片描述

修改中断函数

在这里插入图片描述

改为

void SysTick_Handler(void)
{
 uint32_t ulPreviousMask;

 HAL_IncTick();
 /* OS 开始跑了,才执行正常的调度处理 */
 if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
 {
 ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();
 {
 /* Increment the RTOS tick. */
 if( xTaskIncrementTick() != pdFALSE )
 {
 /* Pend a context switch. */
 portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
 }
 }
 portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
 }
}

修改延时初始化函数

改为

void delay_init(uint16_t sysclk)
{
#if SYS_SUPPORT_OS
 uint32_t reload;
#endif
 HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
 g_fac_us = sysclk;

#if SYS_SUPPORT_OS
 reload = sysclk;
 /* 使用 configTICK_RATE_HZ 计算重装载值
 * configTICK_RATE_HZ 在 FreeRTOSConfig.h 中定义
 */
 reload *= 1000000 / configTICK_RATE_HZ;
 /* 删除不用的 g_fac_ms 相关代码 */
 SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
 SysTick->LOAD = reload;
 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
#endif
}

修改微秒函数

改为

void delay_us(uint32_t nus)
{
 uint32_t ticks;
 uint32_t told, tnow, tcnt = 0;
 uint32_t reload = SysTick->LOAD;
 /* 删除适用于 µC/OS 用于锁定任务调度器的自定义函数 */
 ticks = nus * g_fac_us;
 told = SysTick->VAL;
 while (1)
 {
 tnow = SysTick->VAL;
 if (tnow != told)
 {
 if (tnow < told)
 {
 tcnt += told - tnow;
 }
 else
 {
 tcnt += reload - tnow + told;
 }
 told = tnow;
 if (tcnt >= ticks)
 {
 break;
 }
 }
 }
 /* 删除适用于 µC/OS 用于解锁任务调度器的自定义函数 */
}


修改毫秒函数

改为

void delay_ms(uint16_t nms)
{
 uint32_t i;

 for (i=0; i<nms; i++)
 {
 delay_us(1000);
 }
}

修改头文件

/* 添加公共头文件 (FreeRTOS 需要用到) */
#include "FreeRTOS.h"
#include "task.h"
修改中断相关文件

在stm32f4xx_it.c中将HAL库提供的system,SVC,PendSV进行宏开关

导入sys.h

/* Includes --------------------------------------*/
/* 导入 sys.h 头文件 */
#include "./SYSTEM/SYS/sys.h"

在这里插入图片描述

将几个中断更改为条件编译

SVC

/**
 * @brief This function handles SVCall exception.
 * @param None
 * @retval None
 */
/* 加入宏开关 */
#if (!SYS_SUPPORT_OS)
void SVC_Handler(void)
{
}
#endif

PendSV

/**
 * @brief This function handles PendSVC exception.
 * @param None
 * @retval None
 */
/* 加入宏开关 */
#if (!SYS_SUPPORT_OS)
void PendSV_Handler(void)
{
}
#endif

SysTick

#if (!SYS_SUPPORT_OS)
void SysTick_Handler(void)
{
 HAL_IncTick();
}
#endif

最后一步

FreeRTOSconfig.h中,通过该定义找到需要修改的文件,此处为stm32f429xx.h

在这里插入图片描述

将4U改为4

在这里插入图片描述

编译

在这里插入图片描述

还可以做的事

修改工程目标名称

在这里插入图片描述

移除USMART调试组件,删除main.c的引用。

在这里插入图片描述

添加定时器驱动

在这里插入图片描述

结束

烧入程序测试是否成功

标签:文件,FreeRTOS,void,笔记,学习,添加,SysTick,OS
From: https://blog.csdn.net/qq_57679627/article/details/140835012

相关文章

  • 基于SpringBoot+Vue+uniapp的经典诗文学习爱好者学习交流平台(源码+lw+部署文档+讲解
    在这里插入图片描述@toc前言......
  • KLC 数点学习笔记
    KLC数点由KLC大神在模拟赛中发明。其算法复杂度与答案值域大小挂钩。其能解决的问题一般有着如下的特点:给定一个序列,每次询问一个区间有多少个子区间满足什么性质,数据随机生成。其算法流程为:通过某种方法预处理出所有满足性质的子区间将得到的区间表示在二维平面上......
  • 学习日记:一维字符型数组
    目录1.格式2.字符串长度3.字符数组的输入输出3.1gets函数3.2puts函数3.3scanf函数3.4printf函数4.字符串处理函数4.1strlen函数(计算数组长度)4.2strcpy函数(复制字符串)4.3strcat函数(拼接字符串)4.4strcmp函数(比较字符串)1.格式数据类型数组名[数......
  • 多输入多输出预测:在Scikit-Learn中打造灵活的机器学习模型
    多输入多输出预测:在Scikit-Learn中打造灵活的机器学习模型在机器学习领域,Scikit-learn(简称sklearn)是一个功能强大且广泛使用的Python库。它提供了众多简单而有效的工具,用于数据挖掘和数据分析。然而,sklearn大多数内置的模型仅支持单输入单输出(SISO)的预测。当面对多输入多输......
  • html学习
    1、前期准备1、语法规范1、所有的标签都必须包含在开始标签结束标签,里面都是成对出现的,但是有些标签是单标签,,但是单标签非常的少2、标签关系包含关系就是嵌套的关系(父子关系),html包含了head这个标签并列关系head和body是并列关系3、结构标签html标签是......
  • 什么样的人适合学习网络安全?
    一、引言在当今数字化的时代,网络安全已经成为了一个至关重要的领域。随着网络攻击的日益频繁和复杂,对于网络安全专业人才的需求也在不断增长。然而,并不是每个人都适合学习网络安全。那么,究竟什么样的人适合投身于这个充满挑战和机遇的领域呢?二、适合学习网络安全的人群特点......
  • 笔记:从Aurora 8b/10b 到Aurora 64b/66b (一):64b/66b 基本知识
    参考搬运:https://mp.weixin.qq.com/s/ZSNyjpZpimjyxyO9riIRNQAurora64B/66B(xilinx.com)https://docs.amd.com/r/en-US/pg074-aurora-64b66b8/10:SATASRIO64/66:10G以太网值得注意:64b/66b编码在多LANE模式下,EOF(T)仅在一个LANE上出现;介绍8B10B的开销比较大,每传输10位数......
  • 【学习笔记】KMP
    【学习笔记】KMP因为字符串对我太抽象了,所以只能以水的心态写这个KMP。感觉考到字符串的题肯定要崩。以下均规定字符串\(S\)以下标0开头。前缀函数:给定一个长度为\(n\)的字符串\(S\),其前缀函数被定义为一个长度为\(n\)的数组\(\pi\)。简单来说\(\pi[i]\)就是,子......
  • 后缀数组学习笔记
    前言后缀数组(SuffixArray,简称SA)是一种解决某些字符串问题的常用工具。解决这些字符串问题时,经常用后缀数组对问题进行一定的转化成其它的模型,然后套用那个模型的解决方法加以解决原问题。附题单约定本文做以下约定:本文撰写时间跨度较大,有些符号会出现正体、斜体混用的情......
  • 业务逻辑学习!
    获取地址列表方法传入一个token参数,首先解析获取token信息获取用户id构建查询条件,指定查询的用户id设置查询结果按照地址进行降序调用dao层查询然后返回查询条件为启用的json数组首先创造查询条件,条件为1的,即状态为启用的调用dao层进行查询返回一个数组对象遍历......