您尚未登录。

楼主 #1 2020-03-15 16:52:52

ntmusic
会员
注册时间: 2020-02-24
已发帖子: 43
积分: 33

F1C100s在使用RThread时如何不经过RT bootloader直接运行app?

请各位大神帮忙解惑,我刚接触这个芯片不久,用的是荔枝派Nano,在使用RTThread开发时,
要先烧录RT的bootloader(rtboot-1.0.3.bin),然后用官方ENV工具编译生成的bin再用
rt_ota_packaging_tool工具打包成rbl文件,然后再让F1C100s重启进入bootloader模式,
用PersimmonModConfigTool恢复App的方式更新app。。。过程繁琐不说,由于启动时要经过RT
的bootloader过程,就算把bootloader配置成0延时,最后进APP也差不多经过1秒,重点是,
在进bootloader阶段时LCD的背光总要闪一下,强迫症让我非常难以接受,就想干掉这个
bootloader的过程,上电后直接跑应用程序不是更好吗?

我的开发都是从RTThread官网上下载的ENV工具和RTThread源码,源码BSP中包含有allwinner_tina,
因此就都在此基础上进行开发,编译后能正常生成bin文件,但这个bin文件不能直接烧录,还得打包成rbl文件,
再用恢复工具恢复,这样我压根就不知道这个bin烧录到了Flash具体什么位置。。因我是新手对于F1C100s的
启动过程一无所知,我就希望这个生成的bin能直接烧录到Flash 0地址,然后上电就启动不就最好?

后来在网上看到了很多大神裸奔F1C100s的帖子,还有Keil下的工程,于是我就想自己来摸索一下。
既然RTThread生成了bin了,那么应该只是前面引导的问题,只要把引导加到这个bin文件上,
应该可以直接上电就跑起来吧?于是我重点就移植启动文件start_gcc.S以及链接文件link.lds,
参考的是 https://whycan.cn/t_3645.html 这位大神提供的Keil工程文件中的启动代码和分散加载文件,
一开始只是把Keil工程的启动代码中的Bootloader头信息加到了我的启动代码中,编译后,
用mksunxi.exe工具修改了bin文件校验信息,然后满怀希望的把这个bin文件烧录到Flash地址0的区域(感谢迪卡大神的DKTool),

然而板子没有任何反应,但应该是识别到了Flash中的启动信息,因为没有进FEL了。于是我再参考Keil工程,
一步步把Keil的启动文件一个个的加到我的启动代码(这里有一点不清楚的是Sys-CopySelf之类的有什么用途,
难道不是由BOOTROM完成的代码拷贝到DDR吗。。),但加完了都不启动,啥信息都不输出。。

附上我修改后的启动代码和链接文件,请大神帮忙看看,为啥不能直接启动运行程序,
难道RTThread源码包编译后的bin程序,一定得由RTBoot引导才能运行吗?另外我还有疑问,
手册上写DDR1的地址是从0x80000000开始的,然后RTThread的bootloader启动APP时的
信息是Start app from 0x80000000,那我就很郁闷了,假如这个bootloader是完成了把app
程序加载到DDR的0x80000000区域,那么这个bootloader程序,是在哪个区域运行的???
自己覆盖了自己??还有这个bootloader是由BOOTROM拷贝到DDR中运行的吧?
还是直接从Flash中运行的??

希望有大神帮忙答疑解惑,已经困扰2天了,谢谢!

start+link.rar

离线

楼主 #4 2020-03-16 17:33:18

ntmusic
会员
注册时间: 2020-02-24
已发帖子: 43
积分: 33

Re: F1C100s在使用RThread时如何不经过RT bootloader直接运行app?

感谢楼上大神的解惑,大致搞明白了BROM,SPL等的关系
现在我换了一种方式,由于RTThread的bootloader启动不可控,我就想写一个boot来代替RTT的bootloader,再分析Keil裸机工程,其实也就是一个Bootloader+App的结合体,于是正好借用其Bootloader部分,于是我做了如下修改:
1.修改sys-copyself.c中拷贝数据的代码为从地址0x33000开始加载1024KB数据到地址0x80000000中【RTT Bootloader默认app存放地址为0x33000】
sys_spi_flash_read(0x33000, 0x80000000, 1024*1024);
2.修改启动代码,把拷贝数据结束后跳转到_main的直接改为跳转到0x80000000中执行
原来的:
    /* Call _main */
    ldr r1, =_main
    mov pc, r1
_main:
    mov r0, #1;
    mov r1, #0;
    bl boot_main
    b _main

修改后:
    /* Call _app */
    mov r0, #1;
    mov r1, #0;
    ldr pc, =0x80000000   
    b .
3.编译这个keil工程并烧录到地址0区域
4.在ENV工具下编译RTThread工程,用DKTool将生成的bin直接烧录到0x33000区域
上电启动后,RTThread可以被加载运行,打印出了version信息,但却没有正常进入调度。整个运行过程打印信息如下:

Boot to SPI mode

\ | /
- RT -     Thread Operating System
/ | \     4.0.2 build Mar 13 2020
2006 - 2019 Copyright by rt-thread team
程序到这里就停止了,经过排查,发现RTT在启动调度前都是正常运行的,启动调度即调用rt_system_scheduler_start()后,调度没有正常起来。怀疑是中断向量不正确导致的没能正常进入上下文切换,有没有大神可以帮忙解惑一下,是boot过程直接跳转地址带来的问题,还是RTT的app必须还是得由RTT自己的bootloader来加载才行?还是什么原因导致调度不正常?

最近编辑记录 ntmusic (2020-03-16 17:34:11)

离线

楼主 #5 2020-03-16 17:47:31

ntmusic
会员
注册时间: 2020-02-24
已发帖子: 43
积分: 33

Re: F1C100s在使用RThread时如何不经过RT bootloader直接运行app?

问题解决了,把Keil工程中启动代码中的irq和fiq代码删除就可以正常启动RTThread的app了。。。。虽然不知道为啥,但确实是可以了

离线

楼主 #7 2020-03-17 17:28:27

ntmusic
会员
注册时间: 2020-02-24
已发帖子: 43
积分: 33

Re: F1C100s在使用RThread时如何不经过RT bootloader直接运行app?

staunchheart 说:

这个问题我也遇到了。。我的工程用GCC编译没问题,用MDK编译后rt_system_scheduler_start()卡了。
一直没有找到原因,这段时间在搞声音驱动,所以一直没管这事。你这个贴子对非常有意义,希望与你一起研究。
希望可以跟你加QQ。

https://gitee.com/zhangheyang/f1c100s_rt-thread
然后从RTT中找到对应的start_rvds.S  context_rvds.S
修改几处代码后就可以
set RTT_CC=keil
set RTT_EXEC_PATH=D:/develop/Hardware/Keil_v5
scons

还是想把boot跟RTT整合到一起,今天抽空再次把bootloader程序和RTT工程链接到一起,是可以正常启动了,但运行不正确,一旦启动调度就出错
Boot to SPI mode

\ | /
- RT -     Thread Operating System
/ | \     4.0.2 build Mar 13 2020
2006 - 2019 Copyright by rt-thread team
Execption:
r00:0x808007e4 r01:0x00000000 r02:0x00000024 r03:0x00000080
r04:0x00000000 r05:0x00000000 r06:0x80800958 r07:0xffffffff
r08:0x0000005a r09:0x00000024 r10:0x80800904
fp :0x00000000 ip :0x00000000
sp :0x800761c4 lr :0x80000940 pc :0x80000940
cpsr:0x20000013
undefined instruction
thread - main stack:
thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
估计是堆栈之类的没搞对,还得再仔细琢磨

离线

楼主 #10 2020-03-18 17:22:58

ntmusic
会员
注册时间: 2020-02-24
已发帖子: 43
积分: 33

Re: F1C100s在使用RThread时如何不经过RT bootloader直接运行app?

staunchheart 说:

rt_system_scheduler_start()这个卡死,你具体是改了哪个地方呢?

我现在是先用keil工程生成一个bootloader.bin,还没把boot+app一起编译。之前这样做也会卡在rt_system_scheduler_start(),后来我把bootloader中的irq和fiq代码删掉就可以了。现在吧boot跟app一起编译时,又出现卡在rt_system_scheduler_start()的情况了

离线

楼主 #12 2020-03-19 11:54:00

ntmusic
会员
注册时间: 2020-02-24
已发帖子: 43
积分: 33

Re: F1C100s在使用RThread时如何不经过RT bootloader直接运行app?

发现自己走了好多弯路,其实裸跑的Keil工程的启动文件可以直接嫁接到RTT的启动文件中,之前一直没成功是想太多了,现把我能用的代码放上,供参考。
开发环境:windows
开发工具:RT ENV
RT版本: 4.0.2
测试工程基于RT源码中BSP中的allwinner_tina系列,将附件解压至BSP目录下,scons一下即可完成编译。下载程序时,让F1C100s进入FEL模式,运行批处理flashtospi.bat即可完成程序下载。
如果要用在别的工程中,只需进行如下操作:(均指在ENV开发工具和RT源码结构中)
1.拷贝bootloader文件夹、tools文件夹、flashtospi.bat文件到对应工程目录下
2.用示例代码的link.lds链接文件替换掉工程的链接文件
3.用示例代码的libcpu\start_gcc.S启动文件替换掉工程的启动文件
进行如上操作后即可实现秒启动APP了(当然也不是秒启动,FEL过程还是费了大概0.几秒的时间,但相对用RT boot来说就快多了)
allwinner_tina_autoboot.rar

最近编辑记录 ntmusic (2020-03-19 11:55:20)

离线

页脚

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

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