按照韦东山的《嵌入式linux应用开发完全手册》和配套视频学习中断。期间遇到了比较烦的两个问题。对于我这个初学者,真是脑壳都大了,但好在想到了个好办法。就是遇到错误,又不知道错在哪个文件时,将自己写的一个一个的放进正确的源码中,然后再制成可执行程序,烧进板子里测试。但首先你得有正确的源码,我的是书的配套光盘带的。对于初学者这应该是个好办法,对于高手来说可能就显得有些笨拙了。下面介绍我在学习终于到的问题,及用这种方法处理的过程。 1. 各寄存器设置好,编写完程序后,烧入板子,结果不亮。 先是想,应该是led初始化哪里出错了。但是看了半天,没找出错误。就是写3个01b进GPFCON,位运算也没搞错。其他调试方法也不会啊,这下脑壳一下子就大了。 出去转了圈,回来想到将视屏里的代码跟我自己写的挨个替换,然后烧进板子,应该能找到错误的地方。要替换先得把自己写得代码改成能与视屏里的Makefie,汇编相互调用的才行。把代码里的函数名改成一样就行了。 改完函数名之后,考虑应该是初始化的问题,先将视屏里INIT.C拷到我写的代码里面,和我写的其他代码一起制成可执行文件。烧进板子后,亮是亮了,但是只有三个键可以用。 想了下,是视频代码只初始化了S2、S2、S3,在把S4初始化加上就对了。这就说明了的确是INIT.C的问题,但是问题出在哪呢。初始化代码看了几次都没错,跟视频代码都能对上。唯一不同的就是视频代码里面是调用的头文件,我是自己在源文件中自己宏定义的。于是将头文件打开一看,原来是类型定义错了。我将寄存器地址定义为字符型指针了,它应该是长整型的。 2. 三个led老是一起亮。 一个问题解决了,另一个问题又出现了。我将宏定义改过来之后,重新制成可执行文件烧进板子。操作结果是按想象的实现了,但是操作之后每过几秒,三个灯就会全亮。于是想到是不是中断服务程序有问题。看了几遍中断服务程序的代码,没问题。正想着要不要再出去走一圈的时候,突然想的这是不是无限重启啊。是的话,应该就是看门狗的问题了。关看门狗就是往寄存器里写0怎么会出错呢?真是日了狗了。把视频里的头文件和跟自己定义的看门狗寄存器对比一看,0X530000000,多打了一个0… 期间还遇到过这样的,同样的文件,make两次,然后烧进板子,一次不行再试一次又行了。真是什么情况都有。
|