|
自学移植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);//GPSR0 set 1 gpio 10
delay(1000);
}
}
static void delay(unsigned int loop)
{
unsigned int i,j;
for(i=0;i<loop;i++)
{
c=0;
for(j=0;j<10000;j++);
}
}
期待程序运行现象:
LED灯闪烁3次,就不再闪烁保持常亮或者常灭的状态。
程序实际运行现象:
第一次测试语句生效:LED灯持续闪烁不停止。不断电源就永远永远的闪烁下去。
自己的疑惑:
为什么会这样,程序逻辑没有看出什么问题。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|