F1C100S rt-smart 环境搭建
这里是为全志F1C100S(ARM926EJS)移植rt-smart的过程记录,由于只有空闲时间更新,因此进度不能保证。
更新: 2022-08-08 已经成功移植,但由于用户态依赖库librtthread.a不开源(只提供arm v7-a版),因此arm926目前是没希望上rt-smart了;除非去逆向librtthread.a,有空再搞吧。
rtthread论坛关于librtthread.a是否开源的提问:https://club.rt-thread.org/ask/question/4a48c08738c8e835.html
Github地址:
https://github.com/Yanye0xFF/rt-smart-f1c100s
rt-smart介绍
-
完整的C++11/14支持,支持STL标准库编程,rtthread标准版中的c++只能算是
c with class
,差距非常明显。
-
用户态和内核态隔离,应用程序发生异常不会影响到操作系统,rtthread标准版也支持动态模块加载执行,但无法实现进程的概念;用户态可用低3G地址空间,内核态占据高1G地址空间,这和32位linux系统配置一致。
-
MMU配合SLAB伙伴分配器进行页面管理,内存分配不会页间碎片,遗憾的是没有实现页面转储以及zram等内存压缩。
-
移植难度相对较低,但需要了解一些rt-smart的底层原理,相比之下uboot + linux底层细节是相当的复杂。
软件准备
update 2022-08-14
在Gitee找到了ART-Pi-smart的仓库,代码比github上的新很多,可以去这里:
https://gitee.com/rtthread/ART-Pi-smart.git
直接使用git工具克隆master分支即可,下载release版的话需要注册gitee账号。
rt-smart sdk下载地址:
- http://117.143.63.254:9012/www/rt-smart/
- https://github.com/RT-Thread/rt-thread/tree/rt-smart
- https://github.com/RT-Thread/rt-thread/
由于ftp站点上的内容更新较慢,建议同时在Github下载一份最新的rt-smart分支和主线分支源码,移植时源码目录结构/工具配置参考ftp站点整理好的那份,但优先使用Github rt-smart分支和主线分支下的源码。
我下载的是ftp页上的rt-smart-20210706.zip
,包含了rt-smart源码以及qemu-vexpress-a9/树莓派4B/imx6ull的移植示例。
由于rt-smart用户态使用的c++库是musleabi c++运行时库修改而来,因此工具链要使用这里的版本,不过当前工作是芯片启动早期到内核态启动前的内容,所以用arm-gcc做验证也是可以的。
工具链下载完成后解压到/opt
目录
然后解压rt-smart压缩包,参考smart-env.sh
的内容,根据实际工具链存放的路径配置环境变量(重启系统生效)。
这里展示我的配置,工具链放在了/opt
目录
最后测试下arm-linux-musleabi-gcc --version
,能正常输出就表明工具链配置完成了。
集成开发环境使用Eclipse + CDT插件,构建工具使用rtthread默认的scons。
这里推荐直接下载Eclipse IDE for Embedded C/C++ Developers
版本,下载页面需要选择国内镜像源。
https://www.eclipse.org/downloads/packages/
硬件准备
由于目前rt-smart没有提供ARM9的移植示例,盲调难度较大,启动的早期阶段需要挂调试器查看运行情况,建议至少有个Jlink或者DAPlink。
JTAG调试口与SDC0共用的,如果使用的开发板PF0~PF5接了eMMC,那就只能换个开发板调试了。
引脚 | 复用功能 | JTAG功能 |
---|---|---|
PF0 | DBG_MS | TMS |
PF1 | DBG_DI | TDI |
PF3 | DBG_DO | TDO |
PF5 | DBG_CK | TCK |
这里以荔枝派Nano作为调试的目标板,它的SDC0接了SD卡槽,做一个转接板可以将调试线引出。
其他内容
ARM926技术参考手册《ARM926EJ-S Technical Reference Manual》,重点阅读CP15协处理器,一级页表Section descriptor
和二级页表Coarse page table descriptor
部分。
下载地址:https://developer.arm.com/documentation/ddi0198/e/
由于rt-smart官方只提供了ARM Cortex-a(armv7指令集)内核处理器的移植示例,也需要参考《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》
主要关注的是Cortex-a和ARM926之间CP15协处理器操作,页表结构,指令集的差异。
下载地址:https://developer.arm.com/documentation/ddi0406/cd/?lang=en
常用的J-Link Commander命令:
-
以下命令大小写忽略,数值参数必须为16进制,0x前缀可以不加。
-
r
复位芯片,如果jlink复位不成功需要手动将芯片RESET线拉低进行复位。 -
halt
暂停CPU。 -
SetPC <Addr>
设置PC寄存器的值,下次取指令将在处取。 -
s
单步执行,输入一次,执行一次。 -
g
正常执行,可以在断点处停止。 -
regs
查看各个模式下的寄存器
值。 -
SetBP <addr> [A/T] [S/H]
设置硬件断点,A
表示ARM指令T
表示Thumb指令,S
表示软件断点H
表示硬件断点;示例SetBP C0000000 A H
,表示在C0000000处下了一个ARM指令的硬件断点。 -
ClrBP <BP_Handle>
<BP_Handle>使用SetBP返回的一个编号,第一个断点返回0,第二个返回1,依次类推;ClrBP 0
清除编号为0的断点。 -
mem <Addr>, <NumBytes>
读存储器值,此指令是交给目标板CPU执行的,因此会被目标板MMU影响。 -
savebin <filename>, <addr>, <NumBytes>
将存储器导出到文件,同样会受目标板MMU影响;示例 savebin D:\dump.bin 0x0 0x1000
,表示从0地址转储4KB内容到D盘的dump.bin文件。 -
rce <Op1>, <CRn>, <CRm>, <Op2>
查看CP15协处理器的某个寄存器,对比ARM指令MRC{cond} p15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
,其对应关系如下:<Op1> = <Opcode_1>,<CRn> = <CRn>,<CRm> = <CRm>,<Op2> = <Opcode_2>
;示例:rce 0 6 0 0
,表示查看Fault Address Register c6
的值,