打印

求助:STM32启动uclinux问题

[复制链接]
楼主: bao19830224
手机看帖
扫描二维码
随时随地手机跟帖
21
Simon21ic| | 2013-7-3 17:46 | 只看该作者 回帖奖励 |倒序浏览
bao19830224 发表于 2013-7-3 15:22
Simon21ic兄,我这几天利用空闲时间调试了下,发现启动卡在内核的init/mian.c的calibrate_delay()函数, ...

用CPSID i来关闭中断试试

使用特权

评论回复
22
hawksabre| | 2013-7-3 19:09 | 只看该作者
帮楼主顶一个   有时间   需要好好看看先    楼主   顶

使用特权

评论回复
23
bao19830224|  楼主 | 2013-7-4 09:00 | 只看该作者
Simon21ic 发表于 2013-7-3 17:46
用CPSID i来关闭中断试试

CPSID i 跳转时还是会进HardFault;

使用特权

评论回复
24
bao19830224|  楼主 | 2013-7-4 09:01 | 只看该作者
hawksabre 发表于 2013-7-3 19:09
帮楼主顶一个   有时间   需要好好看看先    楼主   顶

谢谢

使用特权

评论回复
25
Simon21ic| | 2013-7-4 15:58 | 只看该作者
bao19830224 发表于 2013-7-4 09:00
CPSID i 跳转时还是会进HardFault;

那要调试一下,看一下怎么会进hardfault的,不一定是堆栈的问题

使用特权

评论回复
26
bao19830224|  楼主 | 2013-7-4 16:24 | 只看该作者
Simon21ic 发表于 2013-7-4 15:58
那要调试一下,看一下怎么会进hardfault的,不一定是堆栈的问题

我刚调试了下,造成异常的原因是我没有定义宏__MICROLIB,从而没有将__initial_sp、__heap_base和__heap_limit三个变量声明成EXPORT类型供外部使用。以前进hardfault也不是发生在跳转的时候,而是跳转到内核地址执行了几句代码后才进的,当时没有调试仔细,以为是跳转代码引起的。
现在,不屏蔽异常,也能运行内核,但是还是会卡在calibrate_delay()函数

使用特权

评论回复
27
Simon21ic| | 2013-7-4 17:14 | 只看该作者
bao19830224 发表于 2013-7-4 16:24
我刚调试了下,造成异常的原因是我没有定义宏__MICROLIB,从而没有将__initial_sp、__heap_base和__heap_ ...

我给你的地址肯定是没问题的,应该不会是跳转的问题,这个确实是需要调试来查问题的。
stm32 uclinx的汇编代码之前看过,好像没发现有__MICROLIB宏的问题
当然,碰到问题也很简单,而且也有必要的设备,调试一下再对照源码看一下就知道了

使用特权

评论回复
28
bao19830224|  楼主 | 2013-7-4 20:40 | 只看该作者
Simon21ic 发表于 2013-7-4 17:14
我给你的地址肯定是没问题的,应该不会是跳转的问题,这个确实是需要调试来查问题的。
stm32 uclinx的汇 ...

多谢Simon21ic兄的建议,你说的地址是0x64000001吧?我明天去试。最近正好赶上项目转产,只能空闲的时候调,再加上STM32刚接触,多少影响了调试的进度

使用特权

评论回复
29
thislife| | 2013-7-5 09:47 | 只看该作者
晕。。
看来楼上两位对linux LD构造和镜像搬运没有深入了解才会对加载地址上纠结这么久。
至于Hard Fault错误,建议楼主深入了解一下m3异常模型如何诊断,再来提问。

使用特权

评论回复
30
bao19830224|  楼主 | 2013-7-5 15:53 | 只看该作者
Simon21ic 发表于 2013-7-4 17:14
我给你的地址肯定是没问题的,应该不会是跳转的问题,这个确实是需要调试来查问题的。
stm32 uclinx的汇 ...

正如Simon21ic所说,跳转是没有问题的。再修改了前期boot代码的一些错误后,跳转0x64000001能够正常启动uclinux,但是还有问题,这两个问题,您都在这个帖子提过https://bbs.21ic.com/icview-434231-3-1.html
1、Ignoring unrecognised tag 0x00000000,您说问题是ATAG_NONE的长度不为0。
     但parse_tags这个函数我看了,ATAG_NONE的长度0不是正好可以结束循环吗?
2、kobject_add_internal failed for X with -EEXIST, don't try to register things with the same name in
the same directory.这个问题您在帖子没说

先把问题贴出来,再找解决问题的办法,也好帮助后面遇到类似问题的兄弟。再次感谢Simon21ic的无私帮助

使用特权

评论回复
31
bao19830224|  楼主 | 2013-7-5 15:59 | 只看该作者
thislife 发表于 2013-7-5 09:47
晕。。
看来楼上两位对linux LD构造和镜像搬运没有深入了解才会对加载地址上纠结这么久。
至于Hard Fault错 ...

确实不是跳转引起的,是我代码的问题。因为当时手中没有JLink,所以误以为是跳转引起的。进入Hard Fault是我代码的问题。确实需要再好好研究一遍权威指南,多谢您的中肯建议。工作以来,一直都是跟51核的8位机打交道,差距蛮大的,呵呵

使用特权

评论回复
32
Simon21ic| | 2013-7-6 13:53 | 只看该作者
bao19830224 发表于 2013-7-5 15:53
正如Simon21ic所说,跳转是没有问题的。再修改了前期boot代码的一些错误后,跳转0x64000001能够正常启动u ...

ST的移植代码确实有些问题,我也都修复了,你要去看一下uclinux的代码,我记得不难修复的

使用特权

评论回复
33
trumpxp| | 2013-7-6 16:22 | 只看该作者
这个问题比较复杂   没怎么遇到过   楼主   帮你顶一个   看看别人的意见  真的没办法解决

使用特权

评论回复
34
bao19830224|  楼主 | 2013-7-6 21:51 | 只看该作者
Simon21ic 发表于 2013-7-6 13:53
ST的移植代码确实有些问题,我也都修复了,你要去看一下uclinux的代码,我记得不难修复的 ...

好的,我试试看。

使用特权

评论回复
35
bao19830224|  楼主 | 2013-7-9 11:14 | 只看该作者
Simon21ic 发表于 2013-7-6 13:53
ST的移植代码确实有些问题,我也都修复了,你要去看一下uclinux的代码,我记得不难修复的 ...

Simon21ic兄,我今天上午调试了下Ignoring unrecognised tag 0x00000000这个问题,我发现:
在boot中,传递给内核参数的tag、size和addr是:
tag:0x54410001 size:5 Addr:0x68000100
tag:0x54410002 size:4 Addr:0x68000114
tag:0x54410009 size:19  Addr:0x68000124
但是在内核中,打印信息是:
tag:0x54410001 size:5 Addr:0x68000100
tag:0x54410002 size:4 Addr:0x68000114
Ignoring unrecognised tag 0x00000000 4 0x68000114
tag:0x54410009 size:19  Addr:0x68000124
可见,这个问题是由于没有识别出0x68000114地址的tag引起的,这个tag应该是SRAM的信息,我确实在boot中已经设置。这个应该和您在https://bbs.21ic.com/icview-434231-4-1.html的64楼的类似,不知道您当时是怎么解决的,谢谢

使用特权

评论回复
36
bao19830224|  楼主 | 2013-7-10 09:30 | 只看该作者
Simon21ic 发表于 2013-7-6 13:53
ST的移植代码确实有些问题,我也都修复了,你要去看一下uclinux的代码,我记得不难修复的 ...

Simon21ic兄,我把ST官方的Bootloader烧进去,从打印信息看它肯本就没有设置tag 0x54410002参数(SRAM信息)而且设置命令行参数的size属性时也没有4个字节对齐。我仿照它的写,暂时规避了Ignoring unrecognised tag 0x00000000。
现在还有一个比较棘手的问题是,uCLinux启动后,**标志出来后,出现了Segment kernel的错误,具体的打印信息如下:
http://www.uclinux.org/
http://www.st.com/stm32
CPU: 0    Not tainted  (2.6.26-uc0 #14)
pc : [<c08308ac>]    lr : [<680880eb>]    psr: 61000000
sp : 68089f70  ip : 00000000  fp : 00000000
r10: 680899e8  r9 : 00000000  r8 : 680880d1
r7 : 680898e9  r6 : 00000001  r5 : 68089fac  r4 : 00000001
r3 : 2000ff00  r2 : c08308ad  r1 : 68089fac  r0 : 64160000
Flags: nZCv  IRQs on  Mode USER_26  ISA   Segment kernel
我无法定位这个错误,还请您抽空看一下,谢谢
网上有说是内存的物理地址和虚拟地址发生了映射错误,好像不太靠谱

使用特权

评论回复
37
Simon21ic| | 2013-7-10 12:58 | 只看该作者
打印**之后,应该是运行/bin/sh,至于是什么问题出错,这个我肯定没时间帮你查了
项目太多,自己都忙不过来,还有N个要外包的呢

使用特权

评论回复
38
bao19830224|  楼主 | 2013-7-11 21:54 | 只看该作者
Simon21ic 发表于 2013-7-10 12:58
打印**之后,应该是运行/bin/sh,至于是什么问题出错,这个我肯定没时间帮你查了
项目太多,自己都忙不过 ...

好的,这已经十分感谢了,祝项目顺利

使用特权

评论回复
39
outstanding| | 2013-7-12 14:59 | 只看该作者

使用特权

评论回复
40
bao19830224|  楼主 | 2013-7-12 15:00 | 只看该作者
终于还算正常的启动uCLinux了,还有一句警告:kobject_add_internal failed for X with -EEXIST, don't try to register things with the same name in the same directory.还会继续寻找原因的,先结贴吧。
感谢@Simon21ic 兄和不爱说话 兄的无私帮助

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则