FreeRTOS系统移植

前言

学习RTOS之前最重要的就是要学会将系统移植到单片机中,这里可以直接使用cubemx生成移植好的工程,也可以下载库来进行自己移植,这里我选择下载库来自己移植,因为这样可以配合Linux开发stm32单片机程序。

一、下载系统代码

首先打开FreeRTOS的官网这个是中文站点,所以速度很快,然后点击下载:

在下载里面不要最新的系统,这里我需要V9.0.0就可以了,因为高版本的增加了很多物联网相关的内容,对于我们现在的系统开发不太需要,所以这里点击更多下载

然后选择下面不带LTS的,LTS没有示例项目,有一些文件我们需要在示例工程中拿,然后需要转到github中去下载

来到GitHub中是最新版本,我们要找老版本需要点击Code转去代码那里,然后找到V9.0.0的代码

来到了后在标签这找到V9.0.0

然后点击下载zip格式的文件

下载完成后就可以解压,解压完成就是下面这几个软件

可以看到有两个文件夹,一个是FreeRTOS,另一个是FreeRTOS-Plus,这两个是有区别的,第一个是内核,是我们需要的,第二个Plus的是在内核的基础上增加了一系列扩展组件和工具,提供了更丰富的功能和更高层次的抽象,例如,包含文件系统、TCP/IP 协议栈、USB 主机 / 设备栈、安全功能(如加密库)、图形用户界面(GUI)库等。如果做一些高级的东西可以用这个,但我们现在只是学习,选择第一个基础的就可以了。

打开第一个文件夹后会有三个文件夹,我们先看Source文件夹,在Source文件夹中存放的是内核源代码和对应的头文件

Source文件夹中有一个portable这个是内核文件,其中内核文件是分平台的,这个平台是编译器的平台,比如我们用Keil,那就在这个文件夹中找到Keil进行移植就可以了,但是这里不能直接把Keil文件夹直接拿过去用,原因在移植的时候会说

然后在include文件夹中存放的是对应的头文件

回到上一层,有一个Demo文件夹,这个文件夹就是每个芯片所对应的示例工程,有一些文件我们需要在这个示例文件中

然后我们就可以开始工程的移植了。

二、移植工程

这里需要拿之前做好的标准库工程来进行改,只需要在做好的工程来新增文件就可以了,打开工程后点击这个三个正方形设置文件

在这里面新建一个freeRTOS文件夹,在里面添加一下的.c文件,我这为了工程的干净,不增加.h文件了

然后点击Options中点击C/C++点击Include Paths中的三个点,增加一下编译文件目录

需要添加的文件目录如下:

然后在main.c中增加两个头文件,并且添加一个测试的内容,这里使用的是最小系统上的测试灯,所以需要进行一下初始化

然后编写一下控制函数

编写一下任务函数,记得这个任务函数的格式是void TaskName(void*)

然后在main.c中创建任务并且进行任务的调度:

int main(){NVIC_SetPriorityGrouping(NVIC_PriorityGroup_4); // 设置中断优先级分组为第四组 这个是为了后面的定时器需要增加的Init_Led();xTaskCreate(LED_Test, "LED_Test", 128, NULL, 1, NULL); // 创建任务vTaskStartScheduler();                          // 调度任务while(1){}
}

作为上面的操作后还不能进行测试,如果这样测试的话会导致在vTaskStartScheduler()函数的位置卡死,因为还没有移植成功,需要先在freeRTOSConfig.h文件中的最后面添加这三个宏定义:

#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
#define vPortSVCHandler SVC_Handler

然后在stm32f10x_it.c中需要注释一下这三个回调函数,因为这三个回调函数在系统中是进行了一下实现的,如果还没有,那会重复定义:

这样就可以编译并且运行测试了,可以看到LED灯在闪烁。

三、完整代码

#include "stm32f10x.h"                  // Device header
#include "freertos.h"
#include "task.h"void Init_Led(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);
}void LED_Cmd(uint8_t bit)
{if (bit == 1){GPIO_ResetBits(GPIOA, GPIO_Pin_5);}else if (bit == 0){GPIO_SetBits(GPIOA, GPIO_Pin_5);}
}void LED_Test(void* param)
{while(1){LED_Cmd(1);vTaskDelay(500);LED_Cmd(0);vTaskDelay(500);}
}int main(){NVIC_SetPriorityGrouping(NVIC_PriorityGroup_4); // 设置中断优先级分组为第四组Init_Led();xTaskCreate(LED_Test, "LED_Test", 128, NULL, 1, NULL); // 创建任务vTaskStartScheduler();                          // 调度任务while(1){}
}

总结

这是一小步,但是系统学习和高级功能实现的一大步,好好搞一下就ok了。

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

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

相关文章

MySQL 事务及MVCC机制详解

目录 什么是事务 事务的隔离级别 数据库并发的三种场景 读-写 什么是事务 事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们…

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码,导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址:icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …

arkime安装

这次试一下新的办法 先下载centOS 7 然后改成阿里云镜像 输入命令备份官方yum源配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 下载阿里云源配置,覆盖原文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…

/usr/bin/ssh-copy-id: ERROR: no identities found 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于springboot+thymeleaf+Redis仿知乎网站问答项目源码

项目介绍 基于springbootthymeleafRedis仿知乎网站问答项目源码,可以作为毕业设计项目参考学习 按照需要一定动手能力 发文章,发视频,发想法,提问回答,注册登录 开发环境 使用技术:springbootthymeleafRe…

apisix的authz-casbin

目录 1、apisix的auth-casbin官方介绍 2、casbin介绍和使用 2.1基本知识: 2.2使用例子 3、配置插件 4、postman调用 5、auth-casbin的坑 1、apisix的auth-casbin官方介绍 authz-casbin | Apache APISIX -- Cloud-Native API Gateway 2、casbin介绍和使用 c…

自动驾驶之DriveMM: All-in-One Large Multimodal Model for Autonomous Driving

1. 写在前面 工作之后,主要从事于偏工程比较多的内容, 很少有机会读论文了,但2025年,由于之前有些算法的背景, 后面可能会接触一些多模态大模型相关的工作,所以又调头有点往算法的方向偏移, 而算法呢,很重要的一点就是阅读论文。2025年,再拾起论文这块的工作。 今天…

BGP分解实验·9——路由聚合与条件性通告(1)

路由聚合是有效控制缩减BGP路由表的方法之一,路由聚合的前提和IGP一样,需要有路由目标存在BGP表中,与IGP不同的是,BGP路由聚合可以定义按需抑制路由的能力。 实验拓扑如下所示: 现在开始把从R1的R5的基础配置先准备好…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Lin…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char (属于整形家族)类型 2. 位段的空间上是按照需要以4个字节( 类型 int )或者1个字节( char )的方式来开辟的。 3. 位段涉及…

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元,干翻Ansys的目标”,基本框架为前端显示使用QT实现交互,后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

【C++篇】红黑树封装 实现map和set

目录 前言&#xff1a; 一&#xff0c;库中map和set的大致结构 二&#xff0c;模拟实现 2.1&#xff0c;大致框架 2.2&#xff0c;复用红黑树实现insert接口 2.3&#xff0c;迭代器iterator的实现 operator()的实现&#xff1a; operator--()的实现&#xff1a; 对inser…

写作利器:如何用 PicGo + GitHub 图床提高创作效率

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

RabbitMQ 高级特性

目录 1.消息确认 1.1 消息确认机制 1.2 手动确认方法 1. 2.1肯定确认 1.2.2 否定确认 1.3 SpringBoot 代码示例 1.3.1 配置确认机制 1.3.2 配置队列,交换机,绑定关系 1.3.3 生产者(向 rabbitmq 发送消息) 1.3.4 消费者(消费队列中的信息) 2.持久性 2.1 交换机…

AIGC视频生成模型:Meta的Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…

面向对象的程序设计:以对象的方式进行思考

1 理解接口与实现的区别 以上一篇文章的电视机需要插电使用的例子继续来讲解: 对电视而言,插电使用,只需要标准的插座即可,具体的电从哪里来,是火力发电厂,或是太阳能发电,亦或是畜电池逆变供电,电视机是不需要关心的。 发电厂或供电设备属于实现,220V交流电插座属于…

要获取本地的公网 IP 地址(curl ifconfig.me)

文章目录 通过命令行查询&#xff08;适用于 Linux/Mac/Windows&#xff09;Linux/MacWindows 注意事项 要获取本地的公网 IP 地址&#xff0c;可以通过以下简单的方法&#xff1a; 通过命令行查询&#xff08;适用于 Linux/Mac/Windows&#xff09; Linux/Mac 打开终端。输入…