历史上的今天
返回首页

历史上的今天

今天是:2024年11月18日(星期一)

正在发生

2019年11月18日 | STM32 数据类型定义

2019-11-18 来源:eefocus

在 Keil MDK 开发环境中,经常会遇到类似于unsigned int 8、uint8_t 、u8等数据变量定义,对于初学者来讲确实是有点痛苦,后来查询发现以上三种方式均表示——无符号的8位整形数据。


由于C语言类型的长度完全由编译器决定,char 通常被定义成 8 位宽;int 通常被定义成 16 位或 32 位宽(或更高),它取决于平台(编译器将在这两者间选择最合适的字宽);short 通常被定义成 16 位宽;long 通常被定义成 32 或 64位宽。

所以 C99 中引进了一个标准C库头文件 stdint.h ,方便精确确定整数类型的宽度


定义标准的扩展整数类型_stdint.h文件(部分)

/* Signed. */  

/* There is some amount of overlap with as known by inet code */  

#ifndef __int8_t_defined  

# define __int8_t_defined  

typedef signed char     int8_t;  //标准表达方式 signed char 被等同于 int8_t;

typedef short int       int16_t;  

typedef int         int32_t;  

# if __WORDSIZE == 64  

typedef long int        int64_t;  

# else  

__extension__  

typedef long long int       int64_t;  

# endif  

#endif  

/***************************************/ 

/* Unsigned. */  

typedef unsigned char       uint8_t;  

typedef unsigned short int uint16_t;  

#ifndef __uint32_t_defined  

typedef unsigned int        uint32_t;  

# define __uint32_t_defined  

#endif  

#if __WORDSIZE == 64  

typedef unsigned long int   uint64_t;  

#else  

__extension__  

typedef unsigned long long int uint64_t;  

#endif  

 /***************************************/ 

/* Small types. */   

/* Signed. */  

typedef signed char     int_least8_t;  

typedef short int       int_least16_t;  

typedef int         int_least32_t;  

#if __WORDSIZE == 64  

typedef long int        int_least64_t;  

#else  

__extension__  

typedef long long int       int_least64_t;  

#endif  

/***************************************/ 

/* Unsigned. */  

typedef unsigned char       uint_least8_t;  

typedef unsigned short int uint_least16_t;  

typedef unsigned int        uint_least32_t;  

#if __WORDSIZE == 64  

typedef unsigned long int   uint_least64_t;  

#else  

__extension__  

typedef unsigned long long int uint_least64_t;  

#endif  


/***************************************/   

/* Fast types. */  

/* Signed. */  

typedef signed char     int_fast8_t;  

#if __WORDSIZE == 64  

typedef long int        int_fast16_t;  

typedef long int        int_fast32_t;  

typedef long int        int_fast64_t;  

#else  

typedef int         int_fast16_t;  

typedef int         int_fast32_t;  

__extension__  

typedef long long int       int_fast64_t;  

#endif  

/***************************************/  

/* Unsigned. */  

typedef unsigned char       uint_fast8_t;  

#if __WORDSIZE == 64  

typedef unsigned long int   uint_fast16_t;  

typedef unsigned long int   uint_fast32_t;  

typedef unsigned long int   uint_fast64_t;  

#else  

typedef unsigned int        uint_fast16_t;  

typedef unsigned int        uint_fast32_t;  

__extension__  

typedef unsigned long long int uint_fast64_t;  

#endif  


/***************************************/  

/* Types for `void *' pointers. */  

#if __WORDSIZE == 64  

# ifndef __intptr_t_defined  

typedef long int        intptr_t;  

# define __intptr_t_defined  

# endif  

typedef unsigned long int   uintptr_t;  

#else  

# ifndef __intptr_t_defined  

typedef int         intptr_t;  

# define __intptr_t_defined  

# endif  

typedef unsigned int        uintptr_t;  

#endif  


/***************************************/   

/* Largest integral types. */  

#if __WORDSIZE == 64  

typedef long int        intmax_t;  

typedef unsigned long int   uintmax_t;  

#else  

__extension__  

typedef long long int       intmax_t;  

__extension__  

typedef unsigned long long int uintmax_t;  

#endif  


*_t结尾的类型,可以理解为type/typedef的缩写,就是一个结构标注,表示是通过typedef定义的,而不是其它数据类型。(程序的可扩展性)


无符号类型 可表示

unsigned char u8

unsigned short u16

unsigned int u32


这样定义的好处在于使用时不会感觉太混乱,从而能有效的维护代码。


类 型 说 明 typedef

准确长度类型 intN_t(N为类型宽度)

最小长度类型 int_leastN_t

快速长度类型 int_fastN_t

指针长度类型 intptr_t

最大长度类型 intmax_t


类型说明 

int_least16_t : 指获得一个当前平台所支持的至少有 16 位宽的最短整数类型。

int_fast32_t : 指获得当前平台下需要处理速度最快的至少为 32 位的整数类型。

intmax_t : 指获得当前平台所支持的最大宽度的整数类型。


intptr_t (无符号uintptr_t): 为安全跨平台编程的保证,对于写跨 64 位平台的程序非常重要,是指针和整数之间的转换经常用到(多用于需要精确控制数据在内存中的精确布局时)。换句话说,当需要把指针作为一个整数来运算时,转换成intptr_t才是安全的,然后在运算完毕后再安全的转回指针类型。


无符号整形对应的*_t类型 字 宽

uint8_t 1字节

uint16_t 2字节

uint32_t 4字节

uint64_t 16字节

int64_t uint64_t 大数输出 格式

int64_t %lld

uint64_t %llu

uint64_t %llx(十六进制)

uint64_t %llo (八进制)

volatile


作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。


俗称禁止程序优化,一般在进行多线程程序设计时加,就是在有中断的程序中常见,并且是中断程序所用变量一般用这个加以修饰。


简单的说,就是不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存或者寄存器中读取或者修改。


volatile一般用在以下三个方面:


中断标志位


多线程共享的变量


状态寄存器


const


是一个C语言的关键字,它限定一个变量不允许被改变


只读变量,即变量保存在只读静态存储区。编译时,如何尝试修改只读变量,则编译器提示出错,就能防止误修改。


const与define


两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些(其实const定义的是只读变量,而不是常量)。

#define只是简单的文本替换,除了可以定义常量外,还可以用来定义一些简单的函数,有点类似内置函数。

const和define定义的常量可以放在头文件里面。(小注:可以多次声明,但只能定义一次)

const与指针


int flag;   

const int * p1=&flag;       //p1可变,*p1不可变             const 修饰的是 *p1,即*p1不可变

int * const p2=&flag;       //p2不可变,*p2可变             const 修饰的是 p2,即p2不可变

const int *const p3=&flag;  //p3不可变,*p3也不可变          前一个const 修饰的是 *p3,后一个const 修饰的是p3,两者都不可变

推荐阅读

史海拾趣

Comax Industrial Co Ltd公司的发展小趣事

Comax Industrial Co Ltd公司自创立之初,便明确了其在电子行业中的定位与发展方向。公司初期便注重技术研发,引进了一批高素质的技术人才,并投入大量资源进行技术研发与创新。通过不懈的努力,Comax成功开发出一系列具有竞争力的电子产品,并在市场上获得了良好的口碑。这些产品不仅满足了客户的需求,也为公司的发展奠定了坚实的技术基础。

Crowd Supply公司的发展小趣事

Crowd Supply的创立源于几位麻省理工大学的毕业生对于硬件创新的热情与追求。他们意识到,许多优秀的硬件项目因缺乏资金和市场渠道而无法实现商业化。于是,他们决定创建一个平台,专门服务于这些创新项目,帮助它们从原型设计走向市场。这就是Crowd Supply的初心,也是其使命所在——将原创、有用、受人尊敬的硬件带入生活。

Axiomtek公司的发展小趣事

Calex Mfg. Co., Inc.的创业之路并非一帆风顺。在创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司的创始人们凭借着对电子行业的热爱和对技术的深刻理解,坚持研发创新,不断推出符合市场需求的产品。他们通过精益求精的制造工艺和严格的质量控制,逐渐在市场中树立起了良好的口碑。

埃派克森微电子(Apexone)公司的发展小趣事

自2002财年以来,埃派克森微电子的业绩呈现出连续增长的态势。公司凭借出色的产品性能和市场竞争力,成功打入多家国内外知名企业,逐渐在目标市场占据了一席之地。经过数年的发展,埃派克森在全球模拟芯片供应商中已占据重要地位,其产品在通讯核心芯片、多媒体电子、消费电子、汽车电子等领域均有着广泛的应用。

川晶科技公司的发展小趣事

川晶科技自创立之初,就专注于石英晶体频率元器件的研发。公司投入大量资源进行基础技术的探索和创新,不断突破技术瓶颈。经过多年的努力,川晶科技在石英晶体领域取得了显著的技术成果,其产品性能达到了行业领先水平。公司凭借卓越的技术实力,赢得了市场的广泛认可,为公司的快速发展奠定了坚实的基础。

Filtran Ltd公司的发展小趣事

随着业务规模的扩大,Filtran Ltd意识到供应链管理的重要性。公司开始在全球范围内寻找优质原材料供应商,并在亚洲和欧洲建立了生产基地,以降低成本并缩短交货周期。同时,通过引入先进的ERP系统和数字化管理工具,实现了供应链的高效协同。这一战略调整不仅提高了生产效率,还增强了公司对市场变化的快速响应能力。

问答坊 | AI 解惑

三洋818s伺服电机怎样提高速度

我这有一套用溧阳92-03伺服电机改三洋818s电机的速度系统,改过后,实际速度只有原来的1/5,请教高手我该怎么处理…

查看全部问答>

LPC1300中文手册(完整版)--无广告

我整理了一下,方便大家阅读,呵呵   …

查看全部问答>

关于手机开发和JavaEE开发哪个好?

毕业在即,是选择JAVAEE的培训还是接受老师推荐,去做手机开发呢,前提是我是一个没有任何嵌入式基础的专科生。…

查看全部问答>

如何将SMDK2440变成多个版本?例如我的产品210,对应的BSP是smdk2440210,产品220对应的是smdk2440220

本人菜鸟,现在碰到一个问题,希望向大家求助一下. 现在我的wince目录中的PLATFORM只有smdk2440一个bsp,这样产生了很多不方便的地方. 第一,目前有3个系列的产品,虽然都是基于2440的,但是在BSP上,还是有些地方是不同的,要维护这三个系列的产品.虽然 ...…

查看全部问答>

DDK编译程序出现的怪现象

DDK可以编译成两种版本。一个Free另外一个好象是Checked版本 有什么不同。 有时候我用Checked编译通过  Free不能通过编译  晕。 还有 VC里面不能 _asm mov ebp,esp 不能修改ebp的值吗?…

查看全部问答>

EVC中在基于对话框的情况下,怎样不使用按钮就能读取指定的路径呢?

用按钮的打开对话框我会,但是不用按钮直接读取得就不知道怎么弄了? 那位高手可以指点一下呢? 应该用哪个函数呢?…

查看全部问答>

急!ARM D/A转换程序实现多种波形输出

ARM D/A转换程序设计 1.编程实现多种波形(正弦波信号、三角波信号、方波信号)的输出,在 DA接口利用示波器观测实验输出。 2.在 LCD上显示信号…

查看全部问答>

stm32 i2c问题

我用的是神州stm32103系列的芯片,用开发板提供的程序i2c读写的读写函数放在液晶显示初始化ili9320的初始化程序下面就不能运行,我跟踪了程序,是在i2c读写函数的checkevent这里出现死循环, 导致程序没有办法继续往下执行,求指点,很急。 ...…

查看全部问答>

AVR与液晶的直接访问和间接访问

请假,利用AVR实现与液晶屏的访问,如果采用直接访问(给液晶屏分配一个地址空间),直接接到对应的地址和数据线上,对应的RD和WR信号分别接到AVR的RD和WR上。但是如果采用间接访问的话,液晶屏幕的RD和WR信号是不是一般不能接在对应AVR的RD和WR信 ...…

查看全部问答>