Arduino IDE第三方开发包的制作

许多硬件厂商都希望自己的开发板能被Arduino IDE集成开发环境所支持。这里就以小脚丫开发板所使用的开发包为例,介绍一下第三方开发包的制作方法。

说明:小脚丫开发板所使用的开发包的完整代码,可以在本书代码资源 Arduino_RISCV_IDE-master.zip 中找到。更准确地说,这个代码资源是PulseRain Reindeer软核处理器的开发支持包,而小脚丫开发板只是所有支持PulseRain Reindeer的开发板中的一款。

1.开发/载入工具的准备

作为一个完整的开发包,其需要为用户提供下面三类工具。

(1)编译器。
在PulseRain Reindeer的开发包中,选用了RISC-V GCC的裸金属版本,以适应MCU的开发。

(2)代码载入工具,用于将编译产生的二进制代码载入到开发板上。在Arduino IDE集成开发环境里,这个过程被称为代码载入。
PulseRain Reindeer包含了用硬件(RTL)实现的载入工具,所以在运行Arduino IDE的主机端,只要准备一个Python脚本,用来和这个硬件实现的载入工具通信即可。而在其他的处理器中,这部分功能是由软件实现的,也就是说,开发者除了要准备主机端的软件工具外,还需要准备一个用软件实现的Bootloader, 在处理器上电后运行,来与主机端通信。

(3)代码大小测量工具。
在向硬件载入代码之前, Arduino IDE需要知道代码的大小,PulseRain Reindeer的开发包中提供了一个名叫hex_total_size的工具,该工具实际上是一个Python脚本,用来计算编译产生的hex文件所对应的二进制代码的大小。

2.board.txt 与 platform.txt

除了上文提到的这些工具外,开发包还需要包含下面两个文本文件,用来指导Arduino IDE对这些工具的使用。

(1)board.txt.
这个文件主要包含了与开发板相关的参数,例如串行口载入的波特率、开发板所包含的内存大小等。代码8-3展示了与小脚丫开发板相关的 board.txt 部分。

代码8-3 小脚丫开发板相关的board.txt
STEP.name=STEP CYC10 Board (Intel 10CL016YU256C8G)
STEP.platform=Reindeer
STEP.build.board=__BOARD_STEP_CYC10_
STEP.build.extra_flags=-march=rv32i -mabi=ilp32 --std=c++17 
STEP.compiler.c.extra_flags=
STEP.compiler.cpp.extra_flags=
STEP.ld.extra_flags=

STEP,upload.maximum_size=8388608
STEP.upload.speed=921600
STEP.upload,tool=Reindeer_upload

STEP.build,mcu=Reindeer
STEP.build.core=Relndeer
STEP.build.variant=generic

(2)platform.txt。
这个文件主要包含了各个工具的命令行使用方式,例如对cpp文件编译所需要的命令行参数(代码8-4)、hex 文件的生成方法(代码8-5)、代码载入工具的使用(代码8-6)等。

代码8-4 platform.txt, cpp文件的编译方式
recipe.cpp.o.pattern="(compiler.path}(compiler,cpp.cmd}" {build.flags} {compiler.cpp.flags} {compiler.define} {compiler.cpp.extra_flags} {build.extra_flags}-I(build.path}/sketch {includes}  "{source file}" -o "{object_file}" 

代码8-5 platform.txt, Intel hex文件的生成
recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex. cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"

代码8-6 platform.txt, 代码载入工具的使用
tools.Reindeer_upload.cmd=reindeer_config  
tools.Reindeer_upload.path={runtime.tools.Reindeer_upload.path}

tools.Reindeer_upload.upload.params.verbose=
tools.Reindeer_upload.upload.params.quiet=
tools.Reindeer_upload.upload.protocol=UART

tools.Reindeer_upload.upload.pattern="{path}/(cmd}" --reset --run --port={serial.port} --baud={upload.speed} "--image={build.path}/(build.project_name}.hex"

有关PulseRain Reindeer开发包所使用的board.txt与platform.txt的完整代码,可以在本书代码资源Arduino_RISCV_IDE-master.zip的 PulseRain_RISCV/Reindeer目录下找到。


3.源代码

在准备开发包时,前面提到的board.txt与 platfom.txt要和开发包的源代码放在同一个压缩文件里面(.tar.gz文件),这个文件的目录结构如图8-10所示

Arduino IDE第三方开发包的制作
图8-10  开发包源代码的目录结构

在Arduino Language中定义的 API, 都需要由这些源代码来实现。在图8-10 中有两个子目录: cores 和 variants,一个处理器通常会有多个不同的型号、这种目录结构的设计便是考虑到了这种情况。所有处理器型号共享的代码可以放在 cores 目录中,而针对某个处理器型号的代码(例如外围设备的地址定义)可以放在variants目录中。

提示:具体到某个开发板来说,其所携带的处理器型号可以在boardtxt中指定。例如在代码8-3中可以看到,小脚丫开发板所对应的 variant 是 generic(通用型)

4.JSON 文件

上文提到的这些工具和源文件(包括 board.txt 与 platform.txt), 最终都需要由一个JSON文件来汇总,以标记源文件和工具的对应关系,以及所支持的开发板列表,以方便Arduino IDE集成开发环境来引用。随着开发包和工具的不断升级,这个JSON还需要记录旧版本的相关信息。

为了方便开发, PulseRainTechnology 公司为此提供了一个 Shell 脚本,以自动生成这个JSON 文件,并自动生成所需要的压缩文件。这个 Shell 脚本可以在本书代码资源Arduino_RISCV_IDE-master.zip 中找到。

其可以在Cygwin下被运行,代码8-7便是用这个 Shell 脚本所生成的一个JSON文件样本。


代码8-7 开发包的JSON文件
{
  "packages":[
    {
      "name":"PulseRain RISCV",
      "maintainer":"PulseRain Technology,LLC"
      "email":"info@pulserain.com",
      "help":{
        "online":"http://riscv.us"
      },
      "websiteURL":"http://riscv.us",
      "platforms":[
        {
          "name":"PulseRain Reindeer",
          "architecture":"Reindeer",
          "version":"1.3.0",
          "category":"Contributed",
          "url":"https://github.com/PulseRain/Arduino_RISCV_IDE/raw/master/package/Reindeer_1.3.0.tar.gz",
          "archiveFileName":"Reindeer_1.3.0.tar.gz",                        
          "checksum":"SHA-256:81dea9ca7584b1711c87705a06d805e8149f6e43b0210589e98af5489be051c9",
          "size":"17761",
          "help":{
            "online":"http://riscv.us"
          },
          "boards":[
            {"name":"Gnarly Grey UPDuinoV2 Board (Lattice UP5K)"},
            {"name":"STEP CYC10 Board (Intel 10CL016YU256C8G)"},
            {"name":"Efinix Trion T20 BGA256 Development  Kit"}
          ],
          "toolsDependencies":[
            {
              "packager":"PulseRain RISCV",
              "version":"2.1.0",
              "name":"Reindeer upload"
            },
            {
              "packager":"PulseRain RISCV",
              "version":"1.0.0",
              "name":"Reindeer compiler"
            },
            {
              "packager":"PulseRain RISCV"
              "version":"1.0.0",
              "name":"hex_total_size"
            }
          ]
        }
      ],
      "tools":[
        {
          "version":"2.1.0",
          "name":"Reindeer upload",
          "systems":[
            {
              "host":"i686-mingw32",
              "url":"https://github.com/PulseRain/Arduino_RISCV_IDE/raw/master/package/Reindeer_upload_2.1.0.tar.gz",
              "archiveFileName":"Reindeer_upload_2.1.0.tar.gz",
              "checksum":"SHA-256:4eafa097f0c6818db3f3355ab324268c0876b72f35a78a6881bfe71cf55ef316",
              "size":"6035446"
            }
          ]
        },
        {
          "version":"1.0.0", 
          "name":"Reindeer compiler",
          "systems":[
            {
              "host":"i686-mingw32",
              "url":"https://github.com/PulseRain/Arduino_RISCV_IDE/raw/master/package/Reindeer_compiler_1.0.0.tar.gz",
              "archiveFileName":"Reindeer_compiler_1.0.0.tar.gz",
              "checksum":"SHA-256:216c9e08a54b0df3895dad95b199505f16lea56422eb246e56892a6f0043f3b4",
              "size":"1003705941"
            }
          ]
        },
        {
          "version":"1.0.0"
          "name":"hex total size"
          "systems": [
            {
              "host":"i686-mingw32"
              "url":"https://github.com/PulseRain/Arduino_RISCV_IDE/raw/master/package/hex_total_size_1.0.0.tar.qz",
              "archiveFileName":"hex_total_size_1.0.0.tar.gz",
              "checksum":"SHA-256;275fd6f969b470e06181e86e0725d47ec262C01c5a917C527f004d50a9926fd",
              "size":"7007795"
            }
          ]
        }
      ]
    }
  ]
}

从代码8-7可以看出,完整的开发包除了JSON 文件外,还需要包括下面4个压缩文件(.tar.gz 文件):
(1)源代码(包括 board.txt与 platform.txt), 例如代码8-7中的Reindeer_1.3.0.tar.gz。
(2)代码载入工具,如代码8-7中的Reindeer_upload_2.1.0.tar.gz。
(3)编译器,如代码8-7中的Reindeer_compiler_1.0.0.tar.gz。
(4)代码大小的测量工具,如代码8-7中的hex_total_size_1.0.0.tar.gz。

- 本文内容来自网络,如有侵权,请联系本站处理。

2024-01   阅读(66)   评论(0)
 标签: embedded Arduino

涨知识
中断

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

评论:
相关文章

ESP32 使用DAC模拟输出完成两路呼吸灯

ESP32的DAC函数可以实现真正的模拟输出。


在 ESP32 上使用 LEDC (PWM)

ESP32 没有Arduino输出 PWM 的 analogWrite(pin, value) 方法,取而代之的 ESP32 有一个 LEDC 来实现PWM功能。


《米思齐实战手册:Arduino图形化编程指南》

本书由少年创学院联合创始人兼院长、知名创客程晨撰写,以Arduino作为硬件平台,介绍了使用米思齐(Mixly)软件进行程序开发的方法。


Arduino UNO R4 WiFi 官方介绍文档

本文档作为UNO R4 WiFi的技术概览,您将找到一系列资源和指南链接,帮助您开始下一个项目。


OneButton: 用于使用单个按钮进行多用途输入的Arduino库

Arduino OneButton库是一个用于简化按钮操作的库,它可以轻松地处理按钮的单击、双击和长按等操作。适用于Arduino开发板以及ESP32等其他基于Arduino的开发板。


Arduino Bootloader

本文从Arduino Uno入手,看看怎样在这个"简单"的8bit单片机搭建一个属于自己的bootloader


ESP32 SD卡读写

ESP32 可以通过 SDMMC 和 SPI 两种方式读取SD/TF卡数据。



搜索
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。