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的值,

浙公网安备 33010602011771号