查看固件库,里面有很多在通常的C语言教程中不常看到的语法内容,总结如下: __I:其实是个宏定义,在core_cm3.h里面: [mw_shl_code=c,true]#ifdef __cplusplus #define __I volatile /*!< defines 'read only' permissions */ #else #define __I volatile const /*!< defines 'read only' permissions */ #endif #define __O volatile /*!< defines 'write only' permissions */ #define __IO volatile /*!< defines 'read / write' permissions */ [/mw_shl_code] 除了__I以外还有__O、__IO等等,都是volatile的别名,意思是要求编译器不作优化而直接读取变量的真实地址上的内容。 怎么优化呢?复杂,好比说iTempA = iTempB * 2,下一步如果使用到iTempA就会一直认为iTempB * 2的值就是iTempA的值,而实际上可能在其他地方iTempA被其他程序改变,所以如果使用到iTempA的话就不能认为是iTempB * 2而应该从iTempA的实际地址读取。 这只是类比,STM32是关于硬件的,iTempA如果被volatile修饰就应该读取它的真实地址内容不应该读取缓冲区内容。用书上的话就是“易失性”。 从宏定义可以看出来,无论是__O还是__IO都是volatile,并无区别,这个只是给程序员看的,没有语法上的约束。唯一不同的是__I,是const,常量。 不过具体怎么用呢?目前不得而知。 ------------------------- 库里面有一些很奇特的数据类型,比如uint32_t,uint16_t,虽然猜能够猜到是什么,不过具体是什么呢? 使用Keil很容易找到定义处,在c:\Keil_v5\ARM\ARMCC\include\stdint.h里面定义。(可是我的项目中却没有#include这个头文件呀!!看来Keil调用编译器的时候自动包含的,Keil自带的include不是没用啊。) stdint.h里面定义了许多这样的数据类型,大多是C原生数据类型的typedef,理解为别名好了。 [mw_shl_code=c,true] /* exact-width signed integer types */ typedef signed char int8_t; typedef signed short int int16_t; typedef signed int int32_t; typedef signed __INT64 int64_t; /* exact-width unsigned integer types */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned __INT64 uint64_t; [/mw_shl_code] 关于硬件的数据类型可能不会自动识别为int、float之类,这些都是需要使用者自己来识别来定义的,所以硬件的数据大多只和数据是存储在16bit还是32bit空间有关。 8位数据用C来定义就是signed char 或unsigned char ,而16位就是signed short int或unsigned short int,类似地,常用的寄存器是32位,就是unsigned int。 还是为了防止以后出现类型错误,减少编写出错几率。 ------------------------------------- 在stm32f10x.h中还定义了几个更精简的类型:vu32/vu16/vu8这类。 [mw_shl_code=c,true]typedef __IO uint32_t vu32; typedef __IO uint16_t vu16; typedef __IO uint8_t vu8; [/mw_shl_code] 这是在uint32_t的基础上加上了__IO修饰,定义了这么多,记忆是个问题。我现在的理解是:如果有__IO等修饰,那么就是从硬件读或写数据,不能用简单赋值。 ---------------------------------------- 关于字、字节。 我一直在做PLC项目,西门子PLC对于字和字节的定义是16位和8位的,用惯了PLC再来学习C用些对字有迷惑的地方,原来C中的字是32位的,16位是半字,字节还是8位,哈哈。 |
有关STM32固件库里面的一些C语法笔记。
最新推荐文章于 2022-08-27 11:39:18 发布