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

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

FreeRTOS学习笔记(六)队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列的基本内容1.1 队列的引入1.2 FreeRTOS 队列的功能与作用1.3 队列的结构体1.4 队列的使用流程 二、相关API详解2.1 xQueueCreate2.2 xQueueSend2.3 xQueueReceive2.4 xQueueSendFromISR2.5 xQueueRecei

开发板NFS挂载文件目录

文章目录 序NFS1. 安装 NFS 服务器和客户端在服务器上(NFS 服务器端)在客户端上(NFS 客户端) 2. 配置 NFS 服务器创建共享目录编辑 `/etc/exports` 文件启动 NFS 服务 3. 在客户端挂载 NFS 共享创建挂载点挂载 NFS 共享验证挂载 4. 设置开机自动挂载5. 解决权限问题 序 本节主要实现虚拟机(服务器)与开发板(客户端)通过N

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

Vue day-03

目录 Vue常用特性 一.响应更新 1. 1 v-for更新监测 1.2 v-for就地更新 1.3 什么是虚拟DOM 1.4 diff算法更新虚拟DOM 总结:key值的作用和注意点: 二.过滤器 2.1 vue过滤器-定义使用 2.2 vue过滤器-传参和多过滤器 三. 计算属性(computed) 3.1 计算属性-定义使用 3.2 计算属性-缓存 3.3 计算属

安卓开发板_联发科MTK开发评估套件串口调试

串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器,按芯片来分,有以下几种: CH340PL2303CP2104FT232 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.