STM32CubeMX 中配置__weak类型函数和用法

目录

概述

1  weak类型函数

1.1 weak类型函数介绍

1.2 weak类型函数的特点

2 在 STM32CubeMX中配置weak类型函数

2.1 配置函数类型

2.2 生成代码

2.3 验证

3  _weak类型函数项目中的应用

3.1 重写_weak类型函数

3.2 测试 

4  总结


概述

本文主要介绍__weak类型函数的用法,还介绍了如何使用STM32CubeMX创建__weak类型函数。并使用实际的案例来说明重写__weak类型函数之前和之后,这种类型函数的运行情况。_weak类型函数是一种非常重要类型函数,其有点类似虚函数。在实际项目中,可以作为接口函数使用。

1  weak类型函数

1.1 weak类型函数介绍

在ST提供的STM32H7xx_HAL_Driver库中,可以找到需要__weak类型的函数,例如:

这些库函数,基本上都是Callback类型的函数,其作用时,用户可以重写它们,如果这类函数没有被重写,则直接调用该__weak标记的函数。

1.2 weak类型函数的特点

在STM32库函数中,_weak函数是一种特殊的函数类型。它允许用户在自己的应用程序中定义具有相同名称的函数,以覆盖库函数的默认实现_weak函数是一个弱符号(weak symbol),它是一个具有默认实现的函数。当链接器在编译时遇到具有相同名称的函数定义时,它首先选择用户定义的函数而不是库函数。如果用户没有定义该函数,那么库函数的默认实现将被使用。

使用_weak函数的主要目的是允许用户根据应用程序的需求来修改库函数的行为。例如,库函数可能提供了一个默认的错误处理机制,但用户可能希望在发生错误时采取不同的行动。通过定义一个具有相同名称的_weak函数,用户可以覆盖库函数的默认行为。

在应用程序中定义_weak函数的方法是在函数声明前加上__weak修饰符,例如:

__weak void my_function(void)

{

     // 用户自定义实现 // ...

}

需要注意的是,_weak函数的定义必须与库函数的原型相匹配,否则会导致链接错误。

总之,_weak函数是一种在STM32演示库中允许用户自定义覆盖库函数行为的特殊函数类型。它通过定义具有相同名称的函数来实现此功能。

2 在 STM32CubeMX中配置weak类型函数

2.1 配置函数类型

现在以在FREEERTOS中创建Task为例,介绍使用STM32CubeMX来创建__weak类型的函数。

1) 定义mainTask

定义task名称: mainTask

函数名称 : mainTask

2) 定义stateTask

确定之后,在STM32CubeMX工具中,已经完成函数的定义工作。在函数列表中可以看见函数的定义类型为: As weak

2.2 生成代码

在STM32CubeMX工具中完成函数设计之后,就可以点击GENERATE CODE,来生成项目文件,生成的项目文件结构如下:

2.3 验证

这两个函数没有被重写的情况下,系统上电后,直接运行这两个函数。调试测试代码,分别在这两个函数中添加断点,查看函数运行起来,是否能停在断点处。

在mainTask()函数和stateTask() 函数里分别加上断点,快速运行程序。断点首先会停在mainTask()函数中。

在快速执行代码,断点会跳到stateTask() 函数里

3  _weak类型函数项目中的应用

3.1 重写_weak类型函数

__weak类型的函数没有被重写之前,系统会调用这些函数,现在创建一个appTask.c文件,在该文件中重写__weak类型的函数

详细代码如下:

#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

void mainTask(void *argument)
{
  for(;;)
  {
    osDelay(1);
  }
}


void stateTask(void *argument)
{

  for(;;)
  {
    osDelay(1);
  }
}

将appTask.c文件加载到工程中,然后编译代码:

3.2 测试 

 编译代码后,使用debug功能运行代码,且分别在appTask文件中的两个函数添加断点。

在stateTask() 函数里的运行情况:

 在freertos.c中的mainTask()函数和stateTask()函数,已经不能执行

4  总结

__weak类型函数在实际项目开发过程中是非常有用,其非常有类似java中接口的特性,便于实现将用户代码和系统生成或者库函数分开。对解耦特性的实现非常有帮助。

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

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

相关文章

java算法day44 | 动态规划part06 ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论基础 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。 体现在代码中就是对背包的遍历顺序不同。01背包是逆序遍历背包,完全背包是顺序遍历背包。 518. 零钱兑换 II class Solution {public int change(int amount, int[] coin…

接口调用成功后端却一直返回404

vuespringboot 我在vue.config.js中配置了向后端的反向代理 然后使用了axios向后端发送post请求 可以看到可以接收到前端传来的值 但是前端控制台却报了 “xhr.js:245POST http://localhost:7777/api/login 404 (Not Found)” 最后询问我那智慧的堂哥... ... 解决办法是把C…

Flutter Boost 3

社区的 issue 没有收敛的趋势。 设计过于复杂,概念太多。这让一个新手看 FlutterBoost 的代码很吃力。 这些问题促使我们重新梳理设计,为了彻底解决这些顽固的问题,我们做一次大升级,我们把这次升级命名为 FlutterBoost 3.0&am…

IMAP的要点:旅行前需要了解的内容

你是否经常因会议而出差,需要在各种设备上灵活地访问你的电子邮件?如果是的话,你可能会想了解你的电子邮件系统是如何通过使用互联网消息访问协议(IMAP)来工作的,这样当你不在办公桌前时,你可以…

1.Docker简介和安装

1 Docker 简介 1.1 Docker 是什么? docker是一个开源的应用容器引擎。 1.2 容器是什么? 容器是一种轻量级的虚拟化技术 ,它是一个由应用运行环境、容器基础镜像组成的集合。 以 Web 服务 Nginx 为例,如下图所示:Ngin…

Revit 2025新功能一览~

Hello大家好!我是九哥~ Revit2025已经更新,安装后,简单试了下,还是挺不错的,流畅度啊,新功能啊,看来还是有听取用户意见的,接下来就简单看看都有哪些新功能。 好了,今天的…

大转盘抽奖小程序源码

源码介绍 大转盘抽奖小程序源码,测试依旧可用,无BUG,跑马灯旋转效果,非常酷炫。 小程序核心代码参考 //index.js //获取应用实例 var app getApp() Page({data: {circleList: [],//圆点数组awardList: [],//奖品数组colorCirc…

CVPR24_ArGue: Attribute-Guided Prompt Tuning for Vision-Language Models

Abstract 尽管软提示微调在调整视觉语言模型以适应下游任务方面表现出色,但在处理分布偏移方面存在局限性,通过属性引导提示微调(Attribute-Guided,ArGue)来解决这个问题 Contributions 与直接在类名之前添加软提示…

Web Component 组件库有什么优势

前言 前端目前比较主流的框架有 react,vuejs,angular 等。 我们通常去搭建组件库的时候都是基于某一种框架去搭建,比如 ant-design 是基于 react 搭建的UI组件库,而 element-plus 则是基于 vuejs 搭建的组件库。 可能你有这种体…

.net框架和c#程序设计第二次测试

一、实验内容 1、设计一个用户登录页面webform1.aspx,效果如下图所示: 2、点击webform1.aspx中“还未注册”连接进入register.aspx,注册页面效果如下图所示:点击用户注册信息到usershow.aspx页面,并显示注册的用户信息…

线上研讨会 | 应对汽车毫米波雷达设计中的电磁挑战

智能汽车、新能源汽车最近几年一直是汽车行业关注的热点,随着5G技术越来越普及,汽车智能化发展将越来越迅速。从传统汽车到智能汽车,不是简单功能的增强,而是从单一功能的交通工具变成可移动的办公和娱乐空间,成为物联…

MacOS Docker 部署 Redis 数据库

一、简介 Redis是一个开源的、使用C语言编写的、基于内存亦可持久化的Key-Value数据库,它提供了多种语言的API,并支持网络交互。Redis的数据存储在内存中,因此其读写速度非常快,每秒可以处理超过10万次读写操作,是已知…

GD32F470_MQ-2烟雾检测传感器模块移植

2.5 MQ-2烟雾检测传感器 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~3000摄氏度时,二氧化锡表面吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加…

模板匹配——基于模板与基于特征的两种模板匹配对比

概述 在人工智能(AI)的研究领域中,模板匹配不仅是一个重要的研究课题,也是解决图像处理中核心问题——定位兴趣区域的关键方法之一。通过模板匹配,可以准确地识别和定位给定图像中的特定对象。这项技术在对象检测、跟…

【Week-Y4】修改yolov5s中C3模块的结构,common.py文件解读

修改C3模块的结构 一、commom.py文件解析二、修改代码,运行train.py训练 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 📕本次任务:将yolov5s网络模型…

Dynamo之雪花分形(衍生式设计)

你好,这里是BIM的乐趣,我是九哥~ 今天简单分享一些我收集的Dynamo的雪花分形案例吧,不过多讲解了,有兴趣的小伙伴,可以私信“雪花分形”获取案例文件,下面基本以分享为主: ******多图预警****…

第四百四十二回

文章目录 1. 概念介绍2. 使用方法2.1 获取思路2.2 获取方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取屏幕相关参数"相关的内容,本章回中将介绍如何获取AppBar的高度.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《含储能接入的三相配电网分布式可再生能源可调度域建模与计算》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

糟糕,Oracle归档满RMAN进不去,CPU98%了!

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

程序员延寿指南:科学延寿 20 年 | 开源日报 No.214

geekan/HowToLiveLonger Stars: 28.7k License: Unlicense HowToLiveLonger 是一个程序员延寿指南项目。 该项目旨在提供关于如何延长寿命的指南,特别是针对程序员群体。该项目包括术语、目标、关键结果、分析、行动和证据等内容,涵盖了各种与健康相关的…