寄存器某个位赋值、宏定义、头文件的条件编译及全局声明extern的使用

news2024/12/26 0:15:24

一、给寄存器的某个位进行赋值

C语言基础知识(位操作)

运算符含义运算符含义
&按位与~按位取反
|按位或<<左移
^按位异或>>右移

我们定义一个32位的寄存器变量:unit32_t temp=0;

从左到右依次是第1位,第2位......第32位

我们现在给第5位赋值,也就是让第5位为1,从右往左依次是1,2,3......32位。

我们主要有以下四种方法:

第一种方法是按位与:也就是让第5位为0,其余为1,即temp = temp&0xFFFFFF7F

第二种方法是按位或:也就是让第五位为1,其余为0,即temp = temp|0x00000010

第三种方法是左移操作与:让第五位为1,也就是让1左移5位,再取反temp&=~(1<<5)

第四种方法是左移操作或:让第五位为1,也就是让1左移5位,temp|=1<<5。

按位异或用于控制位5翻转:temp^=1<<5;0和任何数异或都是任何数

二、宏定义

宏定义的优点:

1. 增强代码的可读性和可维护性:使用宏定义可以将代码中某些常用的数值或字符串定义为常量,使代码更具可读性和可维护性。

2. 提高代码的复用性:使用宏定义可以避免代码重复编写,提高代码的复用性。

3. 方便代码的修改:使用宏定义可以方便地修改代码中的某些常量值,避免了修改多处代码的麻烦。

4. 优化代码的执行效率:使用宏定义可以将一些常量或表达式在编译期间计算,避免了运行时的计算,从而提高了代码的执行效率。

5. 增强代码的可移植性:通过定义宏,可以将代码中某些与平台相关的常量和特殊处理方法独立出来,增强了代码的可移植性。

无参宏定义:

# define 标识符 字符串

标识符:宏定义的名字
字符串:常数、表达式、格式串等。

eg:

# define PI  3.14159
# define HSE_VALUE  8000000000

用前边来替换后边

有参宏定义:

# define LED1(x) do {x?\

    HAL_GPIO_WritePin(LED1_GPIO_P0RT,LED1_GPIO_PIN,GPIO_PIN_SET):\
    HAL_GPIO_WritePin(LED1_GPIO_P0RT,LED1_GPIO_PIN,GPIO_PIN_RESET):\
    }while(0)

其中用到C语言中的条件运算符,x?A:B,表示如果X为真,则结果为A,否则结果为B。

建议使用do{...}while(0)来构造宏定义

这样不会受到大括号、分号、运算符优先级等的影响,总是按照你的期望进行

我们看一下谷歌大佬 Robert Love ,对do{} while(0)的说法

do {…} while(0) is the only construct in C that lets you define macros that 
always work the same way, so that a semicolon after your macro always has the 
same effect, regardless of how the macro is used (with particularly emphasis
 on the issue of nesting the macro in an if without curly-brackets).

翻译:

使用do {...} while(0)构造后的宏定义不会受到大括号、分号等影响,总能按照我们期望的方式调用运行。

例如:

我们定义一个宏定义,宏名是fool(x),后边 bar(x),baz(x)是我们字符串的内容了,我们看到有两个函数,第一个函数有分号,第二个没有。这样不会报错,因为宏定义不会对语法内容进行检测的。

#define fool(x)  bar(x);  baz(x)

然后你这样调用

fool(wolf);

这样的话,宏将会被扩展为

bar(wolf);baz(wolf);

接下来我们再看一个例子,就可以看到do{} while(0)写法的规范

我们期望的正确结果是这样的

if (!feral)

        fool(wolf)

但是扩展以后就是这样的,不是我们所期待的样子

if (!feral)

        bar(wolf);

baz(wolf);

显而易见,这是错误的,这是大家最容易犯错的

三、条件编译

条件编译是根据预定义的条件决定编译哪些代码的一种方式。常见的条件编译有以下几种:

1. #ifdef和#ifndef:判断是否定义了某个宏定义,语法格式为:#ifdef宏定义 或者 #ifndef宏定义。
2. #if、#elif和#else:这种方式可以根据表达式结果选择编译哪些代码,语法格式为:#if 表达式1 、#elif 表达式2 或 #else。
3. #define和#undef:这种方式可以定义或取消宏定义,语法格式为:#define宏定义 或 #undef宏定义。
4. #include:这种方式可以在编译期间将指定文件的内容包含到当前文件中,语法格式为:#include文件名。

实际上,条件编译是将一些不需要或不能运行的代码在预处理中被过滤掉,从而让代码编译时只编译需要的代码。这样可以大大提高程序的效率和安全性。

举个例子”头文件的条件编译“

#ifndef _LED_H
#define _LED_H
#include "./SYSTEM/sys/sys.h"
code

#endif

四、extern 声明

        extern  声明用于声明一个变量或函数是在别处定义的,而不是在当前文件中定义的。放在函数/变量前,表示此函数/变量在其他文件定义,以便本文件引用

extern uint16_t g_usart_rx_sta;
extern void delay_us(uint32_t nus)

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

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

相关文章

网络层:地址解析协议ARP

网络层&#xff1a;地址解析协议ARP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;ARP协议 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 B知道C的IP地址但如果不知道其对应的MAC地址&#xff0c;就无法将数据包发送给C&#xff0c;如何解决这个…

新款Model 3长什么样?特斯拉已经开始降价?

作者 | Amy 编辑 | 德新 马斯克时隔三年再次访华&#xff0c;期间会见了多部委领导及重量级人物&#xff0c;在北京和上海短暂停留了44小时后便离开了中国。 此前曾有多家媒体猜测马斯克可能会在中国发布/展示改款Model 3。但据彭博社报道&#xff0c;马斯克只是在上海工厂看了…

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告2

源自网络收集&#xff0c;仅供参考 实验三收集到两份完整报告&#xff0c;这是其二&#xff0c;另一份见本专栏上一篇文章。 1 实验要求 整体目的&#xff1a;理解、窗口之间的消息传送、调用栈&#xff1b;掌握光标、图标、菜单的制作和使用方 式 &#xff1b; 掌 握 菜 单…

【Vue】三:Vue核心处理---vue的其它指令和自定义指令

文章目录 1.vue的其它指令1.1v-text 和 v-html1.2 v-cloak1.3 v-once1.4 v-pre 2. 自定义指令2.1 函数式2.2 对象式2.3.定义全局的指令 1.vue的其它指令 1.1v-text 和 v-html v-text&#xff1a;当做文件解析。 v-html&#xff1a;当做 HTML 代码解析。 1.2 v-cloak v-cloa…

在自定义数据集上训练 YOLOv8——完整教程

Ultralytics 最近发布了 YOLOv8 系列对象检测模型。这些模型在 COCO 数据集上的速度和准确性都优于之前版本的 YOLO 模型。但是自定义数据集的性能如何呢?为了回答这个问题,我们将在自定义数据集上训练 YOLOv8 模型。具体来说,我们将在大规模坑洞检测数据集上对其进行训练。…

电子模块|压力传感器模块HX711---C51STM32驱动

电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动 实物照片模块简介模块特点 软件驱动C51软件代码STM32软件代码 实物照片 模块简介 HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比&#xff0c;该芯片集成了包括稳压电源、…

Rust 标准库字符串类型String及其46种常用方法

Rust字符串 Rust主要有两种类型的字符串&#xff1a;&str和String &str 由&[u8]表示&#xff0c;UTF-8编码的字符串的引用&#xff0c;字符串字面值&#xff0c;也称作字符串切片。&#xff06;str用于查看字符串中的数据。它的大小是固定的&#xff0c;即它不能…

网络层:IP地址

网络层&#xff1a;IP地址 笔记来源&#xff1a; 湖科大教书匠&#xff1a;IP地址 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 IP地址是因特网(Internet)上的主机和路由器所使用的地址&#xff0c;用于标识两部分信息&#xff1a; 网络编号&am…

Allegro16.6详细教程(一)

第一章User Interface 本章的主要內容介紹allegro操作介面,透過本章學習可以對Allegro的工作介面有了大致的瞭解,同時也能體驗出Allegro PCB Layout時的強大功能。 A.程式的啟動 除了以上Allegro主程式,我們還會常用到以下幾個常用工具: • Padstack Designer (Padstack…

《代码日记》

代码日记 Project :Space1、new_method.py new2.pynew3.pynew4.pynew5.py new5.1.pynew6.py Project :Space 都是在D001289数据集上的测试 1、new_method.py 先划分训练集和测试集 通过稀疏自编码器进行降维至20维度 自编器参数&#xff1a; # 训练自编码器模型autoencoder …

JavaEE进阶 Spring AOP(6/1)

目录 1.什么是AOP 2.Spring AOP可以干什么 3.AOP的组成成分 4.SpringAOP实现步骤 5.SpringAOP的原理 1.什么是AOP AOP是面向切面编程&#xff0c;是一种思想 Spring AOP是一种具体的技术 2.Spring AOP可以干什么 1.用户登录状态的判断 2.统一的日志记录&#xff08;比如记录…

基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度牙齿健康检测识别系统可用于日常生活中检测牙齿健康状况&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的牙齿目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数…

c++代码实现一个线程池(清晰明了,一看就懂)

线程池的应用 在我认知中&#xff0c;任何网络服务器都是一个死循环。这个死循环长下面这个样子。 基本上服务器框架都是基于这个架构而不断开发拓展的。 这个死循环总共分为四个步骤&#xff0c;可以涵盖所有客户端的需求&#xff0c;然而目前绝大多数企业不会用这样的架构。…

带有 Utopia Messenger 的免费 ChatGPT 助手

全世界都喜欢 ChatGPT&#xff01;而且这个工具从未如此易于访问。没有限制、没有VPN、没有代理和佣金。现在您可以使用 Utopia Messenger 的传奇聊天的全部功能。 ChatGPT是每个线上用户的必备工具。它为我们提供任何所需的数据&#xff0c;生成内容&#xff0c;并解决多项任…

[数据集][目标检测]目标检测数据集黄瓜数据集VOC格式1309张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1308 标注数量(xml文件个数)&#xff1a;1308 标注类别数&#xff1a;1 标注类别名称:["cucumber"] 每…

图论与算法(1)图论概念

1. 图论与算法 在计算机科学中&#xff0c;图论与算法是两个重要且紧密相关的领域。图论研究图的性质和特征&#xff0c;而算法设计和分析解决问题的方法和步骤。图论提供了一种形式化的方法来描述和分析各种关系和连接&#xff0c;而算法则为解决图相关的问题提供了有效的解决…

【刷题之路】单调栈秒解每日温度

一、题目描述 原题链接&#xff1a;https://leetcode.cn/problems/daily-temperatures/ 题目描述&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高…

【JVM】什么是双亲委派机制?

一、为什么会有这种机制&#xff1f; 类加载器将.class类加载到内存中时&#xff0c;为了避免重复加载&#xff08;确保Class对象的唯一性&#xff09;以及JVM的安全性&#xff0c;需要使用某一种方式来实现只加载一次&#xff0c;加载过就不能被修改或再次加载。 二、什么是双…

docker安装 sqlserver2017 或者 2008

一、必要条件 服务器的运行内存必须大于2GB 二、拉取2017镜像 docker pull mcr.microsoft.com/mssql/server:2017-latest三、启动镜像 docker run --name sqlserver2017 --restart always -v /home/ceshi1:/var/opt/mssql -d -e ACCEPT_EULAY -e SA_PASSWORDqwer!#123 -…

C语言参悟-运算符表达式和语句

C语言参悟-运算符表达式和语句 一、概述二、运算符0. 运算符分类1. 数学运算符2. 逻辑运算符3. 二进制运算符4. 便捷运算符 三、表达式四、语句 一、概述 在我刚开始学C语言的时候&#xff0c;语句和运算符号这些对我来说还是很陌生的。 现在来看我对于这个的理解其实就是一种…