完成前面一部分的大牛,在我来公司之前就已经走了。so。。。我做了一部分应用编程之后,出现大大小小的问题,都是自个琢磨怎么解决。老大还整天在那喊,下面的东西不用了解太多啊,啊,啊之类。。。还好,有兴趣往这方面发展。没人指导,没思路走得慢些而已。
前两天终于要出样品了。。。做了两年半的产品。。。结果出货前一天的中午,发现启动过程中偶尔会吐ops。fuck,扔给我解决。老大不停在问,是不是你应用程序的问题啊,是不是你应用程序问题啊。。。我很想回答他是的。
当然,出问题之前,不知道这个叫ops,症状如下:
starting udev...Unable to handle kernel NULL pointer dereference at virtual addr
ess 00000003
pgd = c3ff4000
[00000003] *pgd=23eff031, *pte=00000000, *ppte=00000000
Internal error:
Oops
:
1
[
#
1]
Modules linked
in
:
CPU:
0
PC is at find_get_page
+
0x44
/
0x64
LR is at
0xfffffffa
pc : [<c005ad20
>
] lr : [<fffffffa
>
] Not tainted
sp : c3805db4 ip : c3f3fd88 fp : c3805dc0
r10:
00000000
r9 : c3fe0684 r8 :
00000000
r7 : 000098c0 r6 :
00000000
r5 :
00000000
r4 :
00001000
r3 :
00000093
r2 :
00000093
r1 : ffffffff r0 : c54c1027
Flags: nzcv IRQs off FIQs on Mode SVC_32 Segment user
Control: 5317F
Table: 23FF4000 DAC:
00000015
Process
udevd (pid:
272
, stack limit
=
0xc3804250
)
Stack: (
0xc3805db4
to
0xc3806000
)
5da0: c3805e40 c3805dc4 c005b350
5dc0: c005acec
00000001
00001000
c3f4cd98
00000000
ffffffff
00000001
00000001
5de0:
00000009
c3805eec c3fe0640 c3f4cdf4
00000000
00000004
00000000
00000004
5e00
:
00000000
00000000
00000000
00000020
00000000
00000000
00000001
00000000
5e20
: c3fe0640 c3805e9c
00000000
c3805ea4
00000200
c3805e90 c3805e44 c005d81c
5e40
: c005b1fc c3805e58 c005b6cc c3805eec
00000001
c3805e9c
00000000
00000200
5e60
: bec5cac4
00000000
c3805ea4 c3805eec c3fe0640 c3805f78 c3805e9c
00000000
5e80
: 40022fbc c3805f4c c3805e98 c007639c c005d658
00000000
00000000
bec5cac4
5ea0:
00000200
c3805efc c3805eb4
00000000
00000001
ffffffff c3fe0640
00000000
5ec0:
00000000
00000000
00000000
c0376d60
00000000
00000000
c3805efc c0376d60
5ee0: c0049b00 c3805ee4 c3805ee4
00000000
00000000
c3805f00 c0075814 c007579c
5f00: c3805f04
00000200
c02f4220 c006b29c c006a3a4 c3e6e530
00000101
00000001
5f20:
00000000
c3804000 c3fe0640 bec5cac4 c3805f78
00000200
c3804000 c3804000
5f40: c3805f74 c3805f50 c00764ac c00762ec
00000020
c3fe0660 c3fe0640 c3805f78
5f60:
00000000
00000000
c3805fa4 c3805f78 c0076850 c00763fc
00000000
00000000
5f80:
00000000
00000000
4001b03c 0000000f
00000003
c0020ee4
00000000
c3805fa8
5fa0: c0020d40 c0076814
00000000
4001b03c
00000007
bec5cac4
00000200
bec5cac0
5fc0:
00000000
4001b03c 0000000f bec5cac4 fffffdb4
00000007
40022fbc bec5c984
5fe0: 40022d70 bec5c91c 400052b4 40015f94
00000010
00000007
2420722d 6c6c7566
Backtrace:
[<c005acdc
>
] (find_get_page
+
0x0
/
0x64
) from [<c005b350
>
] (do_generic_mapping_read
+
0x164
/
0x4e0
)
[<c005b1ec
>
] (do_generic_mapping_read
+
0x0
/
0x4e0
) from [<c005d81c
>
] (generic_file
_aio_read
+
0x1d8
/
0x214
)
[<c005d648
>
] (generic_file_aio_read
+
0x4
/
0x214
) from [<c007639c
>
] (do_sync_read
+
0
xc0
/
0x110
)
[<c00762dc
>
] (do_sync_read
+
0x0
/
0x110
) from [<c00764ac
>
] (vfs_read
+
0xc0
/
0x180
)
r9
=
C3804000 r8
=
C3804000 r7
=
00000200
r6
=
C3805F78
r5
=
BEC5CAC4 r4
=
C3FE0640
[<c00763ec
>
] (vfs_read
+
0x0
/
0x180
) from [<c0076850
>
] (sys_read
+
0x4c
/
0x74
)
r8
=
00000000
r7
=
00000000
r6
=
C3805F78 r5
=
C3FE0640
r4
=
C3FE0660
[<c0076804
>
] (sys_read
+
0x0
/
0x74
) from [<c0020d40
>
] (ret_fast_syscall
+
0x0
/
0x2c
)
r8
=
C0020EE4 r7
=
00000003
r6
=
0000000F r5
=
4001B03C
r4
=
00000000
Code: 1590100c e10f2000 e3823080 e121f003 (e5913004)
Segmentation fault
大致上,如果是软件错误,有两个可能,一个是对空指针的不规范使用,另一种就是访问了不该访问的地址;如果问题是在硬件上,可以尝试把主频降低了看看是否能解决。
软件和硬件问题,可以通过看问题的可重复性来判别。如果是软件问题,不管你怎么烧程序,何时启动,跳出来的都是同样的错误提示。而如果是硬件问题,可能你重烧一遍程序,或者是重新启动一次跳出的错误提示就不一样,或者不是每次启动都出问题。
搜索过程中,看到有人查找软件问题,是用printk一步步打印,来查找错误行的。看来print是万能啊~~~
有了以上信息,可以基本判断为,问题是在硬件上。那怎样修改处理器主频呢?
找到以下信息:
修改at9260主频,修改PMC_PLLAR寄存器,199M是由 18.432M 进行97倍频后再9分频而来:
18.432M *(96+1)/9 = 198656000, master的99M是将CPU主时钟2分频而来。
所以只需要修改倍频或分频值就可以变主频了。你看PMC那一章,里面有详细说明。
那么就是说,修改处理器主频,只是修改一些寄存器的值,具体修改哪个寄存器和怎样修改,可以看cpu的datasheet。
然后又搜到:
内核频率的修改应该是修改:linux-3.2/include/asm-arm/arch
下面的这句就行了,看芯片手册改:
#define PMCR 0X400B //88MHZ
SEP4020用户手册v1.8.0.pdf 176页 "7、时钟常用配置(PMCR 寄存器常用配置,外部晶振为4M Hz)"
把上句改为:
#define PMCR 0X4008 //64MHZ
这样就可以了.
那意思就是,修改的地方在,include/asm-xxx/arch/xxxx,找到你的板子,处理器所对应的头文件改动之~~~
最后是改动了
刚下了cpu的datasheet,还没找改哪里。。。改完再继续写~
最后是改了arch目录下的clock.c,将频率改为100M,但是问题依旧。。。不知道是怎么回事。继续查找中