IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于VS Code搭建通用ARM微控制器开发平台 -> 正文阅读

[嵌入式]基于VS Code搭建通用ARM微控制器开发平台

基于VS Code搭建通用ARM微控制器开发平台

DataAuthorVersionNote
2022-04-12Dog TaoV1.0Release as V1.0
- 使用基于STM32CubeIDE构建的Makefile工程(STM32F103)完成了环境搭建与编译测试。
2022-04-13Dog TaoV1.1Release as V1.1
- 在windows平台实际测试发现存在平台兼容性与GCC工具链版本问题,找到了有效的解决方法。
- 对应的更新了示例Makefile文件、示例task.json文件。

概述

现在流行的开发平台有很多,很多芯片厂商也会提供自己的IDE,一般这些IDE都是基于通用IDE框架(例如Eclipse与VS Code)通过设计相应的插件实现的。例如目前用的比较多的STM32CubeIDE就是基于Eclipse开发的。同时,ARM提供的官方开发工具Keil MDK虽然比较原始简陋,但使用者也很多。不同的操作系统、不同的单片机平台就会对应衍生出很多个开发环境,带来管理和开发上的困难。

单片机开发的核心过程是交叉编译,即在PC端编译生成能够在单片机平台运行的可执行文件。因此,通过设置正确的交叉编译工具链,并使用与平台无关的Makefile文件可以将不同单片机的工程统一的组织起来。当然,这样做的缺点是对新手极其不友好,如果没有gcc、linux与交叉编译相关项目经验的很难直接理解与掌握。同时,很多工程师只是用一两款平台的甚至是一两种型号的单片机开发,如此就没有必要考虑通用的微控制器开发方法。

但是,从进一步提高嵌入式开发水平、全面理解交叉编译过程以及多单片机平台开发的角度来看,搭建通用ARM微控制器开发平台又是十分必要的,具备很强的工程意义与研究价值。

需要说明的是,本文档是基于现成Makefile工程进行的。而不同的单片机平台的Makefile文件是不一样的,尤其是与内核相关的编译命令。与此同时,不同单片机平台还有不同的启动文件(.S*)与链接脚本(.ls*),这些都是需要提前整理好,并用Makefile文件组织起来的。

VS Code与Eclipse之争

VS Code与Eclipse都是主流的、开源的、通用的IDE,都能通过预留的接口与插件实现对各种编程语言、各种运行平台的支持。笔者综合考虑了各个MCU芯片厂商的推荐工具、软件维护与使用体验、代码编写与功能支持、交叉编译环境设置难以程度的角度出发,最终认为VS Code更加适合我们设计通用ARM微控制器开发的需要。因此,以下介绍使用VS Code搭建MCU开发平台的一般过程。

其实,从它们的官网首页风格中就能看出彼此的差异。

Untitled

Untitled

下载安装VS Code

官方下载地址:https://code.visualstudio.com/

安装ARM-GCC工具链

根据不同的系统平台选择安装不同的交叉编译工具链。作者推荐使用metalcode-eu出品的原生工具链。例如,如果是windows系统,就选择安装windows-arm-none-eabi工具链;如果是darwin(macOS)系统,就选择安装darwin-arm-none-eabi工具链。

Untitled

安装完成之后,打开扩展,会显示相应的教程。使用交叉编译工具链,最重要的就是正确设置环境变量,使得Makefile文件中指定的命令可以被正确识别。因此,这个插件中所介绍的使用方法就是在tasks.json中指定任务名、任务的环境变量。

Untitled

Windows平台的版本问题

经过在Windows平台的实际测试发现如果安装了最新版本的GCC工具链,从elf生成hex文件时会报错:“objcopy.exe: 64-bit address 0x4b4fa308000000 out of range for Intel Hex file”,其他功能不受影响。经过排查发现是GCC工具链的版本问题,可以自行选择安装其他插件提供的工具链或者简单的将此扩展插件降低版本即可使用。笔者实测V0.1.2版本是可用的。

image-20220413174331048

image-20220413174437553

创建项目工程

如果是初次在VS Code上使用一个Makefile工程,那么需要打开这个工程所在的文件夹(可以是任意位置)。当然,也可以指定git的远端仓位地址直接clone代码到本地。

Untitled

Untitled

创建tasks.json

对于新打开的Makefile工程,需要手动创建tasks.json文件与launch.json文件。

VS Code是通过运行tasks.json中配置的任务来执行脚本命令的。配置文件中以JSON格式保存各个参数,例如任务名字label,类型type,命令command,参数args等等。其中run build/test task是软件提供的最常用的两种任务,所以一般就把编译,链接等生成目标程序的任务名设置为build,把测试运行的任务名设置为run。其中run build task的快捷键是ctrl/cmd + shift + B。

依次选择【Terminal】【Configure Tasks…】【Create tasks.json file from template】即可创建默认的tasks.json文件。

Untitled

Untitled

可以根据GCC工具链扩展中提示的参考配置修改此文件。提供的示例参考如下:

{
    "version": "2.0.0",
    "tasks": [
      {
        "label": "build firmware",
        "type": "shell",
        "command": "make all",
        "options": {
          "env": {
            "INCLUDE": "${config:arm-none-eabi.include}",
            "LIB": "${config:arm-none-eabi.lib}",
            "LIBGCC": "${config:arm-none-eabi.libgcc}/thumb/v6-m/libgcc.a",
          }
        },
        "osx": {
          "options": {
            "env": {
              "PATH": "${config:arm-none-eabi.bin}:${env:PATH}",
              "PLATFORM": "osx"
            }
          },
        },
        "linux": {
          "options": {
            "env": {
              "PATH": "${config:arm-none-eabi.bin}:${env:PATH}",
              "PLATFORM": "linux"
            }
          },
        },
        "windows": {
          "options": {
            "env": {
              "PATH": "${config:arm-none-eabi.bin};${env:PATH}",
              "PLATFORM": "windows"
            }
          },
        },
        "group": {
          "kind": "build",
          "isDefault": true,
        },
        "problemMatcher": "$gcc"
      },

      {
        "label": "test environment",
        "type": "shell",
        "command": "make test",
        "options": {
          "env": {
            "INCLUDE": "${config:arm-none-eabi.include}",
            "LIB": "${config:arm-none-eabi.lib}",
            "LIBGCC": "${config:arm-none-eabi.libgcc}/thumb/v6-m/libgcc.a",
          }
        },
        "osx": {
          "options": {
            "env": {
              "PATH": "${config:arm-none-eabi.bin}:${env:PATH}",
              "PLATFORM": "osx"
            }
          },
        },
        "linux": {
          "options": {
            "env": {
              "PATH": "${config:arm-none-eabi.bin}:${env:PATH}",
              "PLATFORM": "linux"
            }
          },
        },
        "windows": {
          "options": {
            "env": {
              "PATH": "${config:arm-none-eabi.bin};${env:PATH}",
              "PLATFORM": "windows"
            }
          },
        },
        "group": {
          "kind": "test",
          "isDefault": false,
        },
        "problemMatcher": "$gcc"
      }
    ]
  }

设置完tasks.json文件后,可以执行【Terminal】【Run Build Task…】,即可按照"command"字段中指定的命令完成工程编译。

Untitled

Untitled

关键设置说明

tasks.json文件中除了要指定各个平台的工具链路径之外,还需要提供两个任务,一个为默认的build任务,一个为测试任务。通过测试任务可以输出环境变量以判断是否设置正确。同时,考虑到跨平台支持,需要额外设置一个PLATFORM环境变量,在不同的操作系统下,它的值不同。对应的Makefile文件中应该提供支持,示例如下:

  • 测试任务与构建任务
all: buildelf

buildelf: $(OBJS) 
	$(CC) -o "$(BIN_DIR)/$(OBJECT_NAME).elf" $(OBJS) $(LINKER_FLAGS)
	$(CC_OBJCOPY) -O ihex "$(BIN_DIR)/$(OBJECT_NAME).elf" "$(BIN_DIR)/$(OBJECT_NAME).hex"
	$(CC_OBJCOPY) -O binary "$(BIN_DIR)/$(OBJECT_NAME).elf" "$(BIN_DIR)/$(OBJECT_NAME).bin"

clean:
	$(RM) $(OBJS) $(DEPS) $(BIN_DIR)/$(OBJECT_NAME).*


test:
	@echo "Platform is:" $(PLATFORM)
	@echo "PATH is:" $(PATH)
	@echo "INCLUDE is:" $(INCLUDE)
	@echo "LIB is:" $(LIB)
	@echo "BIN is:" $(BIN)
	@echo "GCCLIB is:" $(GCCLIB)
  • 平台判断与处理。例如在windows系统中的mkdir指令用法与在unix系统中是有区别的。
ifeq ("$(PLATFORM)", "windows")

$(OBJECT_DIR)/%.o: %.c
	mkdir $(subst /,\,$(dir $@)) 2> NUL || echo off
	$(CC) $(COMPILER_FLAGS) $< -o $@

$(OBJECT_DIR)/%.o: %.s
	mkdir $(subst /,\,$(dir $@)) 2> NUL || echo off
	$(CC) $(ASSEMBLER_FLAGS) $< -o $@
	
$(OBJECT_DIR)/%.o: %.S
	mkdir $(subst /,\,$(dir $@)) 2> NUL || echo off
	$(CC) $(ASSEMBLER_FLAGS) $< -o $@

else

$(OBJECT_DIR)/%.o: %.c
	mkdir -p $(dir $@)
	$(CC) $(COMPILER_FLAGS) $< -o $@

$(OBJECT_DIR)/%.o: %.s
	mkdir -p $(dir $@)
	$(CC) $(ASSEMBLER_FLAGS) $< -o $@
	
$(OBJECT_DIR)/%.o: %.S
	mkdir -p $(dir $@)
	$(CC) $(ASSEMBLER_FLAGS) $< -o $@

endif

创建launch.json

VS Code是通过运行launch.json中配置的任务来执行程序下载与调试的。

对于ARM单片机开发,首先需要安装Cortex-debug插件。

Untitled

依次选择【Run】【Add Configuration…】【Cortex Debug】,即可自动生成launch.json文件。

Untitled

Untitled

其中,"executable”字段的值需要改为实际可执行文件的位置。"servertype”需要改为实际使用的调试器的类型。也可以使用【Add Configuration…】进行快捷设置。配置文件中的不同字段的值需要根据实际项目进行修改,例如OpenOCD调试时需要指定2个配置文件。

Untitled

Untitled

调试器的驱动安装、配置文件设置灯可以参考此文档

调试程序

点击【Run and Debug】,可以看到出现了launch.json文件指定的两个配置的名称,可以根据实际调试器的类型选择一种配置运行。

Untitled

Untitled

文件类型支持

可以在VS Code中下载相关插件支持**.map文件与**.ld文件的语法高亮。

Untitled

支持语法高亮后,比较适合阅读、检查以及修改这些文件。

Untitled

Untitled

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:16:35  更:2022-04-15 00:17:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:51:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码