嵌入式C基础知识(20)

news/2024/4/25 16:14:18/文章来源:https://blog.csdn.net/xiaoyi9812/article/details/129275152

typedef用法

typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称。 这方面与#define类似,但是两者有三处不同:

与#define不同, typedef创建的符号只受限于类型,不能用于值;

tyedef由编译器解释,不是预处理器;

在其受限范围内, typedef比#define更灵活;

假设要用BYTE表示1字节的数组,只需要像定义个char类型变量一样定义BYTE,然后再定义前面加上关键字typedef即可:

typedef unsigned char BYTE;

随后便可使用 BYTE 来定义变量:

BYTE x, y[10];

为现有类型创建一个名称,看起来是多此一举,但是它有时的确很有用。在前面的示例中,用BYTE代替unsigned char表明你打算用BYTE类型的变量表示数字而不是字符。使用typedef还能提高程序的可移植性。 用typedef来命名一个结构体类型的时候,可以省略该结构的标签( struct):

typedef struct {

char name[50];

unsigned int age;

float score;

} student_info;

student_info student={“Bob”, 15, 90.5};

使用typedef的第二个原因是: tyedef常用于给复杂的类型命名,例如: 把pFunction声明为一个函数,该函数返回一个指针,该指针指向一个void型。

typedef void (*pFunction)(void);

读信号

当处理器需要从外设芯片读取信号时,除了需要产生片选信号外,还需要告诉外设芯片这是一个读操作,而不是一个写操作,这是通过读信号来实现的。

预处理指令

#define、 #include、 #ifdef、 #else、 #endif、 #ifndef、 #if、 #elif

#line、 #error、 #pragma

根据程序中的预处理指令,预处理器把符号缩写替换成其表示的内容( #define)。预处理器可以包含程序所需的其它文件( #include),可以选择让编译器查看哪些代码(条件编译)。预处理器并不知道C语法,基本上它的工作是把一些文本转换成另外一些文本。

写信号

前面讲了读信号,我想对于写信号也就不难理解了,这个信号用于告诉外设芯片,这是一个向外设芯片写数据的操作。

#define 与#undef 用法

每行#define(逻辑行)都由3部分组成。

第1部分是#define指令本身;第2部分是选定是缩写,也称为宏,有些宏代表值;第3部分称为替换列表或替换体。

一旦预处理器在程序中找到宏的示例后,就会用替换体代替该宏。从宏变成最终替换文本的过程称为宏展开。需要注意是:预处理器会严格按照替换体直接替换,不做计算不做优先级处理,例如下面求取平方值的宏定义:

#define sqr(x) x*x

printf(“2 的平反: %d”, sqr(2));

输出的结果为4

printf(“2+2 的平方: %d”, sqr(2+2));

编译器就会这样展开:

printf(“2+2 的平方: %d”, 2+2 * 2+2);

输出的结果为8

但是实际按照逻辑2+2的平方是16,得到8的结果是因为前面所说的预处理器不会做计算只会严格按照替换体的文本进行直接替换,因而为了避免类似的问题出现,我们应该这样改写平凡宏定义:

#define sqr(x) ((x)*(x))

printf(“2+2 的平反: %d”, ((2+2)*(2+2)));

前面提到了外设(芯片),现在是对外设进行分类的时候了。大体上外设分为两类,一类是存储器外设,而另一类是非存储器外设,后者常被称之为I/O设备,这里的I/O是Input/Output的简写,即输入、输出。可见,I/O外设是一个非常宽泛的概念。对于存储器外设,其特点是,它所占用的空间是连续的一片。比如,SDRAM内存就是属于存储器外设,如果其容量是8M字节,那么其占用的地址空间也会是8M的。

与存储器外设所不同的是,I/O外设所点用的地址一般都很少。比如一个I/O外设可能存在多个控制寄存器,这些控制寄存器从处理器来看就是多个I/O端口(地址),向这个地址写数据就是向外设所对应的寄存器写数据,反之,也可以是读。比如,一个串口芯片可能存在多个寄存器,一个用来查询芯片的状态,一个用来设置芯片的功能,另一个用来读取芯片从串口线所收到的数据,最后,还有一个用来向芯片写数据以向串口线上发送数据。对于这一串口芯片的寄存器,从处理器的角度来看,都是独立的I/O端口。

I/O端口存在读、写性问题,有的端口是只读的,有的端口是只写的,还有的端口是即可读也可写,其读写性是由外设芯片的寄存器所决定的,在芯片的数据手册中能找到。需要指出的是,有些存储器外设也存在I/O端口,以对其进行一定的控制。从I/O端口这一名字来看,对于处理器来说,就是对从外面读入数据或是向外面输出数据的一个接口总称。

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

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

相关文章

Kubernetes12:k8s集群安全机制 ***与证书生成***

Kubernetes12:k8s集群安全机制 1、概述 1)访问一个k8s集群的时候,需要经过以下三个步骤才能完成具体操作 第一步:认证操作第二部:鉴权操作(授权)第三部:准入控制操作 2&#xff…

Java枚举详解

一.枚举 1.为什么有枚举? 如果我们的程序需要表示固定的几个值: 比如季节:spring (春),summer(夏),autumn(秋),winter(冬) 用常量表示: public static final int SEASON_SPRING 1;public st…

记一次MySQL数据迁移到SQLServer全过程

为什么要做迁移? 由于系统版本、数据库的升级,导致测试流程阻塞,为了保证数据及系统版本的一致性,我又迫切需要想用这套环境做性能测试,所以和领导、开发请示,得到批准后,便有了这次学习的机会…

idea 安装JUnit单元测试框架

JUnit是一套专门用于java的单元测试框架,主要是测试方法 junit4官方网站: JUnit – About junit5官方网站:JUnit 5 框架依赖:junit-4.12.jar;hamcrest-core-1.3.jar 安装步骤: (1&#xff…

hiveSQL开窗函数详解

hive开窗函数 文章目录hive开窗函数1. 开窗函数概述1.1 窗口函数分类1.2 窗口函数和普通聚合函数的区别2. 窗口函数的基本用法2.1 基本用法2.2 设置窗口的方法2.2.1 window_name2.2.2 partition by2.2.3 order by 子句2.2.4 rows指定窗口大小窗口框架2.3 开窗函数中加 order by…

一文吃透 Spring 中的 AOP 编程

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【C++】二叉搜索树的模拟实现

一、概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

开源ZYNQ AD9361软件无线电平台

(1) XC7Z020-CLG400 (2) AD9363 (3) 单发单收,工作频率400MHz-2.7GHz (4) 发射带PA,最大输出功率约20dbm (5) 接收带LNA,低…

Linux学习(9.1)文件系统的简单操作

以下内容转载自鸟哥的Linux私房菜 原文:鸟哥的 Linux 私房菜 -- Linux 磁盘与文件系统管理 (vbird.org) 磁盘与目录的容量 df:列出文件系统的整体磁盘使用量;du:评估文件系统的磁盘使用量(常用在推估目录所占容量) df du 实体…

微信小程序 《新闻列表》 案例

目录:一,步骤。要求1:主页头部的轮播图要求2:中间内容上的信息案列排版。要求3:上拉加载内容。要求4:在信息加载完成后,给用户提示二,过程中要注意的几点。1.在微信小程序中&#xf…

HNU工训中心:电子开关与信号隔离

工训中心的牛马实验 1.实验目的: 1) 认识三极管和MOS管构成三端电子开关电路; 认识信号隔离的继电器和光电隔离方式。 2) 认识施密特触发器,掌握一种波形变换方法。 3) 实现一种脉冲波形发生器。 2.实验资源 HBE硬件基础电路实验箱、示波…

第八节 构造器和this关键字、封装

构造器的作用 定义在类中的,可以用于初始化一个类的对象,并返回对象的地址。 构造器的注意事项 1.任何类定义出来,默认就自带了无参数构造器,写不写都有。 2.一旦定义了有参数构造器,那么无参数构造器就没有了&#xf…

Adversarially-Aware Robust Object Detector

目标检测作为计算机视觉的基本任务,随着深度神经网络的出现而取得了显著的进展。然而,很少有研究在各种现实场景中探索目标检测器抵抗对抗攻击的对抗鲁棒性。探测器已经受到不可察觉的扰动的极大挑战,在干净图像上的性能急剧下降,…

记录pytorch安装 windows10 64位--(可选)安装paddleseg

安装完paddlepaddle之后,就可以安装paddleseg了。一、安装Git可以参考这个网址:https://blog.csdn.net/u010348546/article/details/124280236windows下安装git和gitbash安装教程二、安装paddleseghttps://github.com/PaddlePaddle/PaddleSeg记得翻墙啊这…

Ubuntu 交叉编译工具链安装

Ubuntu 交叉编译工具链安装 1 交叉编译器安装 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译,编译就需要编译器,我们在第三章“Linux C 编程入门”里面已经讲解了如何在 Liux 进行 C 语言开发,里面使用 GCC 编译器进行代…

试题 算法训练 JOE的矩阵

问题描述 最近JOE又在线性代数的模拟考中拿满分了,这直接导致了JOE对于计算矩阵的热情急剧下降,所以JOE希望能有这样一个程序能帮助他计算矩阵的秩。 输入格式 第一行,两个数n,m,表示矩阵是n*m的。   下面共n行,每行…

Airbnb(三) Managing Diversity in Airbnb Search 搜索多样性

abstract 搜索系统中一个长期的问题是结果多样性。从产品角度讲,给用户多种多样的选择,有助于提升用户体验及业务指标。 多样性需求和模型的目标是相矛盾的,因为传统ctr模型是 point wise,只看单个相关性不管相邻之间item差异。 …

设计模式-笔记

文章目录七大原则单例模式桥模式 bridge观察者模式 observer责任链模式 Chain of Responsibility命令模式 Command迭代器模式 Iterator中介者模式 Mediator享元模式 Flyweight Pattern组合模式 composite装饰模式 Decorator外观模式 Facade简单工厂模式工厂方法模式工厂抽象模式…

数学小课堂:无穷小(平均速度和瞬间速度的关系)

文章目录 引言I 速度1.1 平均速度1.2 瞬间速度(某一时刻特定的速度)1.3 解释飞箭是静止的悖论II 导数2.1 概念2.2 导数的现实影响2.3 微积分的意义III 无穷小3.1 贝克莱挑战牛顿(无穷小悖论)3.2 无穷小的定义引言 柯西和魏尔斯特拉斯给出的无穷小的定义: 它不是零;它的绝对…

【GUI】Robo 3T(Studio 3T Free) for Mongodb安装与使用教程

下载 robo 3T现已更名为studio 3T free,官网即可下载 studio 3T free下载地址 安装 mac电脑下载的是dmg安装包,直接正常安装即可,windows电脑也是一样的,不需要配置环境,安装即可使用。(前提是你已经安装…