FreeRTOS学习笔记—FreeRTOS移植

news2024/11/15 16:01:44

文章目录

  • 一、FreeRTOS移植
    • 1.1 将FreeRTOS的源码添加到工程
    • 1.2 修改部分文件
      • 1.2.1 修改 SYSTEM 文件
      • 1.2.2 修改 usart.c 文件
      • 1.2.3 修改 delay.c 文件
  • 二、FreeRTOS移植测试

一、FreeRTOS移植

这里以博主STM32俗称笔记系列的GPIO工程文件为例,学习一下如何进行FreeRTOS移植。

1.1 将FreeRTOS的源码添加到工程

在工程文件中新建一个“FreeRTOS”文件夹,将之前下载的V9.0.0文件中“source”文件夹中的文件全部复制粘贴到新建的文件夹中。
FreeRTOS源文件

其中“portable”文件夹中只需要保留下面这三个文件即可,别的都可以删掉

protable保留的文件

  • Keil —— 使用MDK编译环境所需要使用的文件
  • MemMang —— 内存管理相关文件,移植所必需的
  • RVDS —— 使用MDK编译环境所需要的文件

将.c和.h文件添加到Keil5

将FreeRTOS文件添加到Keil5

这里可以看到,编译之后提示了8个错误。错误内容是..\FreeRTOS\include\FreeRTOS.h(98): error: #5: cannot open source input file "FreeRTOSConfig.h": No such file or directory。这里仔细检查了一下,发现下载的V9.0.0的FreeRTOS源文件中确实缺少这个文件,这里博主自行找了一个,补上了。检查了一下下载的压缩包,确实是没有,不知道大家有没有遇到这个问题。

添加完缺少的“FreeRTOSConfig.h”之后,再次编译。发现依旧报错

补充完文件之后报错提示
错误内容是
..\OBJ\KEY.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f10x_it.o).
..\OBJ\KEY.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f10x_it.o).

提示“PendSV_Handler ”和“SVC_Handler”函数在“port.c”和“stm32f10x_it.c”文件中重复定义了。这里将“stm32f10x_it.c”文件中的这两个函数注释掉。注释掉之后再次编译,0错误0警告。

1.2 修改部分文件

1.2.1 修改 SYSTEM 文件

在 sys.h 文件里面用宏 SYSTEM_SUPPORT_OS 来定义是否使用 OS,我们使用了 FreeRTOS,所以应该将宏 SYSTEM_SUPPORT_OS 改为 1。

//0,不支持ucos
//1,支持ucos
#define SYSTEM_SUPPORT_OS		1		//定义系统文件夹是否支持UCOS

1.2.2 修改 usart.c 文件

在“usart.c”文件中添加“FreeRTOS.h”文件

// 如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "FreeRTOS.h"   // FreeRTOS使用	  
#endif

1.2.3 修改 delay.c 文件

首先修改一下滴答定时器的中断服务函数“SysTick_Handler()”。FreeRTOS 的心跳就是由滴答定时器产生的,根据 FreeRTOS 的系统时钟节拍设置好滴答定时器的周期,这样就会周期触发滴答定时器中断了。在滴答定时器中断服务函数中调用FreeRTOS 的API 函数 “xPortSysTickHandler()”。

static u8  fac_us=0;							//us延时倍乘数			   
static u16 fac_ms=0;							//ms延时倍乘数,在ucos下,代表每个节拍的ms数
	
	
extern void xPortSysTickHandler(void);

//systick中断服务函数,使用ucos时用到
void SysTick_Handler(void)
{	
    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
    {
        xPortSysTickHandler();	
    }
}

其他的比如根据 FreeRTOS 的系统时钟节拍来初始化滴答定时器,延时等函数,这里就不再列举了。具体可以看正点原子的《STM32F1 FreeRTOS开发手册_V1.1》。

需要注意的是,滴答定时器的中断服务函数也在在“port.c”和“stm32f10x_it.c”文件中重复定义了,需要将“stm32f10x_it.c”文件中的注释掉。

二、FreeRTOS移植测试

这里直接借用正点原子提供的测试代码来测试是否移植成功,其中的LED函数换成了自己的函数

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define LED0_TASK_PRIO		2
//任务堆栈大小	
#define LED0_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);

//任务优先级
#define LED1_TASK_PRIO		3
//任务堆栈大小	
#define LED1_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);

int main(void)
{ 	 
	Med_Mcu_Iint();   // 系统初始化
	 
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建LED0任务
    xTaskCreate((TaskFunction_t )led0_task,     	
                (const char*    )"led0_task",   	
                (uint16_t       )LED0_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )LED0_TASK_PRIO,	
                (TaskHandle_t*  )&LED0Task_Handler);   
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);         
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//LED0任务函数 
void led0_task(void *pvParameters)
{
    while(1)
    {
				Med_Led_StateReverse(LED0);   // LED0状态取反
        vTaskDelay(500);
    }
}   

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED1
        vTaskDelay(200);
        Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED1
        vTaskDelay(800);
    }
}

烧录之后LED0 和 LED1 开始闪烁,说明移植成功。

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

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

相关文章

c++语言 打字游戏(随机字母)

c语言 打字游戏(随机字母) 程序运行如下 按 enter 回车键 随机字母之后&#xff0c;输入 测出正确率 用时多少秒 测试完按空格键从新开始 退出系统 按 Esc键 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <math.h> #includ…

Bootstrap 排版

文章目录 Bootstrap 排版标题内联子标题 引导主体副本强调缩写地址&#xff08;Address&#xff09; Bootstrap 排版 Bootstrap 使用 Helvetica Neue、 Helvetica、 Arial 和 sans-serif 作为其默认的字体栈。 使用 Bootstrap 的排版特性&#xff0c;您可以创建标题、段落、列…

解决Tomcat控制台窗口输出乱码问题

由于编码的问题&#xff0c;tomcat的控制台窗口输出的都是中文乱码&#xff0c;这明显是编码格式导致的&#xff0c;只要找到对应的编码格式修改一下就好了&#xff0c; 由于我的服务器编码是GBK&#xff0c;所有只需把输出的编码修改为GBK就行了。 936就是GBK编码。找到tomca…

EasyCVR电子地图鼠标悬停展示经纬度的技术实现

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可…

python字典学习

读取和拷贝 if __name__ __main__:print()dictInfo {1: "This is one", 2: "", 3: , 5: "This is five"}# 字典的读取assert (len(dictInfo[1]) > 0)assert (len(dictInfo[2]) < 0)assert (len(dictInfo[3]) < 0)if 4 in dictInfo:a…

昨天去银行转钱,最后怒失300万

**本文首发于公众号【看点代码再上班】&#xff0c;建议关注公众号&#xff0c;及时阅读最新文章。** 原文&#xff1a;昨天去银行转钱&#xff0c;最后怒失300万 大家好&#xff0c;我是Eric&#xff0c;这是我的第24篇原创文章 我的300万"不见"了 小埃年初的时候看…

将grub安装到u盘

安装grub sudo apt-get install grub查看磁盘信息 fdisk -lu盘设备是/dev/sdb 使用fdisk编辑磁盘 fdisk /dev/sdbd命令删除磁盘分区 n命令新建磁盘分区 a命令将分区激活 w命令将更改保存到磁盘 创建两个分区&#xff0c;将其中一个设置活动分区。用于安装grub。剩下的分区可…

【源码解读】扩散模型核心:DDPM专题-结合源码讲解

目录 1. 训练1.1 Uniform({1,...,T})1.2 ϵ ∼ N ( 0 , I ) \boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \mathbf{I}) ϵ∼N(0,I)1.3 加噪1.4 加噪图片送入UNet预测加入的噪声1.5 预测的噪声和加入的噪声进行损失计算 2. 采样3. 推理 本次训练采用的是cifar数据集&am…

15天涨粉50万!B站有900万人看过都说“震撼”

“卷”是内容创作者对现在互联网竞争最大的评价&#xff0c;创作者之间复制力极强&#xff0c;导致赛道竞争力大&#xff0c;创作者亟待不断地推动自己找到一个又一个新的内容差异、流量风口。 所以不管是创作者还是品牌&#xff0c;只要是涉及到内容运营的都只有一个目标&…

【C#】反射机制,动态加载类文件

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

网络解析----yolov3网络解析

Yolov3是一种针对目标检测任务的神经网络模型&#xff0c;其网络结构主要由三个部分组成&#xff1a;特征提取网络、检测头和非极大值抑制&#xff08;NMS&#xff09;模块。特征提取网络采用Darknet-53作为骨干网络&#xff0c;Darknet-53由53个卷积层和5个Max-Pooling层组成&…

死锁的产生

死锁的产生&#xff1a;有一个公共区的玩具&#xff0c;A和B想玩&#xff0c;但是A先得到了玩具&#xff0c;A玩完玩具之后又去干别的事情&#xff0c;但是并没有把玩具还回去&#xff0c;此时B就玩不到了玩具&#xff0c;在无限期的等待。 如下图所示&#xff1a; 线程1把num资…

php压缩一个文件夹,php下载多个图片

$area_id 100;$area_name 一百;shell_exec("cd /www/wwwroot/api/public/images/ && zip -r " . $area_name . ".zip " . $area_id . "/"); 把 100/ 这个文件夹&#xff0c;压缩成 一百.zip 然后得到zip所在的下载url 这个功能&…

百度编辑器(Ueditor)视频上传到阿里云 + 预览不支持FLASH问题解决 + 输入框不展示视频播放页面问题解决

目前需求方提出的问题是以下四个&#xff1a; 1.百度编辑器&#xff08;Ueditor&#xff09;视频上传到阿里云 2.解决不支持FLASH问题 3.视频上传后可以预览 4.修改视频封面 看一下原始的功能是什么样的 上传视频&#xff1a; 视频上传完成 上传视频保存的路径&#xff1…

使用vant组件库

参考网址 Vant Weapp - 轻量、可靠的小程序 UI 组件库 1.在小程序中右键打开外部终端窗口 2.npm init -y 生成package.json 如果没有npm指令则需安装node.js 地址&#xff1a;https://nodejs.org/dist/v18.16.1/node-v18.16.1-x64.msi 3.npm i vant/weapp1.3.3 -S --pro…

PHP 论坛系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 论坛系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为PHP APACHE&#xff0c;数据库为 mysql5.0&#xff0c;使用php语言开发。 下载链接…

oracle服务器的CPU占用率一直100%排查方式

背景说明 公司开发、测试、演示环境&#xff0c;三个环境的oracle服务器无论服务器是否空闲&#xff0c; CPU的占用率一直是100%&#xff0c; 一直也没有找到问题原因&#xff0c;今天就花了一整天时间研究这个问题。 通过AWR报告查看oracle运行情况 awr报告是oracle 10g下提…

一种人体属性识别的网络结构

0、前言 人体属性识别&#xff0c;是一个典型的多标签分类场景。每个人体有多个标签&#xff0c;如年龄、性别、衣着颜色等&#xff0c;而每个属性又有多种类别&#xff0c;如年龄分儿童青年老人、性别分男女、颜色分红绿青蓝紫... 本文提供了一个网络结构来执行这种任务。 …

【KVM】命令行安装kvm

命令行安装kvm 一、准备镜像文件 mkdir /home/iso cd /home/iso rz ls CentOS-7-x86_64-Minimal-2009.iso二、使用命令行安装虚拟机 virt-install --virt-typekvm --nameKVM_01 --vcpus4 --memory6000 --location/opt/CentOS-7-x86_64-Minimal-2009.iso --disk path/data/kv…

2021年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版

2021 年 1 月份管综初数真题 一、问题求解&#xff08;本大题共 5 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。 1.某便利店第一天售出50种商品&…