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

系列文章

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).
  • 也就是有五个函数需要移植与适配
 pvPortMallocvPortFreevApplicationIdleHook 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.mzph.cn/diannao/29545.shtml

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

相关文章

测试开发面经分享,面试七天速成 DAY 1

1. get、post、put、delete的区别 a. get请求: i. 用于从服务器获取资源。请求参数附加在URL的查询字符串中。 ii. 对服务器的请求是幂等的,即多次相同的GET请求应该返回相同的结果。 iii. 可以被缓存,可以被收藏为书签。 iv. 对于敏感数据不…

C++ | Leetcode C++题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution { public:int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}int maxPoints(vector<vector<int>>& points) {int n points.size();if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i…

springboot、springcloud、springcloudalibaba版本组件之间对应关系

参考 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E#%E6%AF%95%E4%B8%9A%E7%89%88%E6%9C%AC%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8 毕业版本依赖关系(推荐使用) 由于 Spring Boot 3.0&…

UART基本定义、三种编程方式、freertos内怎么用、怎么封装

文章目录 串口基本概念串口的三种编程方式uart编程查询方式不常用、其他两个方式用的多中断方式&#xff1a;代码原理 DMA方式&#xff1a;配置DMA原理代码 效率最高的UART编程方式&#xff1a;是什么&#xff1f;操作 在freertos里面调用uart应该怎么做&#xff1f;代码 面向对…

uniapp canvas生成海报

效果 封装组件&#xff0c;父组件 ref 调用 downImgUrl()函数&#xff0c;其他根据自己需求改 <template><view><view class"bgpart"><canvas class"canvas-wrap" canvas-id"canvasID" type"2d"></canvas…

jsp运行提示_jsp.java某行存在错误问题的解决

jsp运行提示XXX_jsp.java某行存在错误问题的解决 在编译运行jsp文件时&#xff0c;出现类似如下提示&#xff1a; 49行发生错误&#xff0c;要注意&#xff1a; 这里所指的49行并非jsp文件的第49行&#xff0c;而是编译后的jsp.java文件的第49行。 因此&#xff1a;解决问题…

saas考试系统和私有化考试系统的区别

SaaS考试系统和私有化考试系统&#xff0c;作为现代信息化教育的重要工具&#xff0c;各有其独特的优势和特点。本文将从多个维度对这两种系统进行深入剖析&#xff0c;以揭示它们之间的核心差异。 首先&#xff0c;从部署方式来看&#xff0c;SaaS考试系统是基于云服务的在线考…

STM32--IAP程序升级实验

1. STM32程序升级方法 1.1 ST-link / J-link下载 将编译生成的hex文件使用ST-Link/J-Link工具直接下载进 Flash 即可。Keil中点击下载也能一键下载。下载后的代码会存放在Flash的起始地址0x0800 0000处。 简单补充一句&#xff0c;bin文件和hex文件的区别&#xff1a; bin文…

论坛产品选型,需要关注哪些点?

论坛社区是一个经久不衰的行业&#xff0c;比如我们常见的宠物社区&#xff0c;校园社区&#xff0c;游戏社区、企业内部社区&#xff0c;品牌社区&#xff0c;本地同城、私域社区项目、付费社群、问答社区等等&#xff0c;可以说是覆盖了各行各业&#xff0c;那么如果我们要搭…

Python实现管线建模 - 3.同心变径管

往期回顾 Python实现管线建模 || 1.圆直管、方管https://blog.csdn.net/Xxy9426/article/details/138836778?spm1001.2014.3001.5501 对依赖库的补充 随着后续内容的深入&#xff0c;我发现单纯靠trimesh库已经无法完成后续的建模&#xff08;涉及到多个几何体拼接或者是创建…

全域外卖系统源码在哪搭建?哪家公司的系统源码最值得推荐

随着全域外卖的兴起&#xff0c;全域外卖系统源码搭建逐渐在众多全域外卖赛道的入局方式中脱颖而出。但是&#xff0c;就目前多个创业者社群就这一话题的讨论程度来看&#xff0c;绝大多数创业者对于全域外卖系统源码搭建模式的了解都仅仅停留在“是什么”层面&#xff0c;而对…

Conmi的正确答案——Vue默认加载方式设置为Yarn后怎么修改

Vue版本&#xff1a;3 1和2主要是搜索文件所在位置&#xff0c;Windows的这个文件一般在“C:\User{当前用户}”下&#xff0c;linux的非root情况下一般在“/home/{当前用户}”下。 1、打开“Everything”&#xff1b; 2、搜索“vuerc”&#xff1b; 3、打开“.vuerc”&#xf…

Boom3D软件下载-Boom3D音效增强工具下载附加详细安装步骤

Boom3D音效增强工具是一款便捷的为用户们进行音频处理和编辑的软件&#xff0c;支持用户们轻松的进行音频的使用&#xff0c;支持超多的音频格式让你可以轻松的进行使用&#xff0c;Boom3D音效增强工具拥有多种音频特效的功能&#xff0c;让你可以在Boom3D音效增强工具轻松的进…

Linux时间子系统5:timekeeper、timecountercyclecounter

1. 前言 前面我们介绍了用户态获取时间的接口clock_gettime&#xff0c;时钟的种类posix_clocks以及时钟源clocksource。那么我们思考这样一个问题&#xff0c;无论clock_gettime或者posix_clock定义的时间都是相对于某个起始点的时间&#xff0c;即相对于Linux Epoch的秒数&am…

pytorch安装----CPU版本

在安装之前&#xff0c;需要先配置GPU环境&#xff08;安装CUDA和CudaNN) 命令行输入nvidia-smi&#xff0c;查看驱动信息 安装相应的CUDA 和CUDANN 验证&#xff1a;输入nvcc --version 或者nvcc -V 进行检查 在anaconda里创建环境 conda create -n py39gpu python3.9激活环…

丰臣秀吉-读书笔记二

“啊&#xff01;平凡的一生&#xff0c;想来也够长了。不过也短。究竟长还是短&#xff1f;或许只有这一刹那是永恒的吧&#xff0c;死亡的一刹那。生命若是永恒&#xff0c;也就取决于那一刹那。” 如果我死了&#xff0c;我的愿望只有这个&#xff1a; “无论多么黑暗&#…

【STC8A8K64D4开发板】第3-1讲:温度传感器DS18B20

第3-1讲&#xff1a;温度传感器DS18B20 学习目的了解DS18B20数字温度传感器的基本原理及其数据格式。掌握STC8A8K64D4与DS18B20单总线通信的程序设计&#xff0c;通信步骤&#xff0c;数据校验等。 硬件电路设计 DS18B20简介 DS18B20主要特性 DS18B20是Dallas 半导体公司推出的…

KernelFuzzer部署、使用与原理分析

文章目录 前言1、概述1.1、整体架构1.2、工作流程1.2.1、环境配置流程1.2.2、计划任务执行流程1.2.3、Fuzz测试流程1.2.3.1、整体资源调度1.2.3.2、选取Fuzz测试目标1.2.3.3、生成Fuzz测试参数1.2.3.4、进行Fuzz测试 2、安装与使用2.1、源码安装2.1.1、部署系统依赖组件2.1.1.1…

硫碳复合材料可用作固态电池正极材料 锂硫电池是重要下游

硫碳复合材料可用作固态电池正极材料 锂硫电池是重要下游 硫碳复合材料&#xff0c;是半固态电池、固态电池的正极材料&#xff0c;主要用于金属硫电池制造领域&#xff0c;在锂硫电池应用中研究热度最高。 锂硫电池&#xff0c;一种二次电池&#xff0c;以硫元素为正极&#x…

HarmonyOS 页面路由(Router)

1. HarmonyOS页面路由(Router) 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块&#xff0c;通过不同的url地址&#xff0c;可以方便地进行页面路由&#xff0c;轻松地访问不同的页面。本文将从页面跳转、页面返回和页面返回前增加一个询问…