NAND FLASH操作学习笔记
来源:互联网 发布:java开发有必要买mac吗 编辑:程序博客网 时间:2024/06/08 05:04
首先是几个C语言的学习点。
1.利用一个函数结构体,来保存某一类的函数首地址,一个很好的编程技巧,可以使程序可读性增加。做法是:
typedef struct {
void (*nand_reset)(void);
void (*wait_idle)(void);
void (*nand_select_chip)(void);
void (*nand_deselect_chip)(void);
void (*write_cmd)(int cmd);
void (*write_addr)(unsigned int addr);
unsigned char (*read_data)(void);
}t_nand_chip;
t_nand_chip nand_chip;
nand_chip.nand_reset=2440_nand_reset;
这里的结构体成员全都是函数指针,函数指针,顾名思义就是保存函数首地址的指针,可以直接将一个函数名赋值给这个指针。当要调用这个函数时,可以直接像调用函数一样。
nand_chip.nand_reset(); 注意:这里其实存在着编译器的优化,正确的写法应该是
nand_chip.(*nand_reset)(); nand_reset只是一个指针,它保存的内容才是函数的首地址,但是编译器在这里做了优化,可以使我们代码编写简单,而且好理解。
2.
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;
这句话理解了半天,终于想明白了。
关键就在于并没有创建一个新的结构体,而是巧妙的利用了定义结构体的性质。s3c2410这个指针指向的结构体首地址就是0x4e000000,它是NAND寄存器的首地址。它巧妙的把原来已经存在的寄存器组当成了一个结构体,结构体内部的变量都是4字节递增,正好对应每个寄存器的地址。那么需要对这个某个寄存器赋值的时候。
volatile unsigned char *p = (volatile unsigned char *) &s3c2410nand->NFSTAT;
这里的p指针指向的是一个char型空间,所以后面要做强制类型转换。注意这里一定不能忘了取地址符&,它才表示这个寄存器的地址。
还有就是在对寄存器操作的时候,最好都用volatile修饰符,不然编译器可能会对其进行优化。程序中某些处函数没有使用,个人觉得最好也使用一下。
- NAND FLASH操作学习笔记
- NAND FLASH操作学习笔记
- nand flash学习笔记一
- NAND FLASH学习(一) nand flash操作概述
- NAND FLASH学习笔记之nand flash基础(一)
- NAND FLASH学习笔记之nand flash基础(二)
- NAND FLASH学习笔记之nand flash基础(三)
- NAND FLASH学习笔记之nand flash基础(一)
- NAND FLASH学习笔记之nand flash基础(二)
- NAND FLASH学习笔记之nand flash基础(三)
- 嵌入式Linux学习笔记 NAND Flash控制器
- tftp操作nand flash
- nand flash 读写操作
- Nand Flash操作指令
- nand flash 操作命令
- nand flash的操作
- Nand Flash操作
- Nand flash 基础操作
- 最小二乘与交叉熵代价函数的区别(作用及公式推导)
- Hadoop和hadoop生态圈
- addEventListener("transitionend", ()=>{...})方法回调函数执行多次问题
- 数据结构 — 哈希表的理解与简单实现
- CSDN怎么转载别人的博客
- NAND FLASH操作学习笔记
- Tornado异步
- Occlusion-free Face Alignment: Deep Regression Networks Coupled with De-corrupt AutoEncoders
- learn opencv-使用OpenCV进行Alpha混合(C ++ / Python)
- Zookeeper学习与实践(一)
- linux学习---线程同步(互斥量,信号量,条件量)线程属性
- 消费者生产者模式(2)——用java阻塞队列实现
- Java面试题——ArrayList和Linked区别
- postgresql 数据库查询