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 undefined
          portNVIC_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 平台上运行起来

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

扣子arixv论文检索工作流开源(Sam老师作品)

因为在扣子上找不到好用的AI论文检索Bot,之前借助工作流和arxiv.org API开发了一个工具,当时写了一篇介绍。 核心流程比较简单,但有很多同学咨询了解,今天抽了点时间把工作流完全开源了。为了方便对比,在公共Team中通过…

LabVIEW开发中的常见通讯协议详解

介绍LabVIEW开发中常见的通讯协议,包括RS-232、RS-485、I2C、SPI、CAN、Ethernet、Modbus和GPIB等。通过对各协议的具体内容、特点、使用范围及注意事项进行全面解析,帮助开发者选择合适的通讯协议,提高系统性能和可靠性。 1. RS-232 内容&a…

进口二手RS FSH4规格3.6G罗德与施瓦茨 FSH6参数

Rohde & Schwarz FSH4 的规格包括&#xff1a; 频率范围从 9 kHz 到 3.6 GHz 高灵敏度&#xff08;<-141dBm&#xff08;1Hz&#xff09;&#xff0c;或使用可选前置放大器<-161dBm&#xff08;1Hz&#xff09;&#xff09; 低测量不确定度&#xff08; 内部跟踪发生…

开源医疗大模型Llama3-Aloe-8B-Alpha,性能超越 MedAlpaca 和 PMC-LLaMA

前言 近年来&#xff0c;大型语言模型 (LLM) 在医疗领域展现出巨大潜力&#xff0c;能够帮助医生和研究人员更快地获取信息、分析数据&#xff0c;并提高医疗服务效率。然而&#xff0c;目前市场上大多数医疗 LLM 都是闭源模型&#xff0c;限制了其在学术研究和应用领域的推广…

【Golang】Go语言中defer与return的精妙交织:探索延迟执行与返回顺序的微妙关系

【Golang】Go语言中defer与return的精妙交织&#xff1a;探索延迟执行与返回顺序的微妙关系 大家好 我是寸铁&#x1f44a; 总结了一篇defer 和 return 返回值 的执行顺序探讨的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 在Go语言中&#xff0c;defer 和return是两…

宝藏速成秘籍(5)插入排序法

一、前言 1.1、概念 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;其工作原理类似于人们整理一手扑克牌。插入排序通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入…

log4j漏洞学习

log4j漏洞学习 总结基础知识属性占位符之Interpolator&#xff08;插值器&#xff09;模式布局日志级别 Jndi RCE CVE-2021-44228环境搭建漏洞复现代码分析日志记录/触发点消息格式化 Lookup 处理JNDI 查询触发条件敏感数据带外漏洞修复MessagePatternConverter类JndiManager#l…

15. STUN协议和ICE工作原理

NET介绍 NAT是一种地址转换技术&#xff0c;它可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff0c;并通过转换端口号达到地址重用的目的。 在大多数网络环境中&#xff0c;我们都需要通过 NAT 来访问 Internet。 NAT作为一种缓解IPv4公网地址枯竭的过渡技术&#xff…

[C++]使用C++部署yolov10目标检测的tensorrt模型支持图片视频推理windows测试通过

【测试通过环境】 vs2019 cmake3.24.3 cuda11.7.1cudnn8.8.0 tensorrt8.6.1.6 opencv4.8.0 【部署步骤】 获取pt模型&#xff1a;https://github.com/THU-MIG/yolov10训练自己的模型或者直接使用yolov10官方预训练模型 下载源码&#xff1a;https://github.com/laugh12321/yol…

五、Nginx配置文件-server模块

目录 一、概述 二、虚拟主机设置的三种形式 1、基于端口号配置 2、基于域名配置 3、基于ip配置 三、常用参数 1、listen 2、server_name 3、location 3.1、常见的Nginx正则表达式 3.2、location正则&#xff1a; 3.3示例 4、root 5、index 6、error_page 7、deny…

长亭培训加复习安全产品类别

下面这个很重要参加hw时要问你用的安全产品就有这个 检测类型产品 偏审计 安全防御类型 EDR类似于杀毒软件 安全评估 任何东西都要经过这个机械勘察才能上线 安全管理平台 比较杂 比较集成 审计 漏扫 评估 合在这一个平台 也有可能只是管理 主机理解为一个电脑 安了终端插件…

LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等

前言 自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮[自然语言处理]领域的研究和应用的浪潮。尤其是以ChatGLM、LLaMA等平民玩家都…

SM5101 SOP-8 充电+触摸+发执丝控制多合一IC触摸打火机专用IC

SM5101 SOP-8 2.7V 涓流充电 具电池过充过放 触摸控制 发热丝电流控制多功能为一体专用芯片 昱灿-海川 SM5101 SOP-8 充电触摸发执丝控制多合一IC触摸打火机方案 &#xff01;&#xff01;&#xff01; 简介&#xff1a; SM5101是一款针对电子点烟器的专用芯片&#xff0c;具…

阻塞IO、非阻塞IO、IO复用的区别 ?(非常详细)零基础入门到精通,收藏这一篇就够了

前言 在《Unix网络编程》一书中提到了五种IO模型&#xff0c;分别是&#xff1a;阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型&#xff0c;供大家参考学习。 一、什么是IO 计算机视角理解IO: 对于计…

苹果电脑装虚拟机和双系统的区别 苹果笔记本虚拟机和双系统哪个好 虚拟机能装MacOS吗 虚拟机类似的软件

Mac电脑用户在需要使用Windows操作系统的软件时&#xff0c;通常会面临两个选择&#xff1a;安装双系统或使用虚拟机。两种方式各有优缺点&#xff0c;适用于不同的使用场景。本文将详细分析和说明Mac电脑装双系统和虚拟机之间的区别&#xff0c;帮助用户选择最适合自己的方案。…

UnityAPI学习之协程原理与作用

协程的原理与作用 Unity 协程(Coroutine)原理与用法详解_unity coroutine-CSDN博客 using System.Collections; using System.Collections.Generic; using UnityEngine;public class NO14_coroutine : MonoBehaviour {Animator animator;// Start is called before the first…

Qt MaintenanceTool.exe使用镜像源更新Qt

环境&#xff1a;Windows11&#xff0c;Qt6.5&#xff0c;新版的MaintenanceTool.exe linux环境类似&#xff0c;mac环境可以看官方文档。 cmd命令窗口&#xff1a;切换到MaintenanceTool.exe所在目录&#xff0c;可以用“D:”切换到D盘&#xff0c;“cd xxxx”切换到xxxx目录…

护眼台灯哪个品牌更好?五款市面主流的护眼台灯款式分享

近年来&#xff0c;护眼台灯的研发和创新不断推进&#xff0c;一些台灯配备了智能化功能&#xff0c;如定时开关机、自动调节光线等&#xff0c;使孩子们能够更好地控制用眼时间和光线环境。护眼台灯哪个品牌更好&#xff1f;一些高端的护眼台灯还采用了纳米光滤镜技术&#xf…

深度学习实战P10车牌识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 引言 学习目标 一、前期准备 1.设置GPU …

强化RAG:微调Embedding还是LLM?

为什么我们需要微调&#xff1f; 微调有利于提高模型的效率和有效性。它可以减少训练时间和成本&#xff0c;因为它不需要从头开始。此外&#xff0c;微调可以通过利用预训练模型的功能和知识来提高性能和准确性。它还提供对原本无法访问的任务和领域的访问&#xff0c;因为它…