您尚未登录。

楼主 #1 2020-08-05 17:16:15

f_Endman
会员
注册时间: 2020-04-16
已发帖子: 55
积分: 137

我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

刚到手荔枝派没几天,已经跑起来裸机了,但是遇到很多诡异的现象,比如函数跳转异常之类的,甚至有的时候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');

12 bbcode
13 bbcode

为什么BROM要把代码拷到BROM区域上执行?这样不会覆盖掉BROM自己吗?我之前一直以为引导程序先会在SRAM区域0x10000上开始运行,链接脚本都是这么写的。。话说BROM不是ROM吗。。怎么当成RAM用了都。。全志这个芯片好魔性啊>A<

离线

#2 2020-08-05 17:40:33

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

可能是这样: BROM 拷贝 boot0 到 SRAM(0 - 32K ???), 然后通过黑魔法把指针指向 SRAM .

离线

#3 2020-08-05 22:34:12

微凉VeiLiang
会员
所在地: 深圳
注册时间: 2018-10-28
已发帖子: 595
积分: 525
个人网站

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

用的什么工程跑的裸机

离线

#4 2020-08-05 22:39:18

LinjieGuo
Moderator
注册时间: 2019-07-24
已发帖子: 565
积分: 570
个人网站

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

f_Endman 说:

为什么BROM要把代码拷到BROM区域上执行?这样不会覆盖掉BROM自己吗?我之前一直以为引导程序先会在SRAM区域0x10000上开始运行,链接脚本都是这么写的。。话说BROM不是ROM吗。。怎么当成RAM用了都。。全志这个芯片好魔性啊>A<

BROM相同地址下存在一块SRAM,尺寸是32KB,可以用来跑SPL

离线

楼主 #5 2020-08-06 00:27:46

f_Endman
会员
注册时间: 2020-04-16
已发帖子: 55
积分: 137

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

LinjieGuo 说:

BROM相同地址下存在一块SRAM,尺寸是32KB,可以用来跑SPL

还能这么套娃。。惊了 yikes

离线

楼主 #6 2020-08-06 00:31:51

f_Endman
会员
注册时间: 2020-04-16
已发帖子: 55
积分: 137

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

微凉VeiLiang 说:

用的什么工程跑的裸机

自己搭建的工程,信息头参考了一点达神的代码,目前还很乱

离线

#7 2020-08-06 15:35:30

LinjieGuo
Moderator
注册时间: 2019-07-24
已发帖子: 565
积分: 570
个人网站

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

f_Endman 说:

还能这么套娃。。惊了 yikes

正常操作,你看串口的寄存器时,很多寄存器都是同一个地址的,只不过分配置时哪些寄存器生效,工作时哪些寄存器生效。

离线

楼主 #8 2020-08-06 15:45:02

f_Endman
会员
注册时间: 2020-04-16
已发帖子: 55
积分: 137

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

LinjieGuo 说:

正常操作,你看串口的寄存器时,很多寄存器都是同一个地址的,只不过分配置时哪些寄存器生效,工作时哪些寄存器生效。

串口那块之前写的时候确实有点晕,但没想到sram也被重映射了。。现在又有个新发现,栈指针还是得设置在sram地址范围才能正常工作,应该是读操作有重映射,但写操作没有

离线

楼主 #9 2020-08-06 20:14:38

f_Endman
会员
注册时间: 2020-04-16
已发帖子: 55
积分: 137

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

擦,我找到其他问题之所在了。。
我发现SP指针根本不用也不能手动设置,一设置出栈入栈就会错误。。上电SP指针自动指向0x9FE4就暂时不用管了
可能是之前栈一直有问题,我那个辣鸡软件延迟函数需要把数设置的巨大才能正常延时
我之前也试过不去手动设置SP指针,但是发现灯会一直亮,所以就推断还是栈的问题,然而实际上是设置正确了但是我依然用的是巨大的延时数字,导致一直在延时函数里。。。

离线

楼主 #10 2020-08-06 20:27:17

f_Endman
会员
注册时间: 2020-04-16
已发帖子: 55
积分: 137

Re: 我开始晕了。。跑裸机时F1C100s的BROM怎么把程序拷到0x00000000上运行了。。

真是什么都试了,万万没想到这栈指针还是个坑Orz

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn