记gnu-mcu-eclipse-openocd工具链移植

在RISCV工具链开发中挣扎。。。

前言

OpenOCD将人群分为三类

  • 用户:仅仅使用二进制分发镜像,调用.cfg直接烧录调试
  • 维护者:针对新的芯片/系统 发布.cfg而不更改二进制镜像
  • 开发者:需要修改OpenOCD源码重新编译以支持自家的芯片

本文是写给开发者看的。不是为了讲述工具链的安装,本文的目标是为了向OpenOCD添加一个新的芯片.

概述

工具链总览:

GUI–>CMD–>Telnet–>(Jim)TCL–>TTL
eclipse-CDTGDBopenocddongleChip

工具链详解(图片来自keil.com)
其中,dongle表示DAP_link,jlink,stlink等一众硬件仿真器。
调试器千千万,调试界面无非jtag/swd,这部分要做的就是连线连对而已。也可以自己开发,反正就拿dap-link的源码往上套。

在OpenOCD面前,众生平等,因为所有的调试器都是通过Jim-TCL抽象成同一种设备。
例如Jlink,正常的用法是安装SEGGER的官方驱动,然后jlink.exe会帮你处理剩下的事情。
而OpenOCD要想使用Jlink,需要使用Zadig安装libUSB库,覆盖Segger的驱动。
也因此,Segger不会提供任何支持,相反,Segger自己搞了个开源计划。
另一个典型的例子是ARC架构,使用Meteware工具链的时候要求安装Digilent adept,但在使用GNU工具链时,要求将设备驱动更换为WinUSB

openocd,最好的情况是已有cfg,例如st家的芯片,直接带参-f调用类似STM32F10x.cfg 之类就够了
比较糟糕的情况,例如芯片自有flash操作方法,那就需要修改flash操作部分,这个cfg是没有的,需要自己改源码编译。
对于芯片没有内置FLASH的,需要根据实际情况提供SPI驱动,XIP驱动之类的,总体来说,你需要提供一个让CPU可以加载代码的地方

具体要改动的文件如下:

此部分日后详细说明
1.在./tcl/target中,添加自己设备的.cfg文件
此文件用于编译后传递到scripts中供用户调用
2.在./src/flash/nor中,添加自己设备的.c文件
此文件用于告知openocd你文件的flash烧录流程
3. 在 /src/flash/drivers.c中,添加自己设备的设备名
此处让openocd知晓你的设备.
4. 在flash/nor中,更改makefile.am
令openocd的编译过程可以引用到你刚刚添加的文件.

这其中最重要的问题在于交叉编译,可能是我脸黑,抓了很多版本的openocd源码都编译过不了,哪怕拿着sifive现场写的教程也make fail for win64.
目前能够成功的环境只有那个docker。

openocd源码搞定以后,其他的就不是问题了,cfg写对,基本上可以开始第一轮对内核的debug了
因为都是内核相关,ld里配一下flash和ram地址就完事。

在arm环境下,工具链的移植可以说随便填填空就够了。
在riscv中,总是会遇到各种问题,可以说,非常的不尽兴

此部分日后详细说明
ARM ram转写flash功能不支持,需要自己进行开发

路线图

目前的移植工作,大致上按照以下步骤进行:

  1. openocd修改cfg连接mcu内核调试部分
  2. openocd修改源码编译操作mcu的flash
  3. eclipse 修改ld文件,通过gcc编译出elf
  4. gdb联调openocd,测试cmd工作情况
  5. 各组件交叉编译统一到一个平台
  6. eclipse中整合cmd,开始debug

目前进度

卡在gdb无法启动openocd中

已解决,在启动前,需要变更gdb指令格式,指令为:
set archtecture riscv:rv32

flash烧写时间过长(0.038KB/s)

尚未解决,由于riscv内核不支持arm的algorithm特性,使用了单字节烧录和强制延时等待的办法.
下一轮开发再解决此问题
2021/8/4 通过调试器直写flash,会导致flash操作时间被叠加到上位机,因此需要一个ISP引导,让上位机将代码送到SRAM,ISP循环将数据搬到flash,这样也可以解耦合

额外的话

如果你是个第三方厂商,在适配之前应该首先向原厂提出要求,国内的MCU厂商似乎都不太愿意把自己的芯片细节写清楚.
如果你自己就是原厂,那么你应该首先确认,designer给你总线图了吗?他有告诉你cbus sbus怎么连接的吗?
你已经清晰的了解到startup是如何工作的了吗?

芯片是一个典型的自顶向下的开发流程,RTL对于software来说是一个黑盒子.试图用software去试探芯片运行规则是"越权行为",如果designer自己都不清楚memory的限制,我的建议是你应该心平气和的端一把椅子坐他旁边,花一个下午的时间好好审查一下自己的RTL CODE.

以上纯属个人意见,如果不同意,就当是我的牢骚话吧

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idk500

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值