编程意识——宏定义封装多个函数参数

2023-05-16

在这里插入图片描述

作者|釜薪君
公众号|嵌入式杂牌军


文章目录

  • 前言
  • 一、这种意识的来源
  • 二、实现源码分析
    • 1.函数调用
    • 2.宏定义部分
    • 3.函数实现
    • 4.宏替换后的函数调用
  • 总结


前言

今天带小伙伴们分析一段不错的代码,学习一下关于宏封装的一种意识,希望对大家有所帮助哈,阅读过程中如果有什么问题,可以后台留言哈!


一、这种意识的来源

此代码来源于RT1052官方的SDK源码,不管是什么芯片,只要有类似的操作都可以这样去使用,代码的功能是对RT1052的GPIO进行配置的,下面我就带小伙伴们追本溯源一下,一起培养一下这个意识。

二、实现源码分析

1.函数调用

看到下面的函数调用你可能感觉没啥!这就是函数调用嘛!继续往下看吧!

IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U);                                    
IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01, 0U);                                    
IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02, 0U);                                    
IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03, 0U);

2.宏定义部分

看到这里你会发现,这个宏怎么一大串用逗号隔开的数据。再往下看看函数定义吧!

#define IOMUXC_GPIO_EMC_00_SEMC_DATA00 0x401F8014U, 0x0U, 0, 0, 0x401F8204U
#define IOMUXC_GPIO_EMC_01_SEMC_DATA01 0x401F8018U, 0x0U, 0, 0, 0x401F8208U
#define IOMUXC_GPIO_EMC_02_SEMC_DATA02 0x401F801CU, 0x0U, 0, 0, 0x401F820CU
#define IOMUXC_GPIO_EMC_03_SEMC_DATA03 0x401F8020U, 0x0U, 0, 0, 0x401F8210U

3.函数实现

代码实现如下,不需要理解其意思看形式就行。

static inline void IOMUXC_SetPinMux(uint32_t muxRegister,     // 引脚复用寄存器
                                    uint32_t muxMode,         // 引脚复用模式
                                    uint32_t inputRegister,   // 输入寄存器
                                    uint32_t inputDaisy,      // 输入链,这个不知道是干啥的,一般其值都是0
                                    uint32_t configRegister,  // 配置寄存器
                                    uint32_t inputOnfield)    // 输入是否软件可读
{
     *((volatile uint32_t *)muxRegister) =
          IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) | IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);

     if (inputRegister)
     {
          *((volatile uint32_t *)inputRegister) = inputDaisy;
     }
}   

我们可以看到参数经过了处理,地址赋值等操作。

我们同时可以发现,一些参数就是另一些参数的处理后的配置值,这个意识get到了吧?

4.宏替换后的函数调用

既然是宏我们手动去替换一下,然后去追本溯源看看它到底是个啥吧!

IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U);       // 替换前
IOMUXC_SetPinMux(0x401F8014U, 0x0U, 0, 0, 0x401F8204U, 0U); // 替换后

我们到芯片手册去追本溯源一下吧!

401F8014这个十六进制数据,在芯片手册用“_”隔开才能找到,即你需要搜索401F_8014,得到的结果如下。

在这里插入图片描述

找到,再去寄存器部分看看就知道这个地址对应的寄存器都进行了啥配置了,它是个引脚复用寄存器,用于设置输入是否软件可读,引脚复用的功能。

第二个参数0x0U,是设置复用模式的编号,用作复用模式0,即ALT0,它的功能时将此引脚用作SEMC_DATA00,即SEMC控制的SDRAM的数据引脚0。

下面的三个0具体没用过,跳过啦。

401F8204是另一寄存器的地址值,当然是需要转换为地址的,到芯片手册去搜下401F_8204,结果如下。

在这里插入图片描述
看芯片可以知道这是对此引脚的速度、压摆率、内部上下拉、滞回等引脚相关的配置。

分析到最后我们可以知道这个函数是如何进行GPIO引脚功能的配置了,比较特殊的是,NXP官方将所有GPIO的引脚功能(包括各种复用)都整成了一个宏,如IOMUXC_GPIO_EMC_00_SEMC_DATA00,它是见名知意的你用那个引脚的什么功能就去找到这个宏用函数进行配置即可。

它也留了一个可以配置的参数inputOnfield,它可以配置输入是否软件可读。即把固定的内容用宏封装好,根据功能进行调用,将不固定的内容,设为独立的参数。


总结

以上就是今天的分享,大家不要局限于对上面内容的理解,get到上面的意识是最重要的。

以后你在编程中可以将相关的操作用宏进行整体功能封装,前期可能耗时,但后期好维护。

提醒一下:数组赋值也可以用宏进行封装哈,它也是用逗号隔开的,大家试着去迁移一下吧!


欢迎关注公众号~

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程意识——宏定义封装多个函数参数 的相关文章

  • 9. fastApi的json编码器使用示例

    JSON 编码器 有时 xff0c 我们要把 Pydantic 模型等数据类型转换为字典 列表等与 JSON 兼容的格式 例如 xff0c 把 Pydantic 模型存入数据库时就要进行转换 为此 xff0c FastAPI 提供了 jso
  • 10. fastApi数据更新方法

    用 PUT 更新数据 把输入数据转换为 JSON 数据 xff08 例如 xff0c 使用 NoSQL 数据库时 xff09 xff0c 可以使用 jsonable encoder 例如 xff0c 把 datetime 转换为 str P
  • 写在前面--(与各位读者聊聊)

    xff61 xff65 xff65 xff89 xff9e 嗨 xff01 我是jesse xff0c 欢迎来到我的Python爬虫博客专栏 xff01 在本专栏中 xff0c 我将分享Python爬虫技术的各个方面 xff0c 包括基础知
  • 爬虫示例一【简单爬虫实现】

    爬虫构建 回顾以上的接口分析过程 xff0c 整个对我们有用的请求过程是 xff0c 浏览器发送一个GET请求 xff0c 直接获取到了我们想要的数据页面 那么如何通过python代码复现以上的请求过程呢 xff1f 对于这样的简单爬虫 x
  • 第一节 请求与响应

    请求 由客户端发往服务器 xff0c 分为四个部分 xff1a 请求头 xff0c 请求方法 xff0c 请求网址URL 请求体 当我们在浏览器中输入一个网址或点击一个链接时 xff0c 浏览器会向服务器发送请求 xff0c 请求获取指定的
  • 第二节 Web网页基础

    网页的组成 网页需要通过 HTML CSS JavaScript 和各种媒体资源的组合 xff0c 实现多种功能和呈现效果的页面 一个网页通常由以下几个组成部分构成 xff1a HTML标记语言 xff1a 定义网页的结构 内容和格式 xf
  • 第三节 爬虫基本原理

    爬虫概述 爬虫是指通过程序自动化地获取互联网上的信息 xff0c 从而达到快速 大量地获取数据的目的 Python语言有着丰富的爬虫库和框架 xff0c 因此成为了编写爬虫程序的主流语言之一 Python写爬虫的优势 xff1a 语法简洁
  • 第四节 Session和Cookie

    静态页面和动态页面 静态页面是指服务器上存储的固定页面 xff0c 每次用户访问时返回的内容都是一样的 xff0c 内容不会根据用户的操作或者其他因素发生改变 静态页面通常由 HTML CSS 和 JavaScript 等静态文件组成 xf
  • 案例四 ajax动态加载页面数据爬虫

    需求 xff1a 爬取https spa3 scrape center 电影名称 xff0c 电影分类 xff0c 上映时间和评分 接口分析 直接在浏览器请求https spa3 scrape center xff0c 并查询网页源码 xf
  • python数据持久化总结

    数据持久化 数据持久化通常指将数据保存到磁盘或其他永久存储介质中以便以后使用 以下是一些在Python中进行数据持久化的常用方法 xff1a 文件操作 xff1a 可以使用Python内置的文件操作来将数据保存到文本文件中 xff0c 例如
  • MongoDB查询综合

    数据库操作 选择数据库 use lt 数据库名 gt 展示当前所在数据库 db 在选择数据库后 xff0c 可以进行该数据库的相关操作 xff0c 例如创建集合 插入文档等 查询语法 查询全部文档 db lt 集合名 gt find 指定条
  • c++如何编译

    include lt iostream gt 预处理指令 xff0c include是找一个文件 xff0c 一般引出头文件 int main main函数不用从主函数返回任何数据 std cout lt lt 34 Hello World
  • 在DAX进行字符串大小比较

    昨天看到一个人在论坛上上求助 xff0c 想找一个方法按照一定要求对数据进行分类 分类要求是查找原始数据中的BU Type隶属于分类依据中的哪个区间 xff0c 然后输出该区间对应的Identifier值 其中AA ZZ区间指的是所有两位字
  • Modbus协议的数据模型和地址模型,Modbus寄存器40001,30001是什么意思?

    在使用Modbus协议的时候 xff0c 经常会遇到诸如40001 30001 xff0c 10001之类的地址 xff0c 这些数字代表什么含义呢 xff1f 这其实是Modbus协议的数据模型和地址模型 Modbus协议的数据模型 数据
  • 如何看懂Modbus数据帧?Modbus RTU数据帧格式

    在介绍Modbus RTU数据帧格式之前 xff0c 首先让我们先了解一下Modbus的通讯模式 Modbus通讯模式 Modbus协议是典型的主 从通讯结构 xff0c 链路中只能有一台主设备 xff0c 可以有多台从设备 主设备向从设备
  • 网络安全,非对称加密,对称加密和非对称加密的区别

    当今世界 xff0c 网络安全问题比以往任何时候都更需认真对待 本文是属于 网络安全 系列文章之一 xff0c 我们将详细阐述了安全性的基础知识 在本文中 xff0c 我们将阐述非对称加密的原理 xff0c 这是确保真实性 完整性和保密性的
  • Modbus的常见问题解答:RS485总线连接采用什么样的线缆?RS485总线为什么要采用手拉手结构?RS485总线在连接时为什么要屏蔽接地?什么叫共模干扰和差模干扰?如何消除通讯线上的干扰?

    RS485总线连接采用什么样的线缆呢 xff1f 必须采用国际上通行的屏蔽双绞线 推荐用屏蔽双绞线的型号为RVSP2 0 5 xff08 二芯屏蔽双绞线 xff0c 每芯由16 股的0 2mm的导线组成 xff09 xff0c 线材特性阻抗
  • 积跬步,至千里 | 详解NP40芯片的三个节能「小举措」

    2023 年世界地球日的主题为 携手为保护地球投资 xff08 Invest in our planet xff09 xff0c 旨在呼吁每个人都能采取实际行动去投资地球的未来 相信无论您身处何处 xff0c 都已经感受到了全球极端天气的日
  • 如何快速替换PROFINET故障设备

    最近有些客户向我们咨询一个问题 xff1a 他们生产出售的 PROFINET 从站产品可能会在客户的应用现场被损坏 xff0c 需要更换全新的产品进行替换 客户询问我们是否有一种快速替换现场损坏设备的方法 除了调试客户 PROFINET 设
  • GPS固定数据输出语句($GPGGA)

    GPGGA GPS固定数据输出语句 GPGGA 这是一帧GPS定位的主要数据 xff0c 也是使用最广的数据 GPGGA 语句包括17个字段 xff1a 语句标识头 xff0c 世界时间 xff0c 纬度 xff0c 纬度半球 xff0c

随机推荐

  • 年度必看 | 2023全球工业网络市场份额预测报告

    重点摘要 每年 xff0c HMS Networks 都会对工业网络市场进行分析 xff0c 以预测工厂自动化中新安装节点的分布情况 今年的研究显示 xff0c 整个工业网络市场预计将在 2023 年增长 7 工业以太网仍然保持最高增长 x
  • 如何使用VSCode编译调试C语言程序

    一 前言 Visual Studio Code可通过安装插件来支持C 43 43 C Python PHP等语言 xff0c 使用的工程师越来越多 xff0c 本文介绍如何使用VS Code进行C语言的编译与调试 二 安装VS Code V
  • 修改一个工作空间中的工程文件目录结构

    如果有两个工程 xff0c Test1 Test2 xff0c 那么 默认目录结构的是 Test1 dsw Test1 dsp Test2 Test2 dsp 这个结构不太清晰 xff0c 用过vc7或更高的朋友知道 xff0c 他们的目录
  • C语言50题之百度笔试题

    判断你的电脑存储方式是大端还是小端 大端模式 xff0c 是指数据的高字节保存在内存的低地址中 xff0c 而数据的低字节保存在内存的高地址中 xff0c 这样的存储模式有点儿类似于把数据当作字符串顺序处理 xff1a 地址由小向大增加 x
  • 关于C语言中return的总结

    return break和continue 这三个关键字有一个共同点 xff0c 那就是读能让后面的语句不执行 xff0c 不同的地方就是挑的距离不一样 return很强大 xff0c 如果一个函数中有一个return xff0c 并且执行
  • Windows下Cmake的简单使用

    一 安装Cmake 官网 xff1a https cmake org 本文以Windows64为例 二 项目目录如下 xff1a 1 新建demo文件夹 2 在demo文件夹下新建bin文件夹 HelloWorld cpp CMakeLis
  • Cmake的动态链接库dll的生成并测试

    一 项目任务 1 完成一个CMake工程生成一个动态库 xff0c 该动态库包含内容 xff1a 1 包含一个StringUtil类 xff0c 该类具有Split和Trim2个静态方法 上述2个接口的定义如下 xff1a 删除字符串两侧的
  • cmd/dos批处理脚本出错-is not recognized as an internal or external command

    cmd xff08 dos xff09 批处理脚本执行出现错误 xff1a is not recognized as an internal or external command xff0c 运行中断 脚本文件无语法错误 xff0c 编辑
  • CTF竞赛介绍及刷题网址更新---2020.08

    CTF xff08 Capture The Flag xff09 中文一般译作夺旗赛 xff0c 在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式 CTF起源于1996年DEFCON全球黑客大会 xff0c 以代替之前黑
  • VS2008与Matlab混合编程设置

    VS2008 与MATLAB R2009b 混合编程环境配置 一 xff0c VS2008 中的函数调用matlab的写好的函数 1 Matlab 生成 DLL 1 1 编译器的安装 实验环境 xff1a XP 32 位机MATLAB R2
  • System.console().readPassword() java.lang.NullPointerException

    java核心技术 卷I 书籍中有关 java io Console 类的1个示例 System console readLine 与 System console readPassword 在 idea 中运行出现 java lang Nu
  • Linux man中文手册的安装与使用

    概要 xff1a 在 ubuntu 20 04 中下载 安装使用 man 中文手册 文章目录 linux shell命令学习法宝 man 手册man中文手册的下载 安装及环境变量的配置下载安装环境变量配置及 cman 命令使用 man 中文
  • X window selection --- xclip

    原文 英文 url xff1a https encyclopedia thefreedictionary com X 43 Window 43 selection 本文为笔者的翻译 xff0c 红色部分为笔者增加的批注 文章目录 Activ
  • linux安装xclip实现终端与剪贴板之间的通道

    概要 xff1a ubuntu 20 04 通过安装 xclip 来实现终端与剪贴板之间的数据通道 xff1a xclip 类似 dos 中的 clip命令 xff0c xclip 可将命令执行的结果保存到剪贴板 xff0c 还允许将文件的
  • java中GBK与UTF-8编码的转换

    文章目录 java源文件中中文字符的编码的问题UTF 8和GBK格式的文件相互转换java实现文件编码的转换 java不同编码的字节数组的转换Java判断文件编码格式对于UTF 8格式文件的判断 xff1a 利用cpdetector开源库确
  • GBK编码表

    全国信息技术标准化技术委员会 汉字内码扩展规范 GBK Chinese Internal Code Specification 1 0 版 xff08 按编码顺序排列 xff09 其编码范围 xff1a 8140 xff0d FEFE xf
  • dll文件下载网址

    https cn dll files com
  • windows中dos命令汇总及获取管理员权限

    文章目录 windows 获取管理员权限的2种方式runas 用法 windows dos 命令行语法项windows dos命令总述 windows dos命令详细介绍 win7及以前 微软官网 windows dos命令详细介绍 win
  • windows比cmd更强大的 WMIC命令使用详解

    文章目录 什么是wmic WMIC能做什么 WMIC命令使用帮助文档WMIC命令使用实例wmic的运行方式可以有两种法1 显示进程的详细信息2 停止 暂停和运行服务功能3 显示出BIOS信息4 停止进程的操作5 连接远程电脑6 BIOS 基
  • 编程意识——宏定义封装多个函数参数

    作者 釜薪君 公众号 嵌入式杂牌军 文章目录 前言一 这种意识的来源二 实现源码分析1 函数调用2 宏定义部分3 函数实现4 宏替换后的函数调用 总结 前言 今天带小伙伴们分析一段不错的代码 xff0c 学习一下关于宏封装的一种意识 xff