Clion开发STM32之链接文件进行模块的一个解耦(编程方式)

news2024/12/29 9:02:48

问题的引入

在单片机的开发过程中,往往涉及到驱动的移植,但是移植的过程中又会去添加和修改主逻辑的驱动引脚初始化或时钟初始化,这里面就会存在一个问题就是:改动的地方太多了,容易影响到其它功能模块。所以能不能做成独立模块的东西,在模板内部去声明xxx,让程序主动来加载我们写的模块或驱动呢?如果你也有这个困扰的话,请阅读此篇内容。

前言

  1. 参考RT-Thread源码的链接文件
  2. 参考Linux驱动开发的驱动注册
  3. 参考网上一些对链接器脚本的说明文档
  4. 通过STM32CubeMx生成的链接器脚本文件,在此基础上进行修改.

正文

创建项目

  1. 使用stm32cubemx生成一个基本的工程项目即可,这里打开串口1,方便观察
    创建项目创建项目

简单重写一下串口打印

简单重写一下串口打印简单重写一下串口打印

源码

static char os_tx_buf[512];

void os_ps(char *format, ...) {
    va_list v_args;
    va_start(v_args, format);
    // 如果成功,则返回写入的字符总数,否则返回一个负数。
    int len = vsnprintf((char *) &os_tx_buf[0], (size_t)
            sizeof(os_tx_buf), (char const *) format, v_args);
    va_end(v_args);
    if (len > 0) {
        HAL_UART_Transmit(&huart1,(uint8_t *)os_tx_buf,len,1000);
    }
}

测试一下项目工程(保证工程正常运行)

测试一下项目工程在这里插入图片描述
在这里插入图片描述

链接文件的修改

步骤01: 在链接文件中添加硬件驱动初始化段

在这里插入图片描述

  /* 添加驱动初始化段名 */
 .driver.init :
  {
    /*展示当前驱动初始化起始地址*/
    __driver_init_start = .;
    /*这里对驱动进行排序(这里就是所有注册驱动的地址,在生成的时候自动分配地址(可以是结构体或函数的指针))*/
    KEEP (*(SORT(.driver_init*)))
    /*展示当前驱动初始化结束地址*/
    __driver_init_end = .;
    . = ALIGN(4);
  } >FLASH

步骤02: 编写自定义段加载规则模板(这里使用函数指针)

在这里插入图片描述

代码

#ifndef TEST_SECTION_TEST_H
#define TEST_SECTION_TEST_H

#include "main.h"
/* 宏定义一下 编译器的特性 */
#define sys_section(x)   __attribute__((section(x)))
#define sys_used         __attribute__((used))

/* 类型定义 驱动初始化函数类型 */
typedef void (*driver_init_fn)(void);

/* 宏定义驱动模块导出宏定义 (偷懒)*/
#define DRIVER_EXPORT(dr_name, init_fn) sys_used const  driver_init_fn __fn_##dr_name sys_section(".driver_init."#dr_name) = init_fn

#endif //TEST_SECTION_TEST_H

步骤03:编写一个测试驱动

在这里插入图片描述

代码

#include "section_test.h"

/**
 *@brief 模拟串口初始化
 *
 * */
void serial_driver_init(void) {

}

/*这句话就是将驱动导出到段中*/
DRIVER_EXPORT(serial_init, serial_driver_init);

步骤04:编译生成,查看map文件中,自定义段

在这里插入图片描述

步骤05:根据起始和结束地址编写统一的初始化函数

在这里插入图片描述在这里插入图片描述

步骤06:在主函数中调用统一初始化函数

在这里插入图片描述

步骤07:调试运行看是否会主动运行serial_driver_init函数

  1. 说明:此函数并没有和任何地方进行耦合。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

步骤08:结论

1. 我们自己写的代码只有这个驱动初始化需要在主逻辑里面执行,其它的都没有进行一个耦合.
2. 这里就可以做到和模块之间的耦合不再是在编写中进行一个耦合,而是把这个过程交给链接器去执行这个关联的逻辑

结语

  1. 本篇涉及到的链接器相关的知识,请自行去上网搜索

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

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

相关文章

200SMART CPU输入/输出接线的几个关键点

总结来看,S7-200系列PLC提供4个不同的基本型号的8种CPU,其接线方式也可大致分为6种: 1.CPU SR20接线 2.CPU SR40接线 3.CPU CR40接线 4.CPU ST40接线 5. CPU SR60接线 6. CPU ST60接线 除了CPU外,我们还需要了解200smart PLC的数…

Rocketmq面试(二)Rocketmq如何保证消息不丢失

如果想要保证消息不丢失就要知道,消息可能出现丢失得地方。 1.producer发送消息 2.Broker存储消息 3.Consumer消费消息 4.Broker主从切换 下面一共有9个维度可以保证消息不丢失。 目录 维度一:同步发送 维度二.异步发送 维度三.刷盘策略 维度四…

后端——平台登录功能实战

这里写目录标题 一、登录接口设计示意图二、后端设计三、创建用户表四、后端鉴权逻辑五、登录接口实现六、使用 JWT 生成 token七、路由鉴权八、登录与测试用例服务结合九、跨域一、登录接口设计示意图 二、后端设计 三、创建用户表 db=SQLAlchemy(app

华尔街新风向:多基金失英伟达机会

在过去一年多的美联储暴力加息周期中,科技成长股一直不怎么受到主流投资者待见,但面对今年美股“人工智能涨个不停”的局面后,过去两周里大量的知名基金都在撒开脚丫子狂追高速狂飙的“英伟达列车”。 根据监管文件显示,包括道富…

视频与AI,与进程交互(一)

目的 正在写一个视频与AI的工具,从接入,算法处理,转发,存储, 到调用AI进程,并且与AI进程进行交互,插件化,脚本化,做得比较辛苦,期间的进程和线程交互以及结果…

基于奥比中光深度相机进行虹膜识别处理

MATLAB仿真实现效果展示 图1 奥比中光红外深度相机拍摄效果 MATLAB仿真红外效果的图片,使用奥比中光的Astra_Pro深度相机和Astra进行拍摄,效果很好。 声明:本文的虹膜识别系统模型参考了西澳大利亚大学,计算机科学与软件工程学…

Spark 优化

1.RDD分区数 Task是作用在每个分区上的,每个分区至少需要一个Task去处理 改变分区数可间接改变任务的并行度,类似手动指定Reduce数量 第一个RDD的分区数由切片的数量决定 默认情况下子RDD的分区数等于父RDD的分区数 Shuflle类算子可手动指定RDD分区数 设…

chatgpt赋能python:Python屏幕截图并保存:简单易用的库

Python屏幕截图并保存:简单易用的库 屏幕截图是程序员们在软件开发中常用到的一个小技巧,对于调试、记录Bug、编写文档等方面有极大的帮助。而其中,Python成为了众多程序员的利器之一。 在Python中,大量的库提供了屏幕截图的方法…

PX4-机架选取(基于QG地面站)

因为我的无人机是F450,所以我选用F450的机架 点击应用后,要稍等一会 应用完成后在概述会标识

经纬度坐标为中心点生成米距离长度半径的圆形面,含java js源码+在线绘制,代码简单零依赖

文章目录 java版源码js版源码在线绘制预览效果关于计算的精确度 前些时间在更新我的坐标边界查询工具的时候,需要用到经纬度坐标点的距离计算,和以坐标点为中心生成一个指定距离为半径的圆,搜了一下没有找到现成简单又合适的代码,…

基于OpenCV 和 Dlib 进行头部姿态估计

写在前面 工作中遇到,简单整理博文内容涉及基于 OpenCV 和 Dlib头部姿态评估的简单Demo理解不足小伙伴帮忙指正 庐山烟雨浙江潮,未到千般恨不消。到得还来别无事,庐山烟雨浙江潮。 ----《庐山烟雨浙江潮》苏轼 https://github.com/LIRUILONGS…

2023智源大会议程公开 | 大模型新基建与智力运营论坛

6月9日,2023北京智源大会,将邀请这一领域的探索者、实践者、以及关心智能科学的每个人,共同拉开未来舞台的帷幕,你准备好了吗?与会知名嘉宾包括,图灵奖得主Yann LeCun、OpenAI创始人Sam Altman、图灵奖得主…

【模型评估】混淆矩阵(confusion_matrix)之 TP、FP、TN、FN;敏感度、特异度、准确率、精确率

你这蠢货,是不是又把酸葡萄和葡萄酸弄“混淆”啦!!!这里的混淆,我们细品,帮助我们理解名词“混淆矩阵” 上面日常情况中的混淆就是:是否把某两件东西或者多件东西给弄混了,迷糊了。把…

数据隐私保护的最佳实践:全面了解数据脱敏方案

1、数据脱敏 数据脱敏是一种保护敏感信息的安全措施,通常会将真实数据替换成模拟数据或者经过处理后的数据。下面是常见的数据脱敏实现方案: 字符串替换:将需要脱敏的字符串中指定位置的字符替换为“****”或其他符号。例如,将银…

MySQL数据库误删恢复

前言 经常听说删库跑路这真的不只是一句玩笑话,若不小心删除了数据库,事情很严重。你一个不小心可能会给公司删没。建议研发不要直连生成环境,一般的话都会分配账号权限,生产环境的账号尽量是只读,以防你一个不经意给库或表删除。一定要备份,这很重要,这是一个血的教训。…

iTOP3568开发板-Buildroot 系统设置待机和锁屏

Weston 的超时待机时长可以在启动参数中配置,也可以在 weston.ini 的 core 段配置。 方法一: 修改文件系统中/etc/init.d/S50launcher 文件,如下图所示的红框,0 代表禁止待机,可自行设置待机时间,单位是秒。 方法二&a…

深浅拷贝各种实现方式性能

拷贝方式 拷贝方式类型原理备注Object.clone()默认 浅拷贝,可以自定义实现深拷贝对象内存复制constructor可以实现深拷贝自定义实现BeanUtil.copyProperties()浅拷贝利用 getter/setter 实现属性拷贝反射,spring utilCollectionUtils.clone()深拷贝本质…

强化学习驱动的低延迟视频传输

随着视频会议、视频直播的流行以及未来AR/VR业务的发展,低延迟视频传输服务被广泛使用,但视频质量(QoE)还不能满足用户要求。那么近年来新兴的AI神经网络是否能为视频传输带来智能化的优化?今天LiveVideoStack大会北京…

macos m1 pip install lightgbm error

MacOS M1电脑,执行 pip install lightgbm 错误如下: 尝试如下操作: 参考链接如下: https://github.com/Microsoft/LightGBM/issues/1324 brew install cmake brew install gcc git clone --recursive https://github.com/Micro…

Unity之OpenXR+XR Interaction Toolkit接入HTC Vive解决手柄无法使用的问题

前言 随着Unity版本的不断进化,VR的接口逐渐统一,现在大部分的VR项目都开始使用OpenXR开发了。基于OpenXR,我们可以快速适配HTC,Pico,Oculus,等等设备。 今天我们要说的问题就是,当我们按照官方的标准流程配置完OpenXR后(参考:Unity之OpenXR+XR Interaction Toolkit…