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

2024-06-16 02:44

本文主要是介绍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 的运行效果了

这篇关于FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《03》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065281

相关文章

图形编辑器基于Paper.js教程03:认识Paper.js中的所有类

先来认一下Paper的资源对象,小弟有哪些,有个整体的认识。认个脸。 在Paper.js的 官方文档中类大致有如下这些: 基类: ProjectViewItemPointToolSizeSegmentRectangleCurveCurveLocationMatrixColorStyleTweenToolEventGradientGradientStopEvent 二级或三级类 继承Ite

移植对话框MFC

VC版 MFC程序对话框资源移植 以下均拷贝自上面,仅用来记录 (部分有删除) 法1: Eg:将B工程调试好的对话框移植到A工程中 1.资源移植         1.1  在2017打开B工程,在工作区Resource标签页中选中Dialog文件夹下的资源文件,按Ctrl+C或点击Edit->Copy.         1.2. 关闭当前工程,注意不要关闭VC6,打开B工程(File

Android自定义View学习笔记03

Android自定义View学习笔记03 参考gitHub上面的开源项目CircleImageView 预备知识 BitMap类 BitMap位图类,其中有一个嵌套类叫Bitmap.Config,内部有四个枚举值。这个类的作用是定义位图存储质量,即存储一个像素的位数,以及是否能显示透明、半透明颜色(Possible bitmap configurations. A bitmap co

软考初级网络管理员_03_硬件单选题

1.CPU是一块超大规模的集成电路,其主要部件有()。 运算器、控制器和系统总线 运算器、寄存器组和内存储器 控制器、存储器和寄存器组 运算器、控制器和寄存器组 2.(请作答此空)是指CPU一次可以处理的二进制的位数,它直接关系到计算机的计算精度、速度等指标:运算速度是指计算机每秒能执行的指令条数,通常以()为单位来描述。 宽带 主频 字长 存储容量 3.CPU执行指令时,先根

基于imx6ull开发板 移植opencv4.7.0

一、概述 本章节是针对opencv-4.7.0移植到Linux系统,运行在正点原子-I.MX6U ALPHA开发板 上,详细的移植流程如下。 二、环境要求 2.1 硬件环境 正点原子-I.MX6U ALPHA开发板虚拟机:VMware 2.2 软件环境 Ubuntu系统要求:20.04opencv版本: 4.7.0opencv贡献软件版本:4.x交叉工具链版本:gcc-linaro-6

【FreeRTOS】任务管理与调度

文章目录 调度:总结 调度: 相同优先级的任务轮流运行最高优先级的任务先运行 可以得出结论如下: a 高优先级的任务在运行,未执行完,更低优先级的任务无法运行b 一旦高优先级任务就绪,它会马上运行(假设厨房着火了,会马上去灭火)c 如果最高优先级的任务有多个,他们轮流运行 他们都是使用链表进行管理 打开CubeMX,最高优先级56 56个List, Rad

03 TensorFlow 2.0:TOPK Accuracy实战

这江山风雨 岁月山河 刀光剑影 美了多少世间传说 且看他口若悬河 衣上有风尘 却原来是一位江湖说书人                                                                                                                                 《说书人》 在分类问题中会遇到TO

conda环境的备份和移植

备份和移植 Conda 环境可以通过以下步骤实现: 克隆环境 conda create --name backup_myenv --clone myenv# 删除原环境# conda remove --name myenv --all 移植 Conda 环境 方法1:使用 environment.yml 文件移植环境 # 导出环境的依赖项conda env export --na

Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!

代码仓库 会同步代码到 GitHub https://github.com/turbo-duck/flink-demo 当前章节 继续上一节的内容:https://blog.csdn.net/w776341482/article/details/139875037 上一节中,我们需要使用 nc 或者 telnet 等工具来模拟 Socket 流。这节我们写一个 ServerSocket

【FreeRTOS】创建任务_使用任务参数

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 文章目录 前言编写任务函数创建任务任务保护措施写了个bug疑问遗留问题效果freertos.c 学习链接 前言 配套源码:06_create_task_use_params 我们创建3个任务,使用同一个函数,但是在LCD上打印不一样的信息。 3个任务使用同一个函数,但是他们运行的栈不一样