请各位大神帮忙解惑,我刚接触这个芯片不久,用的是荔枝派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天了,谢谢!
离线
单就RTT来说,可以参考
https://whycan.cn/t_3538.html
这个贴子,这个贴子里有boot和bin这些,可以直接GIT代码编译,用的是GCC。
至于将boot与bin合在一起应该也是可以的,我没有搞过.
离线
不是bootrom拷贝到ddr
BootRom会把SRAM大小的代码从启动介质复制到SRAM。然后跳到sram运行
所以需要boot代码把ddr初始化,复制app的代码到ddr,跳到ddr运行
xboot启动就是一体的,可以参考xboot做法,固定把一些启动相关的代码通过link script固定放在spi前面,然后有判断运行时候的代码是否和link地址一致,这样去做到boot和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)
离线
问题解决了,把Keil工程中启动代码中的irq和fiq代码删除就可以正常启动RTThread的app了。。。。虽然不知道为啥,但确实是可以了
离线
问题解决了,把Keil工程中启动代码中的irq和fiq代码删除就可以正常启动RTThread的app了。。。。虽然不知道为啥,但确实是可以了
这个问题我也遇到了。。我的工程用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
最近编辑记录 staunchheart (2020-03-17 08:18:11)
离线
这个问题我也遇到了。。我的工程用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
-------- --- ------- ---------- ---------- ------ ---------- ---
估计是堆栈之类的没搞对,还得再仔细琢磨
离线
还是想把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
-------- --- ------- ---------- ---------- ------ ---------- ---
估计是堆栈之类的没搞对,还得再仔细琢磨
rt_system_scheduler_start()这个卡死,你具体是改了哪个地方呢?
离线
传一下源码看看
离线
rt_system_scheduler_start()这个卡死,你具体是改了哪个地方呢?
我现在是先用keil工程生成一个bootloader.bin,还没把boot+app一起编译。之前这样做也会卡在rt_system_scheduler_start(),后来我把bootloader中的irq和fiq代码删掉就可以了。现在吧boot跟app一起编译时,又出现卡在rt_system_scheduler_start()的情况了
离线
我现在是先用keil工程生成一个bootloader.bin,还没把boot+app一起编译。之前这样做也会卡在rt_system_scheduler_start(),后来我把bootloader中的irq和fiq代码删掉就可以了。现在吧boot跟app一起编译时,又出现卡在rt_system_scheduler_start()的情况了
好的,我照你的说法搞一下。。
我用GCC编译都OK,用MDK就会卡在这里,当然我的boot是独立的。
离线
发现自己走了好多弯路,其实裸跑的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)
离线
感谢楼主填坑,下载看看
离线
这个不错,试试效果
离线
楼主很有钻研精神呀,厉害
离线
正在研究RTT,下载看看
离线
参考一下。似乎不好入门啊。而且还要有有意义的回复,我都不会怎么有意义啊
离线
发现自己走了好多弯路,其实裸跑的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
大佬,开机好多错误提示,这是什么意思?
msh />[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 8 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 5 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
离线
你都跑KEIL了,不可以仿真一下吗?
离线
学习中,想用F1C200S做车牌识别,是否可行
离线
感谢楼主分享,正是我想学习的
离线
哇 发现好多大佬, 正想入门F1C100s 网上都没资料 幸好发现这个都是有这个论坛.
离线
我好想也碰见了这样的错误
你的flash是什么型号,我的是xt25f128b
大佬,开机好多错误提示,这是什么意思?
msh />[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 8 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 5 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
离线
我好想也碰见了这样的错误
你的flash是什么型号,我的是xt25f128b
把SDIO驱动关了应该就没有了
离线
发现好多大佬, 正想入门F1C100s,网上都没资料,跟着学习
离线
请问楼主按最后这样三缓冲操作,确实消除了图形边缘闪烁和保证刷新率稳定60fps吗?
离线
大佬,开机好多错误提示,这是什么意思?
msh />[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 8 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 5 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
离线
发现自己走了好多弯路,其实裸跑的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
楼主辛苦,这代码很有参考价值,谢谢。不过这套代码只支持gcc对吧,我用keil的时候说Please make sure your toolchains is GNU GCC!。
离线
感谢楼主,我也是玩smt32长大的
离线
看了半天 还是没有入门 mksunxi这个工具怎么用啊?
离线
RTT的BL启动太慢了
离线
@ntmusic
加载到内存本就要时间吧
离线
@ntmusic
scons编译竟然没有通过
<command-line>:0:0: note: this is the location of the previous definition
AS build\libcpu\start_gcc.o
CC build\libcpu\trap.o
In file included from F:\360MoveData\Users\Administrator\Desktop\F1C100S\rt-thread-master\rt-thread-master\include/rtthread.h:25:0,
from libcpu\trap.c:25:
./rtconfig.h:117:0: warning: "RT_USING_LIBC" redefined
#define RT_USING_LIBC
^
<command-line>:0:0: note: this is the location of the previous definition
LINK rtthread.elf
build\libcpu\trap.o: In function `rt_hw_trap_udef':
trap.c:(.text.rt_hw_trap_udef+0x44): undefined reference to `list_thread'
build\libcpu\trap.o: In function `rt_hw_trap_pabt':
trap.c:(.text.rt_hw_trap_pabt+0x48): undefined reference to `list_thread'
build\libcpu\trap.o: In function `rt_hw_trap_dabt':
trap.c:(.text.rt_hw_trap_dabt+0x48): undefined reference to `list_thread'
collect2.exe: error: ld returned 1 exit status
scons: *** [rtthread.elf] Error 1
scons: building terminated because of errors.
离线
感谢 ntmusic 的补坑,我刚把mangopi的NAND Flash 下载的坑填了。刚好我也准备用RTT搞个项目,RTT启动的问题正好用到ntmusic 补的坑。
离线
我想把复制到DRAM之前的代码放到FAT文件系统中,还没想好要怎么做,这个拿来参考一下
离线
我也是STM32来的,200s的启动机制还没搞明白。
离线
看一脸懵,gitee上面的过程也说得半懂不懂,希望能出一贴从linux安装后跑起来的
还是说因为我不太熟悉scons造成的呢,求大佬指教
离线
RTT把F1C100s当大单片机测试中,感觉这个帖子应该是想要的,感谢大佬前面开路
离线
如果裸奔的话,要操作U盘文件,该如何实现?
离线
使用rtt研究几天了,刚把rtt运行起来,使用rtt的引导,每次更新app,确实比较麻烦,楼主这个方法非常好
离线
开机提示mmc错误的信息的,在 rtconfig.h中把SDIO失能掉即可。
//#define TINA_USING_SDIO0
离线
需要这个我这个一直卡在这里,没有打印。我以为是芯片问题。我研究研究
离线