STM32之FreeRTOS移植

1.FreeRTOS的移植过程是将系统需要的文件和代码进行移植和裁剪,其移植的主要过程为:

(1)官网上下载FreeRTOS源码:https://www.freertos.org/

(2)移植文件夹,在portable文件夹中只需要保留:Keil、MemMang、RVDS。

(3)代码中的裁剪,修改相关的宏定义。

2.移植文件夹:

(1)首先在Keil的基本工程模板中创建一个文件夹FreeRTOS,用来存放FreeRTOS的源码:

(2)将如下三个文件夹导入到FreeRTOS目录下:

其中,Demo中存放的参考例程。License中是相关的许可信息。Source中便是FreeRTOS的源码。

(3)裁剪Source中的文件:

Source中的文件信息如下

portable中存放是FreeRTOS和硬件之间的接口桥梁,在portable中只需要保留如下三个文件夹即可。

MemMang中存放是内存管理相关的算法文件,本文选择heap_c.c。

RVDS和Keil中存放是软件和硬件之间的接口文件。本文的STM32是Coretex-M3系列,所以需要选择ARM_CM3。

3.创建工程文件:

在基础工程文件中创建两个如下两个文件夹用来存放FreeRTOS相关的文件:

添加文件:

4.导入头文件的路径:

5.移植FreeRTOSConfig.h文件:

FreeRTOSConfig.h是FreeRTOS的配置文件,通常FreeRTOS的裁剪都是通过修改此文件中的宏定义来实现。选择芯片序号和开发环境对应的文件:

将FreeRTOSConfig.h复制到自己的工程文件下,本文将FreeRTOSConfig.h放在include文件夹下:

6.代码裁剪:

(1)添加宏定义,将STM32的PendSV_Handler、SVC_Handler、SysTick_Handler映射到FreeRTOS中。在FreeRTOS中添加如下三个宏定义:

(2)注释stm32f10x_it.c中的SysTick_Handler()、SVC_Handler()和 PendSV_Handler()三个中断服务函数。因为在FreeRTOS中已经重新定义了这三个中断服务函数,所以此处需要注释,防止重复定义。

7.创建任务:

  (1)led.c

#include "led.h"void LED_Init(void)
{//¶¨Òå¶Ë¿ÚµÄ½á¹¹Ìå:GPIO_InitTypeDef GPIO_InitStruct;//1.ʹÄÜʱÖÓ£ºRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOA,ENABLE);//2.ÅäÖö˿ڽṹÌåµÄÏà¹ØÐÅÏ¢£º£¨LED1£©GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStruct);//ÅäÖÃLED0£ºGPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOA,&GPIO_InitStruct);//³õʼʱ½«LEDµÄ¶Ë¿Ú¶¼ÖÃΪ1£¬¼´Ï¨ÃðGPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_SetBits(GPIOD,GPIO_Pin_2);
}

(2)main.c:

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "FreeRTOS.h"
#include "task.h"TaskHandle_t led0_handler;
TaskHandle_t led1_handler;void led0(void)
{while(1){GPIO_ResetBits(GPIOA,GPIO_Pin_8);			//´ò¿ªLEDvTaskDelay(500);GPIO_SetBits(GPIOA,GPIO_Pin_8);			//´ò¿ªLEDvTaskDelay(500);}
}void led1(void)
{while(1){GPIO_ResetBits(GPIOD,GPIO_Pin_2);			//´ò¿ªLEDvTaskDelay(1000);GPIO_SetBits(GPIOD,GPIO_Pin_2);			//´ò¿ªLEDvTaskDelay(1000);}
}int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// ÉèÖÃÖжÏÓÅÏȼ¶·Ö×é2LED_Init();/*´´½¨ÈÎÎñ*/xTaskCreate((TaskFunction_t) led0,				//ÈÎÎñº¯Êý(const char *)"led0_task",								//ÈÎÎñÃû³Æ(uint16_t)50,											      //ÈÎÎñ¶ÑÕ»´óС(void *)NULL,													//´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý(UBaseType_t)1,											//ÈÎÎñÓÅÏȼ¶(TaskHandle_t *)&led0_handler);				//ÈÎÎñ¾ä±úxTaskCreate((TaskFunction_t) led1,(const char *)"led1_task",(uint16_t)50,(void *)NULL,(UBaseType_t)1,(TaskHandle_t *)&led1_handler);vTaskStartScheduler();													//¿ªÊ¼ÈÎÎñµ÷¶È
}

8.运行结果:本文的运行结果是两个LED灯闪烁,其中led0每500ms闪烁一次,led1每1000ms闪烁一次。

9.总结:

FreeRTOS的移植过程主要是对相关的文件和代码进行裁剪。需要去了解每个文件夹中代码的大搞功能,才可以正确的移植文件。

此外,当使用xTaskGetSchedulerState()函数时,需要将FreeRTOS.h中的对应宏定义改为1:

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

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

相关文章

Flask框架——安装与第一个应用

安装 Flask是一个轻量级的Python Web框架。它是一个微型框架,具有灵活性和可扩展性。Flask使用Python语言编写,它是一个开源框架,使得它可以自由地使用和修改。Flask框架可以用于构建任何类型的Web应用程序,包括单页面应用程序、…

003 【笔记神器】Obsidian:打造属于自己的万能工作台

前言:Obsidian 是一款很多大神都在用的笔记软件,具有强大的功能,能够满足日常各种笔记的需求。强大之处在于:Obsidian 能够安装各种强大的插件,实现各种功能。 废话不多说,玩转 Obsidian 仅需这篇文章足矣&…

护眼落地灯哪个牌子好?高分榜前五的护眼大路灯汇总!

落地灯面世之后就收到了诸多好评,但与此矛盾的是,每年都有大量关于光线不好刺眼的信息,长久使用下来眼睛疲劳、酸痛,根本达不到改善光线环境减少视觉疲劳的效果。不过大家无需过分忧虑,因为光线不好的问题问题主要是不…

VUE3.0对比VUE2.0

vue3.0 与 vue2.0的不同之处有以下几点: 数据响应式原理 3.0基于Proxy的代理实现监测,vue2.0是基于Object.defineProperty实现监测。 vue2.0 通过Object.defineProperty,每个数据属性被定义成可观察的,具有getter和setter方法&…

前端Vue3+uni+Ts

本次记录小兔仙仙的制作过程。 先看下我们的项目截图。主要是手机端,这里用了uniappVScode.三端适配的。可以打包成安卓和苹果。微信小程序。 首先:创建一个uni新的ts项目。 # 通过 git 从 gitee 克隆下载 登录 - Gitee.com git clone -b vite-ts http…

jar 反编译工具

Jar包常见的反编译工具介绍与使用_jar反编译-CSDN博客

构建跨设备3D应用:HOOPS的跨平台开发能力

在当今数字化和可视化需求不断提升的时代,三维技术的应用越来越广泛,尤其在制造、建筑、工程及媒体行业。HOOPS,由Tech Soft 3D开发,是一套全面的软件开发工具包,用于构建高性能的三维应用程序。该工具包涵盖了从三维渲…

微信小程序使用we-rich的一些修改和兼容富文本编辑器

不支持转换s标签,可在supportTags数组内添加后和识别不支持style,class,src以外的属性,可在if (key ‘style’ || key ‘class’ || key ‘src’)后增加key ‘width’|| key ‘height’,这样可以兼容富文本编辑器…

Java最长公共子序列知识点(含面试大厂题和源码)

最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中的一个经典问题,主要涉及两个序列,并寻找这两个序列中最长的共有子序列。这个子序列不需要在原序列中连续,但必须保持元素的相对顺序。L…

Centos7在线安装mysql5.7

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 安装Mysql yum源1、卸载旧环境2、下载mysql yum源3、上传到自己服务器1)、上传源2)、安装yum源3)、查看yum源是否安装成功 安装M…

信息系统项目管理师——管理类计算

风险管理——风险曝光度 风险曝光度概率*影响,概率指风险发生的概率,影响指风险一旦发生,受到影响的项。 题号【GX20061101](61) 知识点[风险曝光度] 风险的成本估算完成后,可以针对风险表中每个风险计算其风险曝光度。某软件小…

面试官:MySQL的自增 ID 用完了,怎么办?

如果你用过或了解过MySQL,那你一定知道自增主键了。每个自增id都是定义了初始值,然后按照指定步长增长(默认步长是1)。虽然,自然数是没有上限的,但是我们在设计表结构的时候,通常都会指定字段长…

0.25W 3KVDC 隔离单、双输出 DC/DC SMD 型电源模块 ——TPVT-W2 系列

TPVT-W2系列是一款标准的表面贴装电源模块,完全实现采用全自动贴片机来组装和满足回流焊工艺,大大提高产能和降低人工费用。此系列产品小,效率高,低输出纹波及提供3000V以上的直流电压隔离,SMD封装。

在vue中使用bing map 的小demo

1.注意事项(关于经纬度) 如果不转换成WGS84 标准的经纬度 bing map会报错 如果要在 Bing Maps 中使用中国地区的经纬度,需要先将其转换为 WGS84 标准的经纬度。你可以使用第三方的坐标转换服务,或者使用相关的 JavaScript 库进行…

从数据中台到上层应用全景架构示例

一、前言 对于大型企业而言,数据已经成为基本的生产资料,但是有很多公司还是值关心上层应用,而忽略了数据的治理,从而并不能很好的发挥公司的数据资产效益。比如博主自己是做后端的,主要是做应用层,也就是…

计算机网络 Cisco路由信息协议(RIP)实验

一、实验内容 1、命名 2、关闭域名解释 3、设置路由器接口IP地址 4、根据要求配置RIP以实现所有客户机都能相互通信 5、配置默认路由 二、实验数据处理 1、建立拓扑图 2、PC机地址配置 主机IP地址子网掩码网关PC110.23.1.2255.255.255.010.23.1.1PC210.23.1.3255.255.2…

将普通用户加入Docker组,使用docker

创建名为 “docker” 的组 要创建名为 “docker” 的组,您可以使用以下命令: sudo groupadd docker这将创建一个名为 “docker” 的组。您可以使用此组来管理 Docker 容器的访问权限。 查看 Docker 组中的用户 要查看 Docker 组中的用户,…

OR36 链表的回文结构

描述 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。 测试样例: 1->…

ChatGPT革新论文写作:让文章无往不利

ChatGPT无限次数:点击直达 ChatGPT革新论文写作:让文章无往不利 在当今信息爆炸的时代,写作是一项至关重要的技能,它不仅仅是传递信息的工具,更是展示思想、沟通观点的重要方式。而随着人工智能技术的不断发展,ChatGP…

代码随想录算法练习Day13:有效的字母异位词

题目: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 题目链接:242.有效的字母异位词 卡哥的视频讲解&#xff…