完成前面一部分的大牛,在我来公司之前就已经走了。so。。。我做了一部分应用编程之后,出现大大小小的问题,都是自个琢磨怎么解决。老大还整天在那喊,下面的东西不用了解太多啊,啊,啊之类。。。还好,有兴趣往这方面发展。没人指导,没思路走得慢些而已。
前两天终于要出样品了。。。做了两年半的产品。。。结果出货前一天的中午,发现启动过程中偶尔会吐ops。fuck,扔给我解决。老大不停在问,是不是你应用程序的问题啊,是不是你应用程序问题啊。。。我很想回答他是的。
当然,出问题之前,不知道这个叫ops,症状如下:
ess 00000003
pgd = c3ff4000
[00000003] *pgd=23eff031, *pte=00000000, *ppte=00000000
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,但是问题依旧。。。不知道是怎么回事。继续查找中