C语言中的宏MACRO的用途

++++++++++++++++++++++
1)硬码实义化
用宏来将一个硬码数值,进行实义化。、

#define DEBUG_CONSOLE_DEVICE_TYPE_NONE    0U     /*!< No debug console.             */
#define MCU_MEM_MAP_VERSION               0x0300U#define ADC_HC_ADCH_MASK                     (0x1FU)#define FSL_IOMUXC_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))

在编写代码的过程中,尽量不要出现硬码,如果需要使用硬码,也要使用实义宏。
这样便于将函数模板化。
在需要修改时,只修改实义宏即可,无需修改函数。

另一种硬码实义化的方式,是enum。
enum分为枚举常量和枚举变量。
在定义enum时,花括号里列出的,就是枚举常量。
而在代码中用内存分配的,就是枚举变量。

枚举常量,就是实义化的硬码。
它和实义宏是有区别的,
实义宏是一个纯数值,不具类型。
枚举常量是具类型的。
对一个枚举变量赋值时,会检查类型是否匹配,所以需要强转。

+++++++++++++++++++++++++++++++++++++
2)参数块实义化
在调用函数时,需要传参,参数列表的一部分,我们称为参数块。
如果参数块,是硬码形式的,即这个参数块中,全是数值,
那么可以将参数块实义化,定义为宏,
这个宏,就是宏拟参数块。

#define IOMUXC_GPIO1_IO02_GPIO1_IO02                         0x020E0064U, 0x5U, 0x00000000U, 0x0U, 0x020E02F0U

注意,参数块中间的多个硬码,要用逗号分隔,但是参数块的前面和后面,都不要有逗号。
这样,使得参数块,看起来就像一个参数一样。

在编写代码的过程中,尽量不要出现硬码,如果需要使用硬码,也要使用实义宏。

++++++++++++++++++++++++++++++++
3)宏拟变量
用宏来将MMIO或者MMREG进行实义化。
对MMREG的读写,就像对一个变量读写一样。

#define CCM_CCGR5 *((volatile unsigned long*)0x020C4080)

绝对地址,是一个指针,将其强转,并加以volatile修饰。
对指针取数,即为变量。
这就是宏拟变量。

+++++++++++++++++++++++++
4)宏拟句柄
用宏来将MMIORegion或者MMRegRegion进行实义化。

typedef struct
{volatile unsigned int CCR;volatile unsigned int CCDR;volatile unsigned int CSR;volatile unsigned int CCSR;
}CCM_Type;#define CCM_BASE                    (0X020C4000)   #define CCM                 ((CCM_Type *) CCM_BASE)

首先通过定义结构体对象,将MMRegRegion定义到一个Block中。每个成员都有volatile修饰符,表示这是一个MMREG。
命名通常用后缀_Type标识。
然后用宏来定义一个BaseAddress。
基址宏,通常用后缀_BASE标识。
然后将基址宏强转,成为一个结构体对象的指针类型,并实义化为一个宏。
我们称一个结构体对象的指针,为句柄。
这个宏就是宏拟句柄。

+++++++++++++++++++++++++++++++++++++++
5)宏拟函数

#define MAKE_VERSION(major, minor, bugfix) (((major) << 16) | ((minor) << 8) | (bugfix))#define NXP_VAL2FLD(field, value)    (((value) << (field ## _SHIFT)) & (field ## _MASK))

注意,宏拟函数的宏体,必须用一个总括号包含起来。最后不能有分号。
宏拟函数的作用,是将一个操作语句块,或者操作表达式,实义化,模板化。
函数在编译时,会被编译成可调用代码段。这就会涉及到调用开销,
但是宏拟函数,编译时,会就地展开,成为内联代码段。

另一种内联代码段的方法,是static inline 函数。

static inline void IOMUXC_SetPinMux(uint32_t muxRegister,uint32_t muxMode,uint32_t inputRegister,uint32_t inputDaisy,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) = IOMUXC_SELECT_INPUT_DAISY(inputDaisy);}
}static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,uint32_t muxMode,uint32_t inputRegister,uint32_t inputDaisy,uint32_t configRegister,uint32_t configValue)
{if (configRegister){*((volatile uint32_t *)configRegister) = configValue;}
}

内联函数的写法,能够描述更复杂的代码块。
宏拟函数,通常用来描述较简洁的代码,例如表达式。

++++++++++++++++++++++++++++++++++
6)头文件保护,宏标志,宏开关

#ifndef __MAIN_H
#define __MAIN_H...
#endif

检查是否存在宏标志,
有则跳过,没有则打上宏标志。

++++++++++++++++++++++++++++++++

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

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

相关文章

基于小程序+ssm实现的悬赏信息发布系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

2024年妈妈杯数学建模MathorCup数学建模思路B题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

数字人解决方案——Champ单个视频单张图像生成可控且一致的人体视频生成

概述 Champ是阿里巴巴集团、南京大学和复旦大学的研究团队共同提出了一种创新的人体动画生成技术&#xff0c;Champ能够在仅有一段原始视频和一张静态图片的情况下&#xff0c;激活图片中的人物&#xff0c;使其按照视频中的动作进行动态表现&#xff0c;极大地促进了虚拟主播…

【Emgu CV教程】10.12、Moments()函数计算轮廓矩和质心

文章目录 一、概念介绍1.矩2.矩能干什么3.矩函数 二、演示1.原始素材2.代码3.运行结果 一、概念介绍 1.矩 矩&#xff0c;英文叫moment&#xff0c;是一个数学中的概念&#xff0c;以下的解释来自百度百科&#xff1a; 是不是看不懂&#xff0c;没关系&#xff0c;数学基础不…

002 spring

文章目录 UserController.javaUserMapperImpl.javaSchool.javaStudent.javaUser1ServiceImpl.javaUserServiceImpl.javaAnnotationContext.xmlApplicationContext.xmlUserControllerTest.javaStudentTest.javapom.xml UserController.java package com.aistart.controller;impo…

leetcode605-Can Place Flowers

题目&#xff1a; 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xff0c;由若干 0 和 1 组成&a…

mysqldump: Got error: 1049: Unknown database ‘root‘ when selecting the datab

1.问题描述 MySQL版本号&#xff1a;MySQL Server 8.3MySQL持久化到处数据库结构及数据 mysqldump: Got error: 1049: Unknown database root when selecting the datab2.问题解决 cmd 切换本地路径 cd /d D:\Program Files\MySQL\MySQL Server 8.3\bin执行数据库备份命令 …

Linux命令-dpkg-divert命令(Debian Linux中创建并管理一个转向列表)

说明 dpkg-divert命令 是Debian Linux中创建并管理一个转向&#xff08;diversion&#xff09;列表&#xff0c;其使得安装文件的默认位置失效的工具。 语法 dpkg-divert(选项)(参数)选项 --add&#xff1a;添加一个转移文件&#xff1b; --remove&#xff1a;删除一个转移…

Java智慧校园系统源码 微信小程序+电子班牌

Java智慧校园系统源码 微信小程序电子班牌 通过设备管理对百纳智慧校园的智慧班牌以及百纳智慧屏&#xff08;校牌&#xff09;进行统一集中式管理&#xff0c;支持浏览所有设备的基本信息以及在离线状态&#xff0c;支持添加设备、设备一键开关机、一键重启、设置节假日开关机…

Java单链表和LinkedList的实现

一、单链表的实现 无头单向非循环链表 定义异常用于判断所给位置是否合法 public class IndexNotLegal extends RuntimeException{public IndexNotLegal(){}public IndexNotLegal(String smg){super(smg);} } class ListNode中包含当前节点的值和下一个节点指向 实现链表的…

nginx支持的多种负载均衡策略

目录 1.轮询&#xff08;默认&#xff09; 2. ip_hash 3. 加权轮询&#xff08;weight&#xff09; 4. fair&#xff08;第三方&#xff09; 5. 最少连接&#xff08;least_conn&#xff09; 1.轮询&#xff08;默认&#xff09; 将请求依次分配给每个服务器&#xff0c;确…

自定义OPPO-r9s的kernel内核,并开启安卓支持docker

0. 版本说明 本文提供了OPPO手机r9s的内核编译方法&#xff0c;并开机支持docker。用的是开源lineage14.1的rom。 我这边基于开源lineage14.1&#xff0c;打了一个docker内核编译镜像(17380582683/r9s)&#xff0c;大家可以在容器里&#xff0c;手动打出完整的rom包zip文件。…

SpringCloud Alibaba Sentinel 实现熔断功能

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十六篇&#xff0c;即使用 Sentinel 实现熔断功能。 二、 Ribbon 系列 首先我们新建两个服务的提供者…

vue3 keep-alive include失效问题

在使用vue3 keep-alive时&#xff0c;发现并没有起作用, 代码如下&#xff1a; <template><div class"app-main"><router-view v-slot"{ Component }"><keep-alive :include"cachedViews && cachedViews.map((x:any) &…

[StartingPoint][Tier1]Pennyworth

Important Jenkins是一个用于自动化构建、测试和部署软件项目的开源持续集成和持续部署&#xff08;CI/CD&#xff09;工具。它允许开发团队自动执行和监控在软件开发过程中的重复性任务&#xff0c;例如构建代码、运行测试、部署应用程序等。Jenkins提供了一个易于使用的Web界…

python使用selenium模拟人工操作

概述 有时候业务中的一些固定流程的测试环境需要重复执行很多次&#xff1b;这种场景其实可以用python的selenium库模拟用户手动点击输入&#xff0c;实现自动化测试&#xff1b; 我这边的python版本是 Python 3.6.7rc2 demo # codingutf-8 import time import logging imp…

Debian 安装 python 3.9.6

安装相关依赖 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev 下载Python 源码 wget https://mirrors.aliyun.com/python-release/source/Py…

基于R语言BIOMOD2模型的物种分布模拟

随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自然保护地&#xff0c;加快推进国家公园体制试点&#xff0c;构建以国家公园为主体的自然保护地体系。针对我国…

Spring 如何优雅的灵活的Http重试

1、背景说明 在互联网时代&#xff0c; 不同系统之间大多数是通过http调用&#xff0c;调用过程中会超时、异常等过种问题。为了保证业务稳定&#xff0c;http 重试是常用方案。下面列举几种方案。 2、Http重试方案介绍 2.1 传统方案 1、使用传统的递归调用&#xff0c;实现方…

SQL 注入之 Windows/Docker 环境 SQLi-labs 靶场搭建!

在安全测试领域&#xff0c;SQL注入是一种常见的攻击方式&#xff0c;通过应用程序的输入执行恶意SQL查询&#xff0c;从而绕过认证和授权&#xff0c;可以窃取、篡改或破坏数据库中的数据。作为安全测试学习者&#xff0c;如果你要练习SQL注入&#xff0c;在未授权情况下直接去…