- 论坛徽章:
- 0
|
一、问题描述:
我有一块cortex-m3内核的MCU板,参考网上一块硬件资源类似的板移植uCLinux操作系统,已经获得他们的
操作系统源码,移植好u-boot。u-boot支持网络与SDRAM,可通过网络启动uImage,但启动linux时没有打印消息。
跟踪后很久才发现原来控制台根本没有注册进内核。
于是我编写另一个UART驱动COM1.用它来跟踪内核启动过程。但UART的输出很奇怪。
例如,我在内核启动过程的某个函数中编写以下代码。
//在linux内核某处增加
...
{
char test_buf[100]={0};
int data = 1234;
sprintf(test_buf,"data=%d\n",data);
uart_puts(test_buf);
}
...
发现输出会乱码:data=23馾 //“23馾 ”是乱码
而且乱码很有规律,就是只在格式化才会乱码。即"data=%d\n" 中只有"%d"部分才有问题,"data="可以正常输出。
或者只要没有格式化字符,就能正常输出。
怀疑是SDRAM驱动有问题,因为我的板子与他们的板SDRAM是不一样的,要移植。于是又做了如下实验
//在linux内核某处增加
...
{
char test_buf[100]={0};
int data = 1234;
sprintf(test_buf,"data=%d\n",data);
if(strcmp(test_buf,"data=1234\n")==0)
{
uart_puts("Equal\n");//uart_puts是自己写的UART输出字符串函数。
}
else
{
uart_puts("Not Equal\n");
}
}
...
这下更神奇了,居然输出"Not Equal"。这下更怀疑问题可能出现在SDRAM驱动里。
但又实在想不通,SDRAM**问题。因为在u-boot代码里执行以下代码却可以正常输出"data=1234",而
linux启动过程中,也没有修改过SDRAM的配置。
//在u-boot中
...
{
char test_buf[100]={0};
int data = 1234;
sprintf(test_buf,"data=%d\n",data);
uart_puts(test_buf);
}
...
//
通过自己写的串口跟踪linux上的执行过程,发现内核能执行到start_kernel函数的最后,
start_kernel() =>
rest_init() =>
kernel_init() =>
init_post() =>
最终找不到console与init进程产生内核panic
如果SDRAM有问题的话,按理说不能启动到最后吧,因为中间涉及很多函数调用等操作内存的过程。
二、问题推测:
1. SDRAM驱动有BUG?(这个可能性较小,因为u-boot中已经能正常使用SDRAM)
2. linux-gcc 编译选项配置不对。导致内存的堆或者栈异常?
有没有人遇到这种情况? |
|