历史上的今天

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

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

发布者:Xiaoxue666 来源: eefocus关键字:STM32  数据类型定义  Keil  MDK 手机看文章 扫描二维码
随时随地手机看文章

在 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,两者都不可变

关键字:STM32  数据类型定义  Keil  MDK 引用地址:STM32 数据类型定义

上一篇:stm32f4xx 加密
下一篇:STM32中常用的数据类型

推荐阅读

  近日,神州控股旗下科捷物流在北京发布了“人机共舞2.0”立体高密度机器人智能仓,该技术采用“货到人”模式,将技术与现有物流业务流程充分融合,属国内首例。   神州控股科捷物流常务副总裁陈滔滔介绍,相较于业内传统地面机器人“货到人”系统,该机器人拣选系统运用天地轨运行自动控制技术,采取空中悬挂机器人模式,突破了传统机器人仅能在...
日前,服务于全球电子制造和设计供应链的行业协会SEMI宣布,德国汽车制造商大众宣布加入SEMI,SEMI的成员资格将大众汽车能够获得SEMI的核心竞争力,以制定国际标准并协调技术路线图,同时使汽车制造商能够利用全球SEMI平台来促进整个供应链细分市场的行业契合。大众汽车公司是SEMI全球汽车咨询委员会(GAAC)的创始成员。GAAC成员以SEMI Smart Transport...
据路透社报道,荷兰芯片制造商恩智浦半导体表示,它已与亚马逊云计算部门建立战略合作关系,帮助汽车与数据中心进行通信。双方表示,合作将涉及开发一种新的NXP芯片,用于收集汽车系统中的数据,并将其通过互联网发送,以便更好地与亚马逊的数据中心合作。NXP半导体执行副总裁兼汽车处理总经理Henri Ardevol在一份声明中称:“我们看到了帮助汽车制造商在...
最近元宇宙概念大火,虚拟世界的无限可能让人产生无限的遐想,但在开发元宇宙的道路上存在着诸多挑战,其中之一就是如何在虚拟宇宙中实现真实触觉,这一问题,如今终于有了突破性的进展。近日,Meta(原名Facebook)的现实实验室(Reality Labs,RL),公开了一款触觉感知手套,戴上它,就可以在VR里拥有相当真实的触觉,实现与虚拟物体的交互。比如配合物...

史海拾趣

问答坊 | AI 解惑

变频器的电机辨识

怎样做MM4 的电机辨识?如何判断装置识别电机的效果?要注意以下几点:      做快速调试时,一定要遵循手册给出的引导流程进行,特别是电机铭牌数据必须要准确输入。如果电机的铭牌数据输入有误,电机建模就不会精确,控制起来也 ...…

查看全部问答∨

请教一个电容的作用

这是个小鬼子的图,不知道C1的作用.请大家赐教.谢谢!!! file:///C:/Documents%20and%20Settings/ks/桌面/原理图.jpg…

查看全部问答∨

申请LPC1343开发板用于学习,研究

正学习cortex-m3,对其有一定了解,学过s3c2440对嵌入式较熟悉,希望也能在cortex-m3上也有一定的成绩,本人向来本着分享精神,在csdn上传有我的许多学习2440的心得…

查看全部问答∨

求助,用过MAX1898电源管理芯片的大侠进

如图我用单片机和此芯片连接作了个充电器。,CT和RESTRT之间的电容,是100nf,根据数据手册的公式其充电时间是最多3小时,但是我接上电池1小时后,LED就开始闪烁了。手册给出了四种情况,我的就属于第四种:LED开始频闪,电压小于2.5V(就是没达到4.5 ...…

查看全部问答∨

TCPMP 0.72RC1用VS2005编译出错

使用VS2005编译TCPMP 0.72RC1出错。 安装了CE6.0的SDK. 设置如下: Properties->C/C++->Advanced->Compile For Architecture->ARM4(/QRarch4) Properties->Linker->Advanced->Targer Machine->MachineTHUMB 首先编译的的commo ...…

查看全部问答∨

如何移植WinCE内核映像和导出SDK

由于我师姐用的是Linux操作系统,ARM开发板上装的是Linux内核。我用的是WinCE操作系统,我要把WinCE内核映像移植到开发板上,我们用的是同一个开发板。请敬高人:我该怎么做?是不是把内核映像移植到开发板后,才能导出目标平台的SDK?谢谢!…

查看全部问答∨

UCGUI能否开发GIS系统,可以的话怎么开发??

UCGUI能否开发GIS系统,可以的话怎么开发??…

查看全部问答∨

请教学习LM3s5749中的AD

最近正在学习LM3s5749中的AD,已经看完英文版的介绍资料,只有EasyArm5749中的一个例子,感觉太少了点。 请求各位大虾,有学过的5000系列的,给小弟推荐个网站能下载几个例子研究的,或是发给我些例子能学习下。 我的邮箱12480541@qq.com 不胜感 ...…

查看全部问答∨

MSP430版想近期想举办一次活动,大家有什么想法不?

以前有过开发板的试用活动,试用的版友们写出了很多优秀的试用笔记,给430的新手们留下了宝贵的学习资料。咱们MSP430版会持续的开展一些活动,来给学习以及使用MSP430的朋友们更多熟悉它的机会。大家有没有啥想法,咱们一起来把它实现。曾经的想法 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved