FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《02》

系列文章

  • FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《01》

说明

  • 上一篇 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《01》 主要讲了一下如何快速搭建一个 STM32 裸机工程,其实 STM32CubeMX 可以生成 FreeRTOS 的工程,这就没有了 FreeRTOS 的移植文章

  • 本篇继续讲一下 【手动】移植 FreeRTOS 的步骤,移植完成后,继续研究 FreeRTOS 的使用

环境

  • Win10 64位:当前 Windows 主流操作系统

  • Keil MDK 5.36,IDE,方便开发与调试

  • STM32CubeMX 6.11.1 本篇不再使用

获取与下载 FreeRTOS

(1)直接在 FreeRTOS 官方下载 发布的版本,压缩包,解压后使用

  • FreeRTOS 官方的网址 https://www.freertos.org/

  • 点击下载 FreeRTOS,发布版本可能没有那么新,比如当前最新版本 FreeRTOS 202212.01,但是下载的压缩包比较小,容易下载

在这里插入图片描述

在这里插入图片描述

(2)在 github 使用 Git 工具下载源码

  • FreeRTOS 主仓库 https://github.com/FreeRTOS/FreeRTOS.git

  • FreeRTOS 内核仓库 https://github.com/FreeRTOS/FreeRTOS-Kernel.git

  • 由于 FreeRTOS 内核仓库仅仅为内核代码文件,没有 Demo,因此建议直接下载 FreeRTOS 主仓库,使用 Git 命令如下

git clone https://github.com/FreeRTOS/FreeRTOS.git --recurse-submodules

  • 同时把 FreeRTOS 各个 Git 子仓库一起克隆到本地

(3)在 github 直接下载 Release 版本

  • 可以直接在 github 点击下载 Release 发布版本,无须使用 Git 工具

在这里插入图片描述

在这里插入图片描述

  • 【备注】Github 仓库的 Release 版本地址可能会不时更新,因此建议自己打开进入网址后,下载自己想要的版本,如最新的软件版本

FreeRTOS 工程目录管理

  • 直接下载下来的 FreeRTOS,需要整理一下,这样方便工程的管理,有些不需要的 Demo,无须加入工程

  • 当前平台:STM32L476,可以参考 FreeRTOS 中的一些 Demo,找到相似 CPU,这样 CPU 部分就不需要额外移植了

  • 当前 FreeRTOS 没有 STM32L476 Keil MDK5 的 Demo,因此手动搭建 FreeRTOS 工程即可,使用上次生成的 STM32L476 裸机工程

在这里插入图片描述

在这里插入图片描述

  • 进入 STM32L476 裸机工程(STM32CubeMX 生成)

在这里插入图片描述
在这里插入图片描述

Keil MDK5 添加分组

  • 打开 Keil MDK5,开始工程文件的管理(分类、添加)

在这里插入图片描述

  • 可以在 Keil MDK5 中创建 FreeRTOS/KernelFreeRTOS/cpu 的分组(Group)

在这里插入图片描述

  • cpu port 部分可以暂时选择 FreeRTOS\Source\portable\RVDS\ARM_CM4F

在这里插入图片描述

初步编译

  • 报编译错误,找不到 "FreeRTOS.h"
compiling croutine.c...
..\FreeRTOS\Source\croutine.c(29): error:  #5: cannot open source input file "FreeRTOS.h": No such file or directory#include "FreeRTOS.h"
..\FreeRTOS\Source\croutine.c: 0 warnings, 1 error... ...

Keil MDK5 设置 头文件路径

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

再次编译:

  • 添加 FreeRTOS 头文件路径后,再次编译,提示找不到 "FreeRTOSConfig.h" 头文件,这个头文件属于工程配置文件,可以在 FreeRTOS Demo 中找到一个类似的,然后进行配置与修改

在这里插入图片描述

compiling croutine.c...
..\FreeRTOS\Source\include\FreeRTOS.h(58): error:  #5: cannot open source input file "FreeRTOSConfig.h": No such file or directory#include "FreeRTOSConfig.h"
... ...
  • 可以使用 FreeRTOS 的 FreeRTOSConfig.h 模板文件,

在这里插入图片描述

  • 或者从其他的 相似平台 Demo 中复制一份出来,比如 Cortex-M4 平台的

FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK\FreeRTOSConfig.h

  • FreeRTOSConfig.h 放在工程根目录下即可,无须放在 FreeRTOS 目录,因为这个是工程本身的专有的配置文件

在这里插入图片描述

继续编译

  • 此时编译报错比较少了,可以针对性的开始移植与适配了

  • 此时编译,报错 "SystemCoreClock" is undefined

..\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c(813): error:  #20: identifier "SystemCoreClock" is undefinedportNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
..\FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c: 0 warnings, 1 error
"stm32l475_freertos\stm32l475_freertos.axf" - 1 Error(s), 0 Warning(s).
  • 此时可以先不着急解决这个编译问题,我们只是把 FreeRTOS 相关的文件(可能目前还缺少内存管理部分)放进工程,并没有创建 FreeRTOS 的例程,也就是还没有使用 FreeRTOS,平台相关的编译,需要使用时一并修改

FreeRTOS 例程

  • 在 main 函数添加 FreeRTOS 的使用例程,比如创建一个 task
#include "main.h"#include "FreeRTOS.h"
#include "task.h"UART_HandleTypeDef huart2;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);#define TASK_TEST_PRIORITY      (tskIDLE_PRIORITY + 6)
#define TASK_TEST2_PRIORITY     (tskIDLE_PRIORITY + 8)static void task_test_entry(void *pvParameters)
{while (1){vTaskDelay(1000);}
}static void task_test2_entry(void *pvParameters)
{while (1){vTaskDelay(2000);}
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();xTaskCreate(task_test_entry, "task_test", 512, NULL, TASK_TEST_PRIORITY, NULL);xTaskCreate(task_test2_entry, "task_test2", 512, NULL, TASK_TEST2_PRIORITY, NULL);vTaskStartScheduler();while (1){HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);HAL_Delay(500);HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);HAL_Delay(500);}
}
  • 这里整理了一下 main.c,创建两个 task,task中只有循环,可以通过调试确认 task 是否正常切换,比如在每个 task 中增加断点

继续编译,确认移植与适配问题

  • 解决 SystemCoreClock 找不到的编译报错,这里有个 编译器的判断,或者改为 Keil MDK5 编译器的,armcc 或者 armclang 等,建议去掉即可,因为这个配置文件来自其他的编译器

  • 【备注】 FreeRTOSConfig.h 文件为工程配置文件,可以根据当前的平台随时修改(适配)

在这里插入图片描述
在这里插入图片描述

  • 中断重定义问题,由于 FreeRTOS 接管了 STM32 的部分中断,用于 RTOS 的任务调度。
stm32l475_freertos\stm32l475_freertos.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32l4xx_it.o).
stm32l475_freertos\stm32l475_freertos.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32l4xx_it.o).
stm32l475_freertos\stm32l475_freertos.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by port.o and stm32l4xx_it.o).
  • 因此把 stm32l4xx_it.c 中的自动生成的中断函数【注释掉】

在这里插入图片描述

FreeRTOS 继续适配

  • 继续编译,发现 FreeRTOS 需要实现几个 适配的函数
stm32l475_freertos\stm32l475_freertos.axf: Error: L6218E: Undefined symbol pvPortMalloc (referred from event_groups.o).
stm32l475_freertos\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vPortFree (referred from event_groups.o).
stm32l475_freertos\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
stm32l475_freertos\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
stm32l475_freertos\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).

在这里插入图片描述

  • 这个适配问题在下一篇继续讲解

小结

  • FreeRTOS 在 STM32L476 平台(Cortex-M4)上适配其实很容易,当然也需要一些细节的处理

  • 本篇主要搭建 FreeRTOS 的工程,几个编译问题的【修改】

  • 下一篇继续讲解 FreeRTOS 的适配,让FreeRTOS 在 STM32L476 平台上运行起来

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

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

相关文章

C语言小例程20/100

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 #include<stdio.h> #define N 1000 int main() {int i,j,k,n,sum;int a[256];for(i2;i<N;i){suma[0]1;k…

异常封装类统一后端响应的数据格式

异常封装类 如何统一后端响应的数据格式 1. 背景 后端作为数据的处理和响应&#xff0c;如何才能和前端配合好&#xff0c;能够高效的完成任务&#xff0c;其中一个比较重要的点就是后端返回的数据格式。 没有统一的响应格式&#xff1a; // 第一种&#xff1a; {"dat…

水表摄像直读抄表仪

1.技术性简述 水表摄像直读抄表仪&#xff0c;是一种前沿的智能计量机器设备&#xff0c;它利用超清摄像头部和图像识别算法&#xff0c;完成了远程控制、非接触的水表载入。这一技术的普及&#xff0c;颠覆了传统式人力抄表的形式&#xff0c;提高了效率&#xff0c;降低了不…

upload-labs第八关教程

upload-labs第八关教程 一、源代码分析代码审计 二、绕过分析点绕过上传eval.php使用burp suite进行抓包修改放包&#xff0c;查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(U…

从开源EPR产品Odoo学习

前言 一个先进、敏捷、经济高效、可快速扩展的Odoo免费开源企业信息化解决方案,让企业获得适应未来发展的长期创新和增长能力。 Odoo 的免费开源模式 让我们可利用无数开发人员和业务专家,在短短数年内,打造数百款应用。凭借强大的技术基础,Odoo 的框架是非常独特且优秀的…

中小制造业工厂要不要上MES系统

MES系统的主要功能包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等。通过这些模块&#xff0c;MES为企业打造一个…

C51学习归纳13 --- AD/DA转换

AD/DA转换实现了计算机和模拟信号的连接&#xff0c;扩展了计算机的应用场景&#xff0c;为模拟信号数字化提供了底层支持。 AD转换通常是多个输入通道&#xff0c;使用多路选择器连接到AD开关&#xff0c;实现AD多路复用的目的&#xff0c;提高利用率。 AD/DA转换可以使用串口…

【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error

如果大家使用这个vue 配合 element 框架不熟练&#xff0c;当你顺利按照文档安装好 vue 和 element 的时候想要使用element 的组件时候确无法展示出来&#xff0c;甚至报错。不妨看看是不是这个问题&#xff0c; 1.首先使用element 的时候&#xff0c;前提是把必须要的 elemen…

VictoriaMetrics的高可用二进制方式部署

参考文章实现&#xff1a;Prometheus联邦集群VictoriaMetrics集群搭建部署 1.基本信息 涉及机器列表&#xff0c;机器均为本地虚拟机 192.168.56.108 192.168.56.109方案实现如下 涉及模块介绍 vmstorage: 数据存储节点&#xff0c;负责存储时序数据vmselect: 数据查询节点…

upload-labs第九关教程

upload-labs第九关教程 一、源代码分析代码审计::$DATA介绍 二、绕过分析特殊字符::$data绕过上传eval.php使用burpsuite抓包进行修改放包&#xff0c;查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submi…

关闭kylin(麒麟)系统的安全认证(烦人的安全认证)

打开grub sudo vim /etc/default/grup修改安全认证选项 增加12行&#xff0c;把13行注释掉 保存更改, 然后执行下面的命令&#xff1a; sudo sync sudo reboot重启成功后&#xff0c;就关闭了安全认证了~~~~~。 总体来讲&#xff0c;kylin还是基于ubuntu的内核的&#xff0c;…

图解Transformer学习笔记

教程是来自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 图解Transformer Attention为RNN带来了优点&#xff0c;那么有没有一种神经网络结构直接基于Attention构造&#xff0c;而不再依赖RNN、LSTM或者CNN的结构&#xff0c;这就是Trans…

【网络编程】域名及网络地址

DNS(Domain Name System&#xff0c;域名系统)&#xff0c;是对IP地址和域名进行互相转换的系统&#xff0c;其核心是DNS服务器。 域名&#xff1a;提供网络服务的服务器端也是通过IP地址去份额&#xff0c;但IP地址难记&#xff0c;因此将容易记、易表述的域名分配并取代IP地…

186.二叉树:二叉搜索树中的插入操作(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

PMS助力制造企业高效运营︱PMO大会

全国PMO专业人士年度盛会 北京易贝恩项目管理科技有限公司副总经理朱洪泽女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“PMS助力制造企业高效运营”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; …

音频处理软件adobe audition使用教程

基本操作 点击文件-》新建-》多轨会话&#xff1a; 编辑-》首选项&#xff0c;设置自动保存时间&#xff1a; 导入素材&#xff0c;文件-》导入素材&#xff0c;或者直接拖动进来文件&#xff01; 导出多轨混音&#xff1a; 更改为需要导出的格式wav,mp3等格式&#xff0c;码…

【触想智能】壁挂式工业一体机在智能制造行业上的应用分析

随着智能制造的兴起&#xff0c;壁挂式工业一体机成为了越来越多工厂的首选设备。壁挂式工业一体机是一种高性能的计算机&#xff0c;内置多种工业级传感器和执行器&#xff0c;可以实时获取工厂生产过程中的各种数据&#xff0c;并与其他设备进行无缝连接。 为了大家更深入的了…

一文读懂数字化转型三部曲:信息化-数字化-数智化

言简意赅&#xff0c;数字化就是把物理实体、业务流程和信息数据转换为数字形式&#xff0c;比如原本公司的账都记在纸质账本上&#xff0c;堆在仓库里&#xff0c;通过“数字化”&#xff0c;这些账本就被存入了线上的仓库里。而数智化则更加注重对数据的分析和利用&#xff0…

方案开发 2.4G儿童遥控漂移车 东莞酷得

电子方案开发定制&#xff0c;我们是专业的 东莞酷得智能单片机方案之2.4G遥控玩具童车具有以下比较有特色的特点&#xff1a; 1、内置充电电池&#xff1a;这款小车配备了可充电的电池&#xff0c;无需频繁更换电池&#xff0c;既环保又方便。充电方式可能为USB充电或者专用…

快速上手SpringBoot

黑马程序员Spring Boot2 文章目录 1、SpringBoot 入门程序开发1.1 创建一个新的项目 2、浅谈入门程序工作原理2.1 parent2.2 starter2.3 引导类2.4 内嵌tomcat 1、SpringBoot 入门程序开发 1.1 创建一个新的项目 file > new > project > empty Project 创建新模块&a…