在嵌入式中,底层一定是操作寄存器,我有一个理念,凡事一定要想清楚,把任何知识点融入自己的理解之中,这样不被技术限制的同时,还能让自己其他方面的认识得到进步。
下面我把自己的理解写出来,抛砖引玉!
1.封装寄存的C语言的语法
volatile:
编译器在处理变量的时候,为了效率考虑,对于频繁修改的变量会把他放在缓存(CPU里面的缓存比RAM速度快的多的多)中进行计算,等到不频繁或者确实需要写入内存的时候,才会写到RAM中,不会实时的和RAM交互,对于寄存器这种和外界交互的“内存”来说,就会出现问题,看似我操作了寄存器,实际上我是自娱自乐
可以这么记忆,底层操作必须用这个volatile把寄存器和变量绑定在一起才能用,不然这个程序就不能用,或者这个数字是极其关键的,实时更新!
unsigned int:
寄存器都是32位的,在32位单片机中,我们需要一个能覆盖32的数据类型,这个数据类型就是int,你问long int能不能行,其实也是可以的,不过计算起来就会非常的麻烦,unsigned是为了保证int32位都是可以说的(signed类型最高位会变成正负号)
也就是说,用unsigned int这个数据类型和整形这个概念没有关系,只和占据32位有关系
*pGpiobOdr
指针,对于指针我们都知道是指的一个地址,但是我们要明白在实现世界还是程序代码的世界,都是有空间时间这个概念的(by the way,多维数组表示三维空间,有点类似于二向箔对三维的二维展开),既然是一个地址根本代表不了什么,还需要知道这个地址起始,占据的空间,占据空间这个维度就需要数据类型指定,你给什么数据类型,你就在内存中圈多大的地盘,这个就是前面定义的 unsigned int参数的作用
volatile unsigned int *
强制类型转换,c语言要求必须和前面指针类型的一致,不然就会警报。
2.进一步C语言的封装
C语言的进一步封装就是用结构体把大块的内存框起来,比如关于GPIOA所有寄存器全部用结构体框起来,GPIOA内部的多个寄存器,用结构体成员区分,其实就是先用结构体圈地,然后把圈来得地分割,为什么要加结构体这个环节,主要是为了方便管理,层次分明才能逻辑清晰,打个比喻,本来你的各类资料胡乱几千本放在一个大箱子里面,你要去寻找一个叫做东京有点热的学习资料,发现你要一本本的去翻,这个时候你完全可以整几个箱子分类放置,我们就可以很快的找到,很快的学习了!