1.操作寄存器
在嵌入式开发中,常常要操作寄存器,对寄存器进行写入,读出等等操作。每个寄存器都有自己固有的地址,通过c语言访问这些地址就变得尤为重要。
#define gstatus1 (*(volatile unsigned int *)0x560000b0)
在这里,我们举一个例子。这是一个状态寄存器的宏定义。首先,通过unsigned int我们能够知道,该寄存器是32位的。因为要避免程序执行过程中直接从cache中读取数据,所以用volatile进行修饰。每次都要重新读取该地址上的值。首先(volatile unsigned int * )是一个指针,我们就假设它为p吧。
它存储的地址就是后面的0x560000b0,然后取这个地址的值,也就是 * p,所以源代码变成了(* (volatile unsigned int * )0x560000b0),接下来我们就能直接赋值给gstatus1来改变地址0x560000b0上存储的值了。
/* nand flash (see s3c2410 manual chapter 6) */typedef struct { s3c24x0_reg32 nfconf; s3c24x0_reg32 nfcmd; s3c24x0_reg32 nfaddr; s3c24x0_reg32 nfdata; s3c24x0_reg32 nfstat; s3c24x0_reg32 nfecc;} s3c2410_nand;static s3c2410_nand * s3c2410nand = (s3c2410_nand *)0x4e000000;volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->nfstat;
有时候,你会看到这样一种情况的赋值。其实这和我们刚刚讲过的差不多。只不过这里是在定义了指针的同时对指针进行赋值。
这里首先定义了结构体s3c2410_nand,里面全部是32位的变量。又定义了这种结构体类型的指针,且指向0x4e000000这个地址,也就是此刻s3c2410nand指向了一个实际存在的物理地址。
s3c2410nand指针访问了nfstat变量,但我们要的是它的地址,而不是它地址上的值。所以用&取nfstat地址,这样再强制转换为unsigned char型的指针,赋给p,就可以直接通过p来给nfstat赋值了。
2.操作函数指针
指针不光能指向变量、字符串、数组,还能够指向函数。在c语言中允许将函数的入口地址赋值给指针。这样就可以通过指针来访问函数。
还可以把函数指针当成参数来传递。函数指针可以简化代码,减少修改代码时的工作量。通过接下来的讲解大家会体会到这一点的。
#include using namespace std;/*比较函数声明*/int max(int,int);int (*test)(int,int);int main(int argc,char* argv[]){ int largernumber;/*将max函数的入口地址赋值给 *函数指针test */ test=max;/*通过指针test调用函数max实 *现比较大小 */ largernumber=(*test)(1,2); cout<
这段代码是用于操作nand flash的一段源代码。首先我们看到开始定义了一个结构体,里面放置的全是函数指针。他们等待被赋值。然后是定义了一个这种结构体的变量nand_chip。然后是即将操作的函数声明。
这些函数将会被其他文件的函数调用。因为在这些函数里一般都只有一条语句,就是调用结构体的函数指针。
接着往下看,是针对两种架构的函数声明。然后在nand_init函数中对nand_chip进行赋值,这也就是我们刚刚讲过的,将函数的入口地址赋值给指针。现在nand_chip已经被赋值了。如果我们要对nand进行读写操作,我们只需调用nand_chip.read_data()或者nand_chip.write_cmd()等等函数。
这是比较方便的一点,另一点,此代码具有很强的移植性,如果我们又用到了一种芯片,我们就不需要改变整篇代码,只需在nand_init函数中增加对新的芯片的判断,然后给nand_chip赋值即可。所以我说函数指针会使代码具有可移植性,易修改性。
3.操作寄存器的位
#define gpfcon (*(volatile unsigned long *)0x56000050)gpfcon &=~ (0x1<<3);gpfcon |= (0x1<<3);
结合我们刚刚所讲的,首先宏定义寄存器,这样我们能够直接给它赋值。位操作中,我们要学会程序第2行中的,给目标位清0,这里是给bit3清0。第3行则是给bit3置1。
小米6已投产 三大版本将搭载不同处理器并有陶瓷版
超鸟C号卫星参数表
STM32F1/F4复位的实现方式有哪些
区块链技术如何影响知识产权领域
哪款苹果无线充电宝最好?苹果无线充电宝哪个牌子好
嵌入式开发常见的C语言技巧与方法分享
远翔FP6188:23V 2A内置MOS降压IC
充电电池的含义、优点、种类、品牌及选购指南的介绍
百度战略投资赛昉科技 RISC-V挺进数据中心大市场
被富士康收购后 夏普终于实现了盈利这一小目标
UDE&iLife2020打造行业嘉年华 八大亮点抢先看
要闻:SOHO开通5G 中国移动致歉 美审查硅谷巨头垄断
5G前传网络中的MWDM和LWDM技术究竟是什么
AMD也考虑推“中国特供版”AI芯片
程序中进程和线程的区别
太阳能逆变器中能量缓冲器电容器的选择
东风御风房车如约在腾格里沙漠盛开
整治餐饮油烟污染,油烟在线监测解决方案
在无电池世界中重新构想智能家居
GPT-3.5 vs GPT-4:ChatGPT Plus 值得订阅费吗 国内怎么付费?