大家好,从事工作之后,小寻很久没写什么了,现在对我来说,工作之余,研究一下技术,可能以成为一种乐趣,当人们做有益他人的事情,而不求回报,总是快乐。希望下来的内容也能给你带去快乐。
关于嵌入式linux开发并不是一句话,或一篇文章能讲清楚的,很多事情也是如此,但有时候,就是那么一两篇文章,将我们从一个陌生领域的门外进入门内。。。。
如果没记错,以前有位兄弟在驱动的文章里提出一个问题,现在我便把它拿出来
看完你写的"驱动没什么新鲜玩意儿",我在想,ldd那本书居然还在出版,让我非常疑惑.仅仅填几个结构就是驱动程序了啊....怎么连写个积存器的动作都没....
当时我解释了很多,如今看来实在是废话,呵呵,随着对技术认识,可以简单的解释:前面的linux驱动是建立在操作系统之上的,而这位朋友所说的寄存器设置是指在嵌入式开发领域,可以说嵌入开发和驱动开发是两个交叉的学科,嵌入式开发里不一定全是驱动开发,驱动开发也不全限定在嵌入式平台。
关于linux驱动,我想需要解释一个问题,”软件是如何在硬件上跑起来的?”
从软件的角度看上去,所有的硬件(寄存器)都是地址(如0x00010011),在arm上大多是32位的。那么为什么要用寄存器?举个例子,对arm9处理器做编程,通过对寄存器的编程,如:
ldr r0 , =0x56000010
mov r1 , #0x00000400
str r1 , [r0] @设置gpbcon寄存器,将gpb5端口(引脚)设置为输出
ldr r0 , =0x56000014
mov r1 , #0x00000000
str r1 , [r0] @设置cpbdat寄存器,使gpb5 输出为0低电平
main_loop:
b main_loop
我们就将gpb5设置为输出端口,并让gpb5输出低电平,在开发板上您就会看到第一个led灯被点亮。
从上面的简单例子看到,通过对寄存器的设置,目的是对硬件做配置,使硬件我们的软件所用。所以如果硬要在软件和硬件之间架起桥梁的话,那么这个桥梁便是寄存器,和那些地址了。关于这些地址,我们可以通过手册获得,有时候需要做些许计算。
在这这里大家也许更关心的是:c是如何访问硬件吧?
这里讲到的是裸跑所以必须有一段程序先对内存堆栈做一下配置,这样我们的c才能跑得起来(关于这部分,由于不是重点就不多讲了)
#define gpbcon (*(volatile unsigned long *)0x56000010)
#define gpbdat (*(volatile unsigned long *)0x56000014)
int main(void)
{
gpbcon = 0x00000040; //设置gpbcon寄存器,将gpb5端口(引脚)设置为输出
gpbdat = 0x00000000; //设置cpbdat寄存器,使gpb5 输出为0低电平
return 0
}
我们可以看到它其实和前面的汇编没什么区别,只不过是比较好读罢了。
不少的处理器都为连在她周围的硬件(的寄存器),分配给他们自己的地址空间,软件便是通过地址空间来访问这些硬件。如果您很想从事这方面的开发,必要的硬件知识是不可少的^_^
地震让大伙知道:居安思危,才是生存之道。
posted on 2009-02-07 11:41
小寻 阅读(2895)
评论(3) 编辑 收藏 所属分类:
嵌入式开发