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.mzph.cn/bicheng/27555.shtml

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

相关文章

Linux host映射 设置主机名并通过主机名找到指定系统

一、windows ping linux 1.windows进入到 C:\Windows\System32\drivers\etc\hosts 内,使用edit with notepad打开hosts文件,在下面添加需要寻找的ip以及其主机名。该ip以及主机名即linux的一致。需要查看linux主机名的在终端使用 hostname进行查看&#…

spring boot3登录开发-邮箱登录/注册接口实现

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途 目录 写在前面 上文衔接 内容简介 功能分析 所需依赖 邮箱验证登录/注册实现 1.创建交互对象 2.登录注册业务逻辑实…

JDK17 你的下一个白月光

JDK版本升级的非常快,现在已经到JDK20了。JDK版本虽多,但应用最广泛的还得是JDK8,正所谓“他发任他发,我用Java8”。 但实际情况却不是这样,越来越多的java工程师拥抱 JDK17,于是了解了一下 JDK17新语法&a…

Star-CCM+自动网格执行方法与设置技巧

在Star中进行一个仿真项目时,有时会创建多个自动网格。网格创建结束后需要执行。在Star中,网格执行可以分为三种。分别是:单独执行操作;多个执行操作;全部执行操作。接下来将三种执行操作的方法与步骤进行介绍。 其次,如果不习惯用自定义控制网格,有时在一个项目中就会…

大模型+人工智能:重塑地方志管理的新力量

前言 在科技日新月异的今天,人工智能(AI)正以前所未有的速度渗透到各个领域,改变着我们的工作和生活方式。特别是在地方志管理这一领域,大模型和人工智能的结合正在开启一场深刻的变革。今天,就让我们一起…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】梯度的反向传播算法

矩阵微积分(Matrix Calculus) 在开始之前,需要先了解矩阵微积分的一些计算规则。 首先,对于矩阵微积分的表示,通常由两种符号约定: 分母布局 标量关于向量的导数为列向量 向量关于标量的导数为行向量 N维…

LDR6500:手机电脑拓展坞转接器方案的卓越之选

随着科技的飞速发展,手机和电脑已成为我们日常生活中不可或缺的工具。然而,它们的接口有限,经常难以满足我们多样化的需求。这时,一款高效、稳定的拓展坞转接器就显得尤为重要。LDR6500,作为乐得瑞科技精心研发的USB P…

【计算机视觉(10)】

基于Python的OpenCV基础入门——图像滤波去噪 图像滤波去噪均值滤波中值滤波高斯滤波双边滤波方框滤波图像滤波去噪代码实现及其效果图 图像滤波去噪 图像滤波去噪是一种图像处理方法,它通过应用滤波器来减少或消除图像中的噪声。噪声是图像中不希望的、无用的、干…

安装sqlserver2022 express

1、下载 SQL Server 下载 | Microsoft 双击sql2022-ssei-expr 2、安装 下载完成以后,将会出现以下对话框 : 点击【全新SQL Server独立安装或向现有安全添加功能】 下一步,下一步: 下一步: 下一步,这里我…

【LeetCode:2779. 数组的最大美丽值 + 排序 + 二分】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【docker】如何解决artalk的跨域访问问题

今天折腾halo的时候,发现artalk出现跨域访问报错,内容如下。 Access to fetch at https://artk.musnow.top/api/stat from origin https://halo.musnow.top has been blocked by CORS policy: The Access-Control-Allow-Origin header contains multipl…

Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】

问题 如果你有一个带有默认参数值的 Kotlin 函数,如何从 Java 调用它而无须为每个参数显式指定值? 方案 为函数添加注解JvmOverloads。 也就是为Java添加重载方法,这样Java调用Kotlin的方法时就不用传递全部的参数了。 示例 在 Kotlin …

企业环保创A标准

在环保日益受到重视的今天,企业如何有效地进行环保管理,提高自身的环保水平,已成为一个不可忽视的议题。而企业环保创A标准,正是为了评估企业的环保水平和环保管理能力而制定的一项重要评价标准。朗观视觉小编将详细解析企业环保创…

XILINX 7系列XDMA使用_IP核介绍以及工程搭建

文章目录 一、XDMA IP核1.1、接口说明1.2、配置页说明 二、XDMA工程搭建2.1、BD搭建2.2 Linux下XDMA驱动安装2.3 Linux下使用XDMA进行数据传输 一、XDMA IP核 1.1、接口说明 sys_clk:主机给PCIE提供的时钟信号,通过原理图查看 sys_rst_n:主机…

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

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

TCGAbiolinks包学习

TCGAbiolinks 写在前面学习目的GDCquery GDCdownload GDC prepare中间遇到的报错下载蛋白质数据 写在前面 由于别人提醒我TCGA的数据可以利用TCGAbiolinks下载并处理,所以我决定阅读该包手册,主要是该包应该是有更新的,我看手册进行更新了&…

法国恐脱欧、陷金融危机!股指本周跌6.2%,创三年多最大跌幅

内容提要 法国财政部长警告称,左翼政党联盟若上台可能导致法国脱欧,而且无论极右翼还是左翼上台,都可能导致法国爆发金融危机。由于政坛风险高企,法国股市周五延续跌势,本周已经抹掉2100亿美元市值,几乎回…

MySQL学习——创建MySQL Workbench中的Connections

在MySQL Workbench中,Connections(连接)是用户与MySQL数据库进行交互的桥梁。 本文将添加一个新连接,该连接可以是初始连接,也可以是附加连接。在开始之前,必须安装、启动MySQL服务器的实例,并…

【单片机毕业设计选题24007】-基于STM32和阿里云的家庭健康数据监测系统

系统功能: 本课题设计是基于STM32单片机作为控制主体,通过HX711称重模块,HC-SR04超声波测距模块,红外测温,心率传感器等模块通过I2C或SPI接口与STM32进行通信,并读取传感器输出的身高,体重,心率…

matlab-2-simulink-小白教程-如何绘制电路图进行电路仿真

以上述电路图为例:包含D触发器,时钟CLK,与非门 一、启动simulink的三种方式 方式1 在MATLAB的命令行窗口输入“Simulink”命令。 方式2 在MATLAB主窗口的“主页”选项卡中,单击“SIMULINK”命令组中的Simulink命令按钮。 方式3 从MATLAB…