求助:STM32启动uclinux问题

[复制链接]
7102|46
手机看帖
扫描二维码
随时随地手机跟帖
bao19830224|  楼主 | 2013-6-28 22:45 | 显示全部楼层 |阅读模式
各位好:

    小弟手上有一块ST官方的STM3210E的开发板,板上是一颗STM32F103ZGT6。按照ST的使用手册中的步骤,成功启动了uclinux。

    由于ST官方的kernel_boot_loader.hex没有开源,就想自己写一个。于是按照众所周知的顺序:关看门狗、初始化时钟、初始化FSMC、SRAM、NorFlash和串口。

    并在0x68000100处进行传递给内核参数的赋值,最后跳转到0x64000000执运行内核(XipImage),Mach_type是2189。

    但是在跳转后,串口并没有打印出uclinux的启动信息,可见没有成功运行内核。通过串口打印出了设置的参数值,均已正确设置成功。又试了几个别的跳转地址(例如0x64000000+64或者+4)也都无用。

    卡在这里了,望大家帮忙,谢谢
Simon21ic| | 2013-6-29 00:02 | 显示全部楼层
本帖最后由 Simon21ic 于 2013-6-29 00:03 编辑

跳转到0x64000001试试,有调试工具的话,调试一下就知道了

使用特权

评论回复
bao19830224|  楼主 | 2013-6-29 09:29 | 显示全部楼层
感谢回答

M3核可以跳到bit0不为0的地址吗?应该会报错吧。手上的JLINK坏掉了,诸事不顺啊

使用特权

评论回复
bao19830224|  楼主 | 2013-6-29 09:31 | 显示全部楼层
上传下代码,麻烦大家给看看

BootForNor.rar

195.52 KB

使用特权

评论回复
bao19830224|  楼主 | 2013-6-29 09:39 | 显示全部楼层
Simon21ic 发表于 2013-6-29 00:02
跳转到0x64000001试试,有调试工具的话,调试一下就知道了

在没有搞好Jlink前,我用串口打印出了0x64000000的数据,和内核的二进制编码是一致的

使用特权

评论回复
Simon21ic| | 2013-6-29 12:44 | 显示全部楼层
bao19830224 发表于 2013-6-29 09:39
在没有搞好Jlink前,我用串口打印出了0x64000000的数据,和内核的二进制编码是一致的 ...

呵呵,一样是正常的
只是发现这个问题,明天如果你还没想明白的话,我再告诉你

使用特权

评论回复
hkcj| | 2013-6-29 17:47 | 显示全部楼层
帮楼主   顶一个   看看楼上是怎么回答的  

使用特权

评论回复
bao19830224|  楼主 | 2013-6-29 21:02 | 显示全部楼层
Simon21ic 发表于 2013-6-29 12:44
呵呵,一样是正常的
只是发现这个问题,明天如果你还没想明白的话,我再告诉你 ...

哇塞,Simon21ic兄还买了个关子。好吧,我在检测遍代码

使用特权

评论回复
thislife| | 2013-6-29 21:59 | 显示全部楼层
本帖最后由 thislife 于 2013-6-29 22:15 编辑

这个有啥好卖关子的,不就是LDR PC,thumb和ARM 没切换对么。自己再看看M3权威指南吧。
stm32+uclinux。。性能太差了,没看见有什么应用。

使用特权

评论回复
bao19830224|  楼主 | 2013-6-30 21:48 | 显示全部楼层
楼上兄弟是说进入main函数时应该用LDR PC吗?我明天试一下。
一开始就设置的thumb指令集,切换到ARM应该会报错吧。LDR Rx和LDR PC会涉及到指令切换吗?可能是我对指南理解错了

使用特权

评论回复
bao19830224|  楼主 | 2013-7-1 09:32 | 显示全部楼层
Simon21ic 发表于 2013-6-29 12:44
呵呵,一样是正常的
只是发现这个问题,明天如果你还没想明白的话,我再告诉你 ...

Simon21ic兄,你的答案是不是也和9#的弟兄一致。最后一句跳转,我换了几种写法,但是生成的汇编代码都是BLX Rx。这是不是就是症结所在呢?

使用特权

评论回复
bao19830224|  楼主 | 2013-7-1 14:01 | 显示全部楼层
thislife 发表于 2013-6-29 21:59
这个有啥好卖关子的,不就是LDR PC,thumb和ARM 没切换对么。自己再看看M3权威指南吧。
stm32+uclinux。。 ...

thislife兄能说的再详细些吗?我已经把代码最后的跳转重新写过了,直接用汇编写的LDR pc,0x64000000,但还是不能启动uclinux

使用特权

评论回复
bao19830224|  楼主 | 2013-7-1 17:37 | 显示全部楼层
Simon21ic 发表于 2013-6-29 12:44
呵呵,一样是正常的
只是发现这个问题,明天如果你还没想明白的话,我再告诉你 ...

Simon21ic兄,等着你的回复呢

使用特权

评论回复
Simon21ic| | 2013-7-1 23:53 | 显示全部楼层
bao19830224 发表于 2013-7-1 17:37
Simon21ic兄,等着你的回复呢

别人不是说了吗。。。。。
你试过跳转到0x64000001了吗?

使用特权

评论回复
bao19830224|  楼主 | 2013-7-2 08:54 | 显示全部楼层
Simon21ic 发表于 2013-7-1 23:53
别人不是说了吗。。。。。
你试过跳转到0x64000001了吗?

0x64000001我一早就试过了,但是还是启动不了

使用特权

评论回复
Simon21ic| | 2013-7-2 10:03 | 显示全部楼层
那你要调试一下,看看是在哪里出问题的

使用特权

评论回复
bao19830224|  楼主 | 2013-7-2 10:03 | 显示全部楼层
Simon21ic 发表于 2013-7-1 23:53
别人不是说了吗。。。。。
你试过跳转到0x64000001了吗?

Simon21ic兄,我跳转到0x64000041后启动了,但是运行到下面就卡住了
Linux version 2.6.26-uc0 (root@localhost.localdomain) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-163) ) #6 Fri Jun 14 11:56:42 CST 2013
CPU: ARMv7-M Processor [411fc231] revision 1 (ARMv?(11)M)
Machine: STM3210E-EVAL
SRAM Config: bank[0] @ 0x68000000 (size: 1024KB) - bank[1] @ 0x20000000 (size: 64KB).
Ignoring unrecognised tag 0x00000000
Built 1 zonelists in Zone order, mobility grouping off.  Total pages: 254
Kernel command line: noinitrd root=mtd1 ro rootfstype=jffs2 init=/linuxrc console=ttyS0
PID hash table entries: 16 (order: 4, 64 bytes)
console [ttyS0] enabled
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 1MB 0MB = 1MB total
Memory: 980KB available (436K code, 55K data, 8K init)

我对比了正常了启动信息,下两句应该是:
Mount-cache hash table entries: 512
JFFS2 version 2.2. ?? 2001-2006 Red Hat, Inc.

是不是我设置的参数有问题呢?还有能给讲讲为什么启动uclinux要切换到ARM指令呢?

使用特权

评论回复
Simon21ic| | 2013-7-2 10:09 | 显示全部楼层
bao19830224 发表于 2013-7-2 10:03
Simon21ic兄,我跳转到0x64000041后启动了,但是运行到下面就卡住了
Linux version 2.6.26-uc0 (root@loc ...

卡住?没有错误提示吗?
很奇怪这个地址:0x64000041
你的镜像里的汇编不是从0x64000000开始的吗?

使用特权

评论回复
bao19830224|  楼主 | 2013-7-2 10:28 | 显示全部楼层
Simon21ic 发表于 2013-7-2 10:09
卡住?没有错误提示吗?
很奇怪这个地址:0x64000041
你的镜像里的汇编不是从0x64000000开始的吗? ...

是不是它包含了一个64字节的头部。
正常启动后分区信息是这样的:
Creating 4 MTD partitions on "M29W128F NOR FLASH":
0x00000000-0x00100000 : "Kernel raw data"
0x00100000-0x00160000 : "rootfs"
0x00160000-0x00190000 : "rawdata"
0x00190000-0x001c0000 : "cramfs_partition"
STM官方手册的上的是这样分区的
0x64000000-0x6407BC0F  xipImage.bin
0x64100000-0x641537EB  rootfs.img.bin
最后生成了一个DFU文件烧进的Flash

要说错误信息的话,打印出一条“Ignoring unrecognised tag 0x00000000”,然后运行到Memory: 980KB available (436K code, 55K data, 8K init)就卡住了,光标不停的闪,但不向下运行

使用特权

评论回复
bao19830224|  楼主 | 2013-7-3 15:22 | 显示全部楼层
Simon21ic 发表于 2013-7-2 10:09
卡住?没有错误提示吗?
很奇怪这个地址:0x64000041
你的镜像里的汇编不是从0x64000000开始的吗? ...

Simon21ic兄,我这几天利用空闲时间调试了下,发现启动卡在内核的init/mian.c的calibrate_delay()函数,原因应该是由于我在bootloader中将中断关闭了(FAULTMASK置1),造成进不了SysTick中断,形成了死循环。但是我要是在bootloader不屏蔽中断的话,在跳转内核的时候就会进入硬Fault的中断,从而导致跳转失败。我想原因可能是我没有设置堆栈指针,但是我不知道应该设置成什么值。毕竟内核镜像文件的首地址并不是堆栈地址。我用_set_MSP()函数设置成0x68100000或者其他别的也都不成功。不知您有什么好的建议或者我那个地方搞错了?

使用特权

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

本版积分规则

3

主题

44

帖子

1

粉丝