FreeRTOS的移植

  1. 在工程模版里新建FreeRTOS的文件夹
    在这里插入图片描述
  2. 将FreeRTOSv9.0.0文件夹下的\FreeRTOS\Source里的文件,复制到刚刚创建的FreeRTOS文件夹中。

在这里插入图片描述

  1. 在FreeRTOS\portable的文件夹下,使用Keil环境时,只使用Keil、MemMang、RVDS文件,可以删除其他的文件夹,节省空间。

在这里插入图片描述

  1. 打开工程,添加工程文件,新建Groups,名称FreeRTOS_core,点击添加文件,添加文件如下图。
    在这里插入图片描述
    在这里插入图片描述
    继续新建Groups,名称FreeRTOS_port,添加文件FreeRTOS\portable\MemMang目录下的heap_4.c内存管理文件。
    这里使用的是M3内核的单片机,继续添加文件FreeRTOS\portable\RVDS\ARM_CM3目录下的port.c文件。在这里插入图片描述
    点击ok,完成添加。

  2. 点击魔术棒->C/C+±>IncludePaths,添加文件目录如下图。

在这里插入图片描述

  1. 在FreeRTOSv9.0.0文件夹里,FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil目录下,复制FreeRTOSConfig.h文件。 粘贴到工程目录的User文件夹下。
    为了方便配置和移植,直接使用下载链接里重新注释过配置好的FreeRTOSConfig.h文件
    在这里插入图片描述 打开工程,编译,此时应该没有错误。

  2. 因为在FreeRTOS中,会有中断服务函数的配置,如下图中FreeRTOSConfig.h文件的中断服务函数宏定义。

所以需要在工程中打开stm32f10x_it.c文件,注释掉下面的中断服务函数,以防重定义。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后在工程项目的stm32f10x_it.c中,修改如下函数。

在这里插入图片描述在这里插入图片描述
8. 修改Public文件下的SysTick.c文件,直接使用下载链接里配置好的SysTick.c文件

  1. 测试移植,将以下代码放置入main函数中,点击编译,无错误。
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小  
#define START_STK_SIZE 128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define LED1_TASK_PRIO 2
//任务堆栈大小  
#define LED1_STK_SIZE 50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);/*******************************************************************************- 函 数 名 : main- 函数功能 : 主函数- 输 入 : 无- 输 出 : 无
*******************************************************************************/
int main()
{SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4LED_Init();USART1_Init(115200);//创建开始任务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(); //进入临界区//创建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(); //退出临界区
}//LED1任务函数
void led1_task(void *pvParameters)
{while(1){LED1=0;vTaskDelay(200);LED1=1;vTaskDelay(800);}
}

工程链接
提取码:asdf
参考视频:FreeRTOS实时操作系统–基于STM32

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

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

相关文章

迅饶科技 X2Modbus 网关 AddUser 任意用户添加漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…

jupyter notebook单元格运行耗时计算魔术方法timeit

%%timeit 默认执行多次计算平均耗时 -n 或 --number:指定总的运行次数。 -r 或 --repeat:指定每个运行要重复的次数。 例如,如果你想要运行一个测试,总共运行3次,每次运行7次迭代,你可以这样写&#xff1a…

华为OD机试【全量和已占用字符集】(java)(100分)

1、题目描述 给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用。 2、输入描述 输入一个字符串 一定包含,前为全量字符集 后的为已占用字符集;已占用字符集中的字符一定是全量…

static静态成员变量和静态方法

当有new创建一个对象的,里面属性和方法,通过构造函数,能定义多个不同的对象,在我们做面向对象开发的时候,给一个场景,人在一个班级的时候,你的老师可能是固定的。 当我们用构造方法去构造的时候,每次都去传递一个固定的实参去定义个老师。 这样好会显得代码非常的…

(一)Linux的vim编辑器的使用

一.vim编辑器 Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。 二…

Baidu Comate:智能编码,编程效率的革新者

文章目录 一、何为智能编码助手?二、Baidu Comate智能编码助手简介三、Baidu Comate注册四、Baidu Comate体验Comate插件功能1.注释生成代码2.函数注释生成3.行间注释生成4.生成代码解释5. 调优建议 五、插件功能的使用体验感受和建议 🚩结语 一、何为智…

Windows+Linux的虚拟串口工具

文章目录 1.Windows虚拟串口工具1.1 安装教程1.2 使用方法 2.Linux系统虚拟串口工具2.1 socat安装2.2 开启虚拟串口2.3 测试2.3.1 命令测试2.3.2 Cutecom工具测试 2.4 关闭虚拟串口 3.参考资料 1.Windows虚拟串口工具 下载地址:https://www.downxia.com/downinfo/4…

C++新特性

1 智能指针 1.1 为什么需要智能指针 智能指针主要解决以下问题: 内存泄漏:内存手动释放,使用智能指针可以自动释放共享所有权指针的传播和释放,比如多线程使用同一个对象时析构问题,比如: C里面的四个智…

MySQL数据库及数据表的创建

1.创建一个名叫 db_classes 的数据库: 创建一个叫 db_classes 的数据库MySQL命令: create database db_classes; 运行效果: 创建数据库后查看该数据库基本信息MySQL命令: show create database db_classes; 运行效果&#xff…

IT项目管理-大题【太原理工大学】

一、根据进度网络写出时间参数表、关键路径、总工期 此类题一般是给一个表,问三问。 第一问会问某个活动的时间参数,但我们需要把整个表都求出来,否则单求一个很困难(如果你就是不想求整张表也行,不是硬性要求&#xf…

Isaac Sim 6 仅使用isaacsim中自带的工具进行语义分割、实例分割(学习笔记5.09)

一.概要 建立场景,给场景内的物体赋予语义,使用Replicator进行分割操作,从而获得带标签信息的mask掩码图,可作为数据集、验证集等训练使用。 二.具体操作步骤 场景部分 1.搭建一个基础场景 这里建议在搭建的时候就按类别分好类…