记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.

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

### 如何在Visual Studio中使用STM32CubeMX生成的项目 #### 集成流程概述 为了使STM32CubeMX生成的项目能够在Visual Studio (VS) 中顺利编译和调试,通常需要经过几个特定的操作来设置开发环境。这些操作不仅涉及安装必要的软件组件,还包括调整项目的配置以适应不同的IDE需求。 #### 安装必要工具链和支持库 首先,在计算机上需安装完整的嵌入式C/C++开发所需的工具链,这包括但不限于GCC ARM Embedded toolchain, OpenOCD用于编程和调试支持[^1]。对于PlatformIO的支持,则可以直接通过其内置插件市场获取相应的平台包,简化了传统意义上繁琐的手动配置过程。 #### 导出Keil MDK工程至Visual Studio兼容格式 当利用STM32CubeMX创建好目标应用的基础框架后,默认情况下可以导出为多种主流IDE所使用的工程项目文件格式之一—MDK-ARM(Keil)[^2]。然而要迁移到Visual Studio环境中工作,则建议先尝试将此Keil工程转换为目标平台接受的形式;一种常见做法是借助第三方工具如IAR Systems提供的EWRAP或其他类似的解决方案来进行格式转化,不过更推荐的方式是在最初阶段就选择适合于后续迁移路径的目标选项卡下的其他IDE/Toolchains项下拉菜单中的CMSIS-Pack或GNU MCU Eclipse等开源替代方案[^3]。 #### 利用PlatformIO扩展增强体验 考虑到直接处理原始Makefile可能带来的复杂度以及维护成本问题,采用基于任务自动化构建系统的PlatformIO作为中间层不失为明智之举。它允许开发者轻松管理依赖关系、执行编译链接等一系列动作而无需关心底层细节,并且提供了良好的多平台移植性和丰富的社区资源支持。 ```cpp // 示例:简单的LED闪烁程序片段展示如何编写适用于上述环境的应用代码 #include "main.h" int main(void){ HAL_Init(); SystemClock_Config(); // 初始化系统时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIO端口时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* Configure LED pin as output */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); while (1){ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 切换LED状态 HAL_Delay(500); // 延迟一段时间 } } ```
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

idk500

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

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

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

打赏作者

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

抵扣说明:

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

余额充值