今天学习了Nand Flash的一些内容。在此做下回忆和总结:
1.什么是Nand Flash?
答:Nand FLash是一种非易失性的存储性介质,一般用于保存嵌入式系统运行所必需的操作系统、应用程序、用户数据等,地位和PC上的硬盘类似。一般来说,它的接口引脚不像SDRAM那样多(SDRAM有20多根),一般也就是十几根。以三星公司的K9F1208U0M为例,如下所示。
正因为它的数据引脚较少,所以它的命令、地址、数据都是公用这一组IO引脚再配上ALE、CLE等其他使能信号进行传输的。操作Nand Flash(读、写、擦除)也和简单,基本上是按照传输命令、传输地址、最后读写数据这样一个流程实现的。这些命令在具体的芯片手册上都会有。
就像上面说的,命令、地址、数据都是通过那一组IO引脚传输的,不过对于S3C2440芯片来说,它为我们准备好了一组寄存器(NFCON、NFCONT等),我们只要操作具体的寄存器就可以实现上述流程。
2.static在嵌入式编程中的作用?
答:今天在看代码的时候,看到了用static修饰的静态函数。有点疑惑,所以查阅了解了一下。
有一篇CSDN博客上讲的挺详细的,先摘录如下(http://blog.csdn.net/janeqi1987/article/details/46998603):
static从本质来讲就两个作用:
(1)、限定存储域
(2)、限定作用域
第一、限定存储域:被static修饰的变量无论是局部变量还是全局变量都将被编译器存放在静态区。而实际上在gcc编译完生成的ELF格式文件中并没有静态区这个概念,所谓静态区是我们在概括讨论程序数据段的一种泛称。实际上编译器会根据具体情况把被static修饰的变量分为两类:当变量被定义并初始化为非零值的时候,变量将放在.data段;当否则为初始化或初始化为零的时候将放在.bss段。我们在不深入讨论的时候暂且可以将此两段概括为静态区。而放在静态区的变量由于存储域的原因导致生命周期很长,长度为程序(确切讲应该是该程序运行后的进程)的一次运行过程,而普通局部变量由于在运行过程中被系统分配在栈区所以生命周期只是一次函数的调用过程。
第二、限定作用域:由于静态还是普通局部变量本身的作用域就是函数内部,因此static的作用域主要是对全局变量和函数的限定。被staitc修饰的全局变量或函数都被编译器标记为仅在本文件中使用,由于编译器在编译过程中是以.c结尾的源文件为单位依次生成以.o结尾的目标文件,所以最后连接器在连接过程中将不允许被static修饰的变量或函数的地址对外链接。这样既可以防止全局变量或函数的重名问题,又可以防止由于无关的全局变量误操作引起的程序逻辑问题。因此static就限定了变量或函数的作用域。
- volatile在嵌入式编程中的作用?
答:volatile是不稳定的意思,它是一个变量修饰符,用来指示编译器不要对此修饰符修饰的变量进行优化,否则可能会出现错误。简单来说,当有些变量从内存中读入到寄存器中的时候,可能会保留一个备份,下次操作此变量的时候就不用在此从内存中读取,直接使用这个备份寄存器中的值就可以了(这是由编译器优化实现的)。但是在涉及到多线程或者有关硬件编程的时候,对有些变量不需要这些优化(可能是为了保持数据的稳定性、一致性),就用到了这个修饰符。
4.一个小的发现:以前在编程的时候,定义了一个结构体之后,都是用这个声明的结构体定义一个变量,由系统给我们分配这个变量的空间(动态或静态)。今天在看代码的时候,发现在底层的编程中,有的时候可以直接给变量赋一个指定的值(长知识了)。如下图所示,