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

news2024/11/28 11:40:05

系列文章

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

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

说明

  • 在上篇 FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《02》 开始移植适配 FreeRTOS,FreeRTOS 移植适配需要处理几个编译细节,因此分为几篇文章介绍

  • 当前需要解决移植适配 FreeRTOS 时遇到的链接问题

在这里插入图片描述

.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol pvPortMalloc (referred from event_groups.o).
.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vPortFree (referred from event_groups.o).
.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).
  • 也就是有五个函数需要移植与适配
 pvPortMalloc
 vPortFree
 vApplicationIdleHook 
 vApplicationStackOverflowHook 
 vApplicationTickHook 

环境

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

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

  • STM32CubeMX 6.11.1 用于生成STM32裸机工程,本篇不再使用

动态内存管理

  • FreeRTOS 支持动态内存分配,也就是可以从内存比如 STM32 SRAM 中划出一个区域,用于动态内存的管理,可以定义一个较大的静态数组,作为内存池

  • FreeRTOS 当前支持 5 种 动态内存的管理,只能使用其中的一种,经过初步了解, 内存管理第四种方法最简单,因此本次移植使用 内存管理四,也就是把 FreeRTOS\Source\portable\MemMang\heap_4.c 加入工程

在这里插入图片描述

  • 增加 内存管理: heap_4.c 后,继续编译,发现还有 四个 函数需要适配

在这里插入图片描述

.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).
.\Output\stm32l475_freertos.axf: Error: L6218E: Undefined symbol vApplicationMallocFailedHook (referred from heap_4.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 4 error messages.
".\Output\stm32l475_freertos.axf" - 4 Error(s), 0 Warning(s).

Hook 函数适配

  • 需要适配(实现)的几个 Hook 函数
vApplicationIdleHook
vApplicationStackOverflowHook
vApplicationTickHook
vApplicationMallocFailedHook
  • 在工程中新建一个 port.c 文件,用于实现 FreeRTOS 的 Hook (系统钩子)函数,可以通过全局搜索获取这几个 Hook 钩子函数的定义,如果不确定,有些钩子函数可以为空或者 while (1) 异常处理
#include "FreeRTOS.h"
#include "task.h"

void vApplicationIdleHook( void )
{
}

void vApplicationTickHook( void )
{
}

/* 内申请失败的 Hook */
void vApplicationMallocFailedHook( void )
{
}

/* 栈溢出 */
void vApplicationStackOverflowHook( TaskHandle_t xTask, char * pcTaskName )
{
    while (1)
    {
        ;
    }
}
  • 并把 port.c 加入 Keil MDK5 工程

在这里插入图片描述

  • 此时编译正常通过了

适配完成了吗?

  • 需要运行一下,确认 FreeRTOS 是否可以正常运行,如果发现异常,再进行完善

最大线程优先级设置

  • 下载,调试运行,发现卡住任务的创建部分:任务优先级断言

在这里插入图片描述

  • 也就是FreeRTOS 配置一个最大任务优先级,常见的任务的运行优先级不能超过这个值,否则可以更改这个最大任务优先级设置 configMAX_PRIORITIES ,或者更改创建的任务的优先级

  • 这里在 FreeRTOSConfig.h 配置文件中定义,可以配置较大一点,默认 #define configMAX_PRIORITIES ( 5 ) 改为 #define configMAX_PRIORITIES ( 32 )

在这里插入图片描述

在这里插入图片描述

继续运行

  • 再次运行,发现用户的例程可以进入了,能正常调度了?

  • 不过调试过程,发现创建的两个线程函数,各进入一次后,好像就不再进来,难道延时存在问题(系统定时器)?

  • 继续排查 FreeRTOSConfig.h 的配置,这个配置文件是其他的板子拿过来的,需要看一遍,进行当前 MCU 平台的适配

排查运行问题

  • 当前怀疑系统延时不正常,也就是线程函数只进入一次后,就无法再次进入,线程函数中只有一个 vTaskDelay(1000); 延时,理论上是 1秒延时,如果 一个 tick 是 1ms

  • 确认系统定时器中断是否正常进入

  • FreeRTOS 的 Systick 中断: #define xPortSysTickHandler SysTick_Handler,也就是 xPortSysTickHandler,在 xPortSysTickHandler 中加入断点,调试运行,发现可以周期性进入断点

在这里插入图片描述

  • 继续测试,把 延时的时间缩短,发现可以很快的进入,说明调度没有问题

在这里插入图片描述

在这里插入图片描述

  • 如果延时不准确(调试与实际运行可能存在差异),可以尝试更改调试器时的晶振

  • 当前调度确认没有问题,FreeRTOS 初步适配完成

小结

  • 本篇主要讲解 FreeRTOS 的适配,当前创建的 两个 task,可以正常的切换,说明系统任务调度工作起来了。

  • 记下来可以增加串口打印、LED 驱动(用于指示系统运行),这样就可以摆脱调试,直接看到FreeRTOS 的运行效果了

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

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

相关文章

python-02

面向对象 Python中把具有相同属性和方法的对象归为一个类。 class ClassName: 语句 class Myclass: # 定义类Myclassdef pp(self): # 定义方法pp()print("这是产品说明书")myclass Myclass() # 实例化类Myclass myclass.pp() # 调用Myclass中的方法pp()打印…

深入浅出 Babel:现代 JavaScript 的编译器

在现代前端开发中,JavaScript 的版本更新速度非常快,新的语法和特性层出不穷。然而,旧版本的浏览器并不总是支持这些新特性。为了确保代码的兼容性和稳定性,我们需要一个工具来将现代 JavaScript 代码转换为旧版本的代码。Babel 就…

【Windchill监听器、队列、排程】

目录 Windchill监听器 监听器的概念 监听器的监听器实现原理 监听器的客制化 Windchill队列、排程 队列、排程的概念 Windchill常见出厂队列 自定义队列 Windchill 11新增功能 Windchill监听器 监听器的概念 监听器,字面上的理解就是监听观察某个事件&…

二进制中的相反数

相反数的本质 相反数的本质是两数相加等于 0,1 加上 1 的相反数-1 永远等于 0。 二进制中取相反数的公式 对于二进制运算来说减法是通过加上一个负数实现的,所以想要达成两数相加等于 0 的情况一定是通过溢出来实现。两数相加等于 0 可以带入为 1111…

部署LVS-DR群集...

目录 最后一台主机(第四台) 本地yum源安装httpd(非必做) 继续开始从最后一台主机开始(第四台) 转第二台主机 转第三台主机 回第二台 上传 转第三台主机 上传 回第二台 转第三台 转第一台主机…

一文看懂:数据湖、数据仓库、数据中台,浅显直白!

许多初入数据分析和数据可视化行业的人,对一些概念的认知往往很模糊,贝格前端工场截借此机会给大家讲解一下数据湖、数据仓库和数据中台的概念,力求浅显易懂。 一、什么是数据湖 数据湖是一种用于存储大量原始数据的存储系统,它…

拓扑排序、关键路径(AOV、AOE网)

拓扑排序(AOV网) 相关知识 在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个小的子工程,这些子工程被称为活动(Activity)。 在有向图中若以顶点表示活动&#xff…

零代码本地搭建AI大模型,详细教程!普通电脑也能流畅运行,中文回答速度快,回答质量高

这篇教程主要解决: 1). 有些读者朋友,电脑配置不高,比如电脑没有配置GPU显卡,还想在本地使用AI; 2). Llama3回答中文问题欠佳,想安装一个回答中文问题更强的AI大模型。 3). 想成为AI开发者,开…

家里满是“飞尘、毛絮”怎么办?用空气净化器,干净又卫生!

随着气温的升高,家中的毛絮和飞尘问题愈发严重,这些细小的颗粒常常聚集在房间的角落,即使每日清洁,似乎也难以彻底清除,反而可能使情况恶化。特别是对于养宠物的家庭来说,毛絮问题尤为突出,即使…

FullCalendar日历组件集成实战(15)

背景 有一些应用系统或应用功能,如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件,但功能比较简单,用来做数据展现勉强可用。但如果需要进行复杂的数据展示,以及互动操作如通过点击添加事件&#xff0…

LVGL:

LVGL(little video graphics library)是一个开源的嵌入式图形库,提供高性能、低资源占用的图形用户界面(GUI)。具有模块化(项目工程源码)设计,可以在多平台使用(如微处理…

《幻影大师:透视缠中说禅的虚像与真相》

而且他从不犯错,至少在他的叙述中是这样,所有的文章和言论都被粉饰得完美无瑕,即便有误,他也绝不公开承认,更别提什么真诚的道歉和改正了。那些对他推崇备至的人,多是盲目追随,将他神化为无所不…

Vue部分文件说明

1.eslintignore文件 Eslint会忽略的文件 # Eslint 会忽略的文件.DS_Store node_modules dist dist-ssr *.local .npmrc 2.gitignore # Git 会忽略的文件.DS_Store node_modules dist dist-ssr .eslintcache# Local env files *.local# Logs logs *.log npm-debug.log* yarn-de…

echarts写某个市地图

const geoJSON {"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":440303,"name":"罗湖区","center":[114.123885,22.555341],"…

简单易用的多功能图床Picsur

什么是 Picsur ? Picsur 是一款易于使用、可自行托管的图片分享服务,类似于 Imgur,并内置转换功能。支持多种格式的图片,包括 QOI、JPG、PNG、WEBP(支持动画)、TIFF、BMP、GIF(支持动画&#xf…

AI Agent智能应用从0到1定制开发(完结)

在数字化时代的浪潮中,人工智能(AI)代理智能应用如同星辰般璀璨,引领着技术革新的潮流。从零开始定制开发一款AI Agent智能应用,就像是在无垠的宇宙中绘制一颗新星的轨迹,每一步都充满了挑战与创新的火花。…

调试了一下午,终于把tailwindcss搞进Blazor了

在Vue和Uniapp项目中使用tailwindcss后,实在是太香了,非常符合我这从XAML走过来的老程序员的手感,所以老想着在Blazor项目中引入。看了几个老外大佬的视频,调试了一下午,终于是捣鼓成功了。由于咱们Blazor项目不在node…

[vue3]极速上手

介绍 vue3官网: Vue.js - 渐进式 JavaScript 框架 | Vue.js 1.0更容易维护 支持组合式API 可以减少代码量, 并且分散式维护转为集中式维护, 更容易封装复用 友好的TS支持 vue3的源码都被TS重写, 所以对TS的支持更友好 2.0更快的速度 新的diff算法, 模版编译优化, 更高效的…

【FireSim/Chipyard】解决FireSim Repo Setup步骤中Conda的firesim环境下载失败的问题

【FireSim/Chipyard】解决FireSim Repo Setup步骤中Conda的firesim环境下载失败的问题 问题描述 按照U250官方文档下载Conda环境的时候,即语句./scripts/machine-launch-script.sh --prefix REPLACE_ME_USER_CONDA_LOCATION的时候会遇到以下报错: Sol…

Locust web性能测试实践

Locust web性能测试实践 Locust 是一个开源的负载测试工具,使用Python语言实现,其简洁、轻量、高效的并发机制基于Gevent协程,可以实现单机模拟生成较高的并发压力。具有分布式和可扩展的特点,能够帮助你评估系统的性能并找到潜在…