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介绍

官网地址:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-smart/rt-smart-quickstart/rt-smart-quickstart
主要的特点:

  • 完整的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账号。
image

rt-smart sdk下载地址:

由于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

  • 以下命令大小写忽略,数值参数必须为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的值,

posted @ 2022-07-25 23:21  Yanye  阅读(737)  评论(0编辑  收藏  举报