写点什么

OpenHarmony LiteOS C-SKY 指令集移植指南

  • 2021 年 11 月 10 日
  • 本文字数:3860 字

    阅读完需:约 13 分钟

摘要:本文介绍在 OpenHarmony 社区 LiteOS-M 项目中新增 C-SKY 指令集的开发流程,以及适配相应 qemu 工程的方法和步骤,供 LiteOS 内核相关开发者学习交流。

 

本文分享自华为云社区《OpenHarmonyLiteOS指令集移植指南(C-SKY)》,作者: Lionlace。

 

C-SKY 指令集体系结构(ISA)是指第二代独立的指令集体系结构 CK-Core 系列知识产权指令集体系结构。CSKY ISA 具有高性能、高代码密度、低功耗和可扩展性等特点。


SmartL_E802 采用 C-SKY V2 自主指令架构的 E802 处理器,是平头哥半导体有限公司自主研发的低功耗、低成本嵌入式 CPU 核。其中,SmartL 平台是用于 E801/E802/E803S/E804/E805/E902/E906/E907 集成和调试仿真的综合演示平台。


本文介绍在 OpenHarmony 社区 LiteOS-M 项目中新增 C-SKY 指令集的开发流程,以及适配相应 qemu 工程的方法和步骤,供 LiteOS 内核相关开发者学习交流。

环境搭建


SmartL_E802 需要使用官方提供的 csky 编译器和 qemu 工程,以下介绍安装步骤。

编译工具链安装


  • 获取 csky-elfabiv2 编译器


$ mkdir csky_toolchain && cd csky_toolchain$ wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource/1356021/1619529111421/csky-elfabiv2-tools-x86_64-minilibc-20210423.tar.gz$ tar -xf csky-elfabiv2-tools-x86_64-minilibc-20210423.tar.gz
复制代码


  • 将编译工具链新增到环境变量

打开~/.bashrc 文件


$ vim ~/.bashrc
复制代码


在末尾加入如下命令行并保存


export PATH=$PATH:用户自定义路径/csky_toolchain/bin
复制代码


使环境变量生效


$ source ~/.bashrc
复制代码

qemu 安装


  • 获取 qemu 软件


$ mkdir csky_qemu && cd csky_qemu$ wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource/1356021/1612269502091/csky-qemu-x86_64-Ubuntu-16.04-20210202-1445.tar.gz$ tar -xf csky-qemu-x86_64-Ubuntu-16.04-20210202-1445.tar.gz
复制代码


  • 将 qemu 加入环境变量(user_qemu_xxx_path 修改为自己的安装路径)

打开~/.bashrc 文件


$ vim ~/.bashrc
复制代码


在末尾加入如下命令行并保存


e export PATH=$PATH:用户自定义路径/csky-qemu/bin
复制代码


使环境变量生效


$ source ~/.bashrc
复制代码


  • 安装依赖

使用 ldd 指令查看缺少的依赖库文件并下载。


$ ldd qemu_installation_path/bin/qemu-system-cskyv2
复制代码


​注:更详细的安装指导,请参考官方指南:https://occ.thead.cn/community/download?id=636946310057951232

码源获取


源码获取教程请参考:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md

移植


移植过程按照已实现的 riscv 的 qemu 开发板目录结构新增 csky 的 qemu 的目录结构,并在 kernel、device 和 vendor 中实现 csky 指令集及开发板相关代码。

新增目录结构


分别在 device、vendor 和 kernel 创建 SmartL_E802 开发板所需文件。


  • 在 device/qemu 目录下创建 SmartL_E802 文件夹,并在该文件夹中新增如下内容:


表 1 SmartL_E802 文件夹目录

  • 在 vendor/ohemu 目录下创建 qemu_csky_mini_system_demo 文件夹,并在该文件夹中新增如下内容:


表 2 开发板文件夹目录

  • 在 kernel/liteos_m/kernel/arch 目录下创建 csky 文件夹,并在该文件夹中新增如下内容:


表 3 csky 文件夹目录

修改 kernel 代码


在 kernel/liteos_m/kernel/arch 下创建 csky 文件夹,并完成以下步骤。


  • 新增 csky 架构的选项

在 kernel/BUILD.gn 下新增对 csky 架构的选择:


else if ("$board_cpu" == "e802") {deps = [ "arch/csky/v2/gcc:arch" ]}
复制代码


  • 编写架构代码

          

在 kernel/liteos_m/kernel/arch 中编写架构代码。

          

a.编写异常文件-los_exc.S

          

将前 32 位异常统一入口为 HandleEntry,在 HandleEntry 函数中保存当前栈 和异常地址并传参给 HalExcHandleEntry 函数。该函数将会通过中断号、g_newTask 的值和入参判断异常发生时所处位置类型(初始化、任务、中断),并调用 OsExcInfoDisplay 函数输出内存检测结果、函数调用栈回溯结果、任务描述块信息、异常类型及原因和异常时寄存器状态。


表 4 异常向量分配 (图片来源:平头哥玄铁 E802 用户手册)


b.编写调度代码-los_dispatch.S

          

在 los_dispatch.S 中编写 HalStartToRun 函数和 HalTaskContextSwitch 函数,通过保存及恢复 R0~R15、epc、epsr 和 psr 几个寄存器,实现任务的上下文切换。在 los_context.c 中适配系统逻辑,编写任务栈初始化函数并在该文件中调用调度函数。


表 5 通用寄存器(图片来源:平头哥玄铁 E802 用户手册)


 c.编写系统中断文件-los_interrupt.c

         

将 VIC 中断地址 VIC_REG_BASE 并转换成结构体,按手册描述编写中断的优先级,屏蔽、使能和清除功能。使用相关中断汇编指令实现中断开关,读取中断号等功能。


表 6 紧耦合 IP 的内存地址分配(图片来源:平头哥玄铁 E802 用户手册)


 d.编写定时器文件-los_timer.c

         

取定时器地址 CORE_TIM_BASE 并转换成对应的地址结构体,按手册编写控制和重载等功能。适配系统获取 cycle 等接口。


表 7 系统计时器寄存器定义(图片来源:平头哥玄铁 E802 用户手册)


 e.在 kernel/arch/csky/v2/gcc/BUILD.gn 中添加所编写的文件


static_library("arch") {…(加入需要编译链接的文件)}
复制代码


  • 编写 csky 架构的 backtrace

        

a.在 components/backtrace 中增加 csky 架构的 backtrace 的相关代码。通过栈回溯找到函数调用过程中的 lr 地址并保存,最后在 OsExcInfoDisplay 中输出,为用户分析异常原因提供参考。

        

b.在 kernel/include/los_config.h 的 LOSCFG_BACKTRACE_TYPE 上增加 csky 架构 backtrace 的描述。


5: Call stack analysis for c-sky by scanning the stack.
复制代码


​注:架构相关内容详情请查看平头哥玄铁 E802 用户手册。

修改 device 代码


在 device/qemu 下新增 SmartL_E802 文件夹,并完成以下步骤。


  • 移植 SDK 中代码到 device 目录下

       

a.将 SmartL_E802 SDK 驱动代码整理拷贝到 driver 目录内,并编写 BUILD.gn 文件编译驱动代码。

       

b.参考 SDK 中的 gcc_csky.ld 中寄存器配置修改 liteos.ld 文件,分配代码到指定区间。


{I-SRAM : ORIGIN = 0x0 , LENGTH = 0x20000 /* I-SRAM 128KB */D-SRAM : ORIGIN = 0x20000000 , LENGTH = 0x20000 /* D-SRAM 128KB */O-SRAM : ORIGIN = 0x50000000 , LENGTH = 0x800000 /* off-chip SRAM 8MB */SRAM : ORIGIN = 0x60000000 , LENGTH = 0x20000 /* on-chip SRAM 128KB */}
复制代码


​c.参考 SDK 中的 startup.S 文件,删除 vector 定义并编写中断总入口


.text.align 2.global IrqEIrqEntry:psrset eesubi sp, 72stm r0-r15, (sp)mfcr r0, epsrstw r0, (sp, 64)mfcr r0, epcstw r0, (sp, 68)jbsr HalInterruptldw r0, (sp, 68)mtcr r0, epcldw r0, (sp, 64)bseti r0, r0, 6mtcr r0, epsrldm r0-r15, (sp)addi sp, 72rte
复制代码


  • 编写串口驱动

参考 SDK 中串口 demo 和 printf 实现逻辑,编写 dprintf.c/.h 并在 main.c 中调用串口初始化。


  • 适配文件系统

参考 LiteOS 代码,将 fs 适配层文件移植到 SmartL_E802 中。


  • 编写 config.gni 文件

参考 device/qemu/riscv32_virt 中 config.gni 的格式,再参考 SDK 中的编译选项和需要对外调用的接口,在 liteos_m 文件夹下编写 config.gni 文件。


  • 编写 test 测试代码

参考 device/qemu/riscv32_virt 编写测试代码。


  • 编写 BUILD.gn 文件

编写 BUILD.gn 文件,将 fs 适配层,driver 开发板驱动代码等编译出来的静态库合成 liteos 可执行文件。


  • 编写 README.md

在 SmartL_E802 文件夹下编写中英文用户指南:README_zh.md 及 README.md,并修改 device/qemu 目录下的中英文文档,新增对 csky 开发板的介绍。

修改 vendor 代码


在 vendor/ohemu 下创建 qemu_csky_mini_system_demo 文件夹,并完成以下步骤。


  • 拷贝 hals/utils 文件夹

参考 vendor/ohemu/qemu_riscv32_mini_system_demo,在 qemu_csky_mini_system_demo 文件夹下新增 hals/utils 文件夹。


  • 编写 BUILD.gn 文件

参考 vendor/ohemu/qemu_riscv32_mini_system_demo,编写 BUILD.gn 文件并增加./qemu-run 脚本的使用。


  • 修改 config.json 文件

参考 vendor/ohemu/qemu_riscv32_mini_system_demo,将其中 riscv 内容修改为 csky 相关内容。


  • 编写 qemu_run.sh 脚本

使用./qemu-run 对应的架构脚本,参考 vendor/ohemu/qemu_riscv32_mini_system_demo 和平头哥官方提供的 qemu 使用手册(https://occ.t-head.cn/community/download?id=636946310057951232)编写该脚本。

编译运行

编译


  • 执行 hb set 命令并选择项目 qemu_csky_mini_system_demo;

  • 执行 hb clean && hb build 命令构建产生 liteos 可执行文件。


$ hb set$ hb clean && hb build
复制代码


在 Qemu 中运行镜像


  • 启动 qemu(不配合 GDB)


$ ./qemu-run
复制代码


  •  启动 qemu(配合 GDB)

      

a.启动 GDB 服务器,等待连接


$ ./qemu-run -g
复制代码


​b.新建终端并使用 GDB 连接 qemu


$ csky-abiv2-elf-gdb out/SmartL_E802/qemu_csky_mini_system_demo/unstripped/bin/liteos -ex "target remote localhost:1234"
复制代码


​注:

1.默认使用带符号表的 elf 文件;

2.qemu 退出方式为:按下 ctrl 加 a 键,然后松开再按下 x 键。


qemu 运行结果关键日志如下:


entering kernel init...Entering schedulerRegister littlefs done.../../../third_party/littlefs/lfs.c:1072:error: Corrupted dir pair at {0x0, 0x1}Littlefs mount at /littlefs/ done.Littlefs inited.TaskSampleEntry1 running...TaskSampleEntry2 running...
复制代码


​本次移植适配的相关源代码路径为:

kernel : https://gitee.com/openharmony/kernel_liteos_m/tree/master/kernel/arch/csky/v2/gcc

qemu : https://gitee.com/openharmony/device_qemu/tree/master/SmartL_E802

vendor: https://gitee.com/openharmony/vendor_ohemu/tree/master/qemu_csky_mini_system_demo


点击关注,第一时间了解华为云新鲜技术~

发布于: 6 小时前阅读数: 8
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
OpenHarmony LiteOS C-SKY指令集移植指南