PXA270 移植U-B00T奇怪的问题请教,折腾了一天,还没头绪?
自学移植U-Boot,处理器是PXA270,参考的U-Boot源代码版本是 u-boot-1.1.2。目前根据网上搜集的资料,自己修改后程序能够跑到 U-Boot的第二阶段void start_armboot (void)函数里面,但程序运行就死在这个函数的见面几句。
编译环境:
1. Windows XP2 + VM6.5虚拟机 + Fedora
2. uboot编译器: 成都国嵌网站下载的uboot用编译工具。gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-
检测void start_armboot (void)函数运行情况的方法:
1. 点LED灯、灭LED灯来判断程序运行情况。
------------------------
观察步骤如下:
void start_armboot (void)
{
DECLARE_GLOBAL_DATA_PTR;
ulong temp_counter; //add by luoxiongjian
ulong size;
init_fnc_t **init_fnc_ptr;
char *s;
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
unsigned long addr;
#endif
led_flash(3); //第一次测试,这条语句是自己加的,是要LED灯闪烁3次。
while(1); //第一次测试,这条语句是自己加的,程序停在这里,
/* Pointer is writable since we allocated a register for it */
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); //0xa3080000-(0x00020000+0x00020000)-sizeof(gd_t)
/* compiler optimization barrier needed for GCC >= 3.4 */
__asm__ __volatile__("": : :"memory");
memset ((void*)gd, 0, sizeof (gd_t));
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));
memset (gd->bd, 0, sizeof (bd_t));
monitor_flash_len = _bss_start - _armboot_start;
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
{
if ((*init_fnc_ptr)() != 0)
{
hang ();
}
}
/************下面几个函数是我自己在board.c里面增加的,用来驱动LED*************/
static void led_flash(unsigned int count)
{
while(count--)
{
( *(volatile unsigned long *)0x40e0000c) |= (0x01<<10);//GPDR0
( *(volatile unsigned long *)0x40e00024) |= (0x01<<10);//GPCR0 clear 0 gpio10
delay(1000);
( *(volatile unsigned long *)0x40e00018) |= (0x01<<10);//GPSR0set 1 gpio 10
delay(1000);
}
}
static void delay(unsigned int loop)
{
unsignedint i,j;
for(i=0;i<loop;i++)
{
c=0;
for(j=0;j<10000;j++);
}
}
期待程序运行现象:
LED灯闪烁3次,就不再闪烁保持常亮或者常灭的状态。
程序实际运行现象:
第一次测试语句生效:LED灯持续闪烁不停止。不断电源就永远永远的闪烁下去。
自己的疑惑:
为什么会这样,程序逻辑没有看出什么问题。 led_flash(3);
while(1);
是不是看门狗复位了。然后从头再来,感觉上好像是一直在闪灯呢? 多谢指点。
我在初始化过程中,没有使能看门狗。我在start.s文件中屏蔽了所有中断!
更奇怪的现象出现:
1. 上面的程序不变,重新make以后,形成的uboot.bin,重新烧录。 LED灯不闪了,处于常亮状态,但不是正常点亮的亮度,这个亮度暗很多,但是又不是灭的状态。
----------------------
1.以上程序,重新编译2次,重新下载两次,现象依旧。
2.在start.s文件中,跳入start_armboot( )之前,用汇编语句,控制LED灯功能一切正常。要它亮,它就亮,要它灭,它就灭。
感觉进了start_armboot( )函数就诡异了。 编译不要加优化,-g -O0编译
如果没有JTAG,可以先用QEMU来调试u-boot,QEMU支持PXA270的 多谢ffxz大侠指点。
今天又抽时间折腾了1个小时。 下载了U-Boot-1.3.3版本源码,移植了,编译下载。现象依旧!
------------------------------
回复ffxz大侠:
编译不要加优化,-g -O0编译
我对GCC语法不甚了解。不知道怎么设置优化选项。我参照网上方法如下处理:
1.在终端shell窗口设置了如下环境变量:export CFLAGS="-o0 -g -march=armv5"&&CXXFLAGS=$CFLAGS
2. make distclean
3. make xxx_config
4. make
最后得到的Bin文件,烧录下载,现象依旧。
今天试了几次,到start_armboot( )函数里面一点反应都没有,而在start.s里面的LED控制都正常,而昨天可以跑到start_armboot(),只是LED一直闪烁。
疑问如下:
1. 请教各位, 编译优化选项主要在哪个Makefile里面修改?
2. 有没有可能,程序根本没有跑到start_armboot( )函数里面,在执行完start.s里面的汇编语句,就飞了?
3. TEXT_BASE 参数的值没有非常严格的限制吧?只要SDRAM下端地址留足了空间给其他程序
页:
[1]