有关STM32固件库里面的一些C语法笔记。


查看固件库,里面有很多在通常的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位,哈哈。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被大佬糊弄的只会点灯的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值