刚到手荔枝派没几天,已经跑起来裸机了,但是遇到很多诡异的现象,比如函数跳转异常之类的,甚至有的时候for循环都会出问题。
然后我就试着把pc指针通过串口打印出来了,发现pc指针居然在0x00000000范围,也就是手册上写的BROM区域。。
越来越懵了
串口发送十六进制是我自己写的(移植printf函数失败了),测试都是没问题的。因为选通DDR时钟的时候程序会莫名卡死,所以我现在没在DDR上运行,所以才遇到的不少问题。
__asm__ __volatile__("mov %0, pc" : "=r"(num));
//因为for循环和while都出问题了只能这么写了Orz。。。。
putc('0');
putc('x');
str = num / 0x10000000 % 0x10;
str += ((str < 10) ? 0x30 : 0x37);
putc(str);
str = num / 0x1000000 % 0x10;
str += ((str < 10) ? 0x30 : 0x37);
putc(str);
str = num / 0x100000 % 0x10;
str += ((str < 10) ? 0x30 : 0x37);
putc(str);
str = num / 0x10000 % 0x10;
str += ((str < 10) ? 0x30 : 0x37);
putc(str);
str = num / 0x1000 % 0x10;
str += ((str < 10) ? 0x30 : 0x37);
putc(str);
str = num / 0x100 % 0x10;
str += ((str < 10) ? 0x30 : 0x37);
putc(str);
str = num / 0x10 % 0x10;
str += ((str < 10) ? 0x30 : 0x37);
putc(str);
str = num / 0x1 % 0x10;
str += ((str < 10) ? 0x30 : 0x37);
putc(str);
putc('\r');
putc('\n');
为什么BROM要把代码拷到BROM区域上执行?这样不会覆盖掉BROM自己吗?我之前一直以为引导程序先会在SRAM区域0x10000上开始运行,链接脚本都是这么写的。。话说BROM不是ROM吗。。怎么当成RAM用了都。。全志这个芯片好魔性啊>A<
离线
可能是这样: BROM 拷贝 boot0 到 SRAM(0 - 32K ???), 然后通过黑魔法把指针指向 SRAM .
离线
用的什么工程跑的裸机
离线
BROM相同地址下存在一块SRAM,尺寸是32KB,可以用来跑SPL
还能这么套娃。。惊了
离线
用的什么工程跑的裸机
自己搭建的工程,信息头参考了一点达神的代码,目前还很乱
离线
正常操作,你看串口的寄存器时,很多寄存器都是同一个地址的,只不过分配置时哪些寄存器生效,工作时哪些寄存器生效。
串口那块之前写的时候确实有点晕,但没想到sram也被重映射了。。现在又有个新发现,栈指针还是得设置在sram地址范围才能正常工作,应该是读操作有重映射,但写操作没有
离线
擦,我找到其他问题之所在了。。
我发现SP指针根本不用也不能手动设置,一设置出栈入栈就会错误。。上电SP指针自动指向0x9FE4就暂时不用管了
可能是之前栈一直有问题,我那个辣鸡软件延迟函数需要把数设置的巨大才能正常延时
我之前也试过不去手动设置SP指针,但是发现灯会一直亮,所以就推断还是栈的问题,然而实际上是设置正确了但是我依然用的是巨大的延时数字,导致一直在延时函数里。。。
离线
真是什么都试了,万万没想到这栈指针还是个坑Orz
离线