Start.S文件调试到如下红色标注的语句时出现错误
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_cp15
bl cpu_init_crit
#endif
bl _main
发现是spl.c中void board_init_r(gd_t *dummy1, ulong dummy2)以及void __weak board_init_f(ulong dummy)函数报错,且发现boot_device的参数值为88,不知道这部分是由于什么原因出现错误,需要修改什么地方?我硬件设置的是由UART启动,谢谢
Yalan Han:
boot_device的值大部分情况下是unknown,在运行到spl.c文件的board_init_r()函数如下内容时:
switch (boot_device) {#ifdef CONFIG_SPL_RAM_DEVICE case BOOT_DEVICE_RAM: spl_ram_load_image(); break;#endif#ifdef CONFIG_SPL_MMC_SUPPORT case BOOT_DEVICE_MMC1: case BOOT_DEVICE_MMC2: case BOOT_DEVICE_MMC2_2: spl_mmc_load_image(); break;#endif#ifdef CONFIG_SPL_NAND_SUPPORT case BOOT_DEVICE_NAND: spl_nand_load_image(); break;#endif#ifdef CONFIG_SPL_ONENAND_SUPPORT case BOOT_DEVICE_ONENAND: spl_onenand_load_image(); break;#endif#ifdef CONFIG_SPL_NOR_SUPPORT case BOOT_DEVICE_NOR: spl_nor_load_image(); break;#endif#ifdef CONFIG_SPL_YMODEM_SUPPORT case BOOT_DEVICE_UART: spl_ymodem_load_image(); break;#endif#ifdef CONFIG_SPL_SPI_SUPPORT case BOOT_DEVICE_SPI: spl_spi_load_image(); break;#endif#ifdef CONFIG_SPL_ETH_SUPPORT case BOOT_DEVICE_CPGMAC:#ifdef CONFIG_SPL_ETH_DEVICE spl_net_load_image(CONFIG_SPL_ETH_DEVICE);#else spl_net_load_image(NULL);#endif break;#endif#ifdef CONFIG_SPL_USBETH_SUPPORT case BOOT_DEVICE_USBETH: spl_net_load_image("usb_ether"); break;#endif#ifdef CONFIG_SPL_USB_SUPPORT case BOOT_DEVICE_USB: spl_usb_load_image(); break;#endif default: debug("SPL: Un-supported Boot Device\n"); hang(); }
出错,运行到红色部分
Yalan Han:
没有人遇到类似问题或知道怎么解决么?请求帮助啊
Steven Liu1:
这块很少有出现问题,你有修改过这里的代码吗?
能否描述下问题的前因后果?还有你debug的方式&参考?
Yalan Han:
回复 Steven Liu1:
您好,谢谢您的帮助!我硬件设置的是UART0启动方式,但是调试的时候没有由UART口连接PC机,直接用的下载器连接PC机,用CCS调试SPL,是用CCS的tool->load memory将spl.bin文件load到ARM。您的意思是不能用CCS把SPL给down进去么?请问CCS调试的时候,如何经UART口将SPL down进芯片呢?是不是连接UART口至计算机,同样是选择CCS的too->load memory就可以通过UART口将SPLdown进去了?谢谢啦
Yalan Han:
回复 Steven Liu1:
连接UART接口至计算机,CCS调试SPL,程序还是用CCS->load memory下载,按步调试,程序运行到board_init_f函数的memset(__bss_start, 0, __bss_end – __bss_start);部分就一直进入死循环,
if ( ((ulong)s & (sizeof(*sl) – 1)) == 0) { for (i = 0; i < sizeof(*sl); i++) { cl <<= 8; cl |= c & 0xff; }
运行上面这部分时,count为210996,*sl为*sl unsigned long 1342177280 0x80A00000,cl为0,c为0,循环执行for和cl |= c & 0xff;不执行cl <<= 8;循环结束后,执行
while (count >= sizeof(*sl)) { *sl++ = cl;
循环执行以上两条语句,且count和*sl的值均为Error: identifier not found: count(或 Error: identifier not found: sl at *(sl)),并在此进入死循环,请您帮忙解决一下,是什么原因,谢谢啦