• 单片机爬坑记-04-编译环境(续)


    (VSCode是最好的编辑器,没有之一!嗯,就是这样!)

    TI的处理器,官方库是很丰富的,不论官方库是否混乱、是否难理解,丰富多样这一点就足够吸引人,以至于总想着在VSCode里顺利地操着官方库来写代码。

    前文提过,在VSCode下有两种扩展插件可以盘弄TI的单片机开发,分别是“PlatformIO IDE”和“IAR Embedded Workbench”,“PlatformIO IDE”由于采用自家的编译环境,还不让改#include路径,劣势是很明显的,而“IAR Embedded Workbench”实际上有一大问题,就是对于同一个ewp文件(文件夹名称不变,文件名称不变),再次build的时候会被插件拒绝更新,这就很尴尬了!难不成,只能一次编译?这不科学!

    由于暂时找不到其他更好用的扩展插件,所以……嗯……怎么办呢?

    我们知道,单片机开发中,C语言代码可以用arm-none-eabi-gcc来编译(项目文件和官方boot文件),然后链接成bin,过程可以由Makefile组织,Makefile可以由Cmakefile.txt在Cmake中生成(关于Cmake只是顺带一提,暂时不用,可以忽略),只要得到bin文件,剩下的就是烧写而已。

    在编译过程中,不考虑项目文件的情况下,除了官方库,我们主要还需要的是例如”startup_TM4C123.s”这样的官方boot文件,将这些文件编译、链接到项目文件中最终生成bin文件算是Keil和IAR这样的IDE在build阶段所做的最独特的事(相对于号称宇宙最强悍IDE的Visual Studio而言)。

    所以,核心问题在于,是否能搞到以Makefile组织的例程,这样我们可以通过例程中的文件来改自己的项目模板。

    上述是思路,如下以TI的TivaWare C库为例(这个库文件比较充足,自带全能光环,符合省心、省事、省时间的基本原则),在VSCode里调用该库进行开发并完成编译。

    /*———————————哪里来的线?————————————————*/

    ---必备插件:C/C++ for Visual Studio Code

    ---必备环境:CygwinGNU Arm Embedded Toolchain

    1、精简库文件

    TivaWare C库中所有后缀为dep、eww、ewd、ewp文件都是IAR相关文件,后缀以uv开头的文件都是Keil相关文件,后缀为json的文件不知道做什么用,名称为“startup_ccs.c”、“startup_ewarm.c”、“startup_rvmdk.S”的文件是非gcc平台启动文件,这四种文件都可以直接删除。

    接着可以将所有名称为“ewarm”、“ccs”、“rvmdk”的文件夹全部删除。

    这一波精简可以砍掉上千个文件……

    (可选:将TivaWare C库的文件夹名称“TivaWare_C_Series-2.1.3.156”改为“TivaWareC”)

    image

    2、建立模板文件夹

    通过查看例程中的Makefile文件,可以看到例程的Makefile(也包括库文件的Makefile)先是调用了

    makedefs文件的内容,而makedefs文件则把编译环境整理的差不多了,Makefile剩下的内容则是针对例程本身的编译、链接进行组织,其中关于启动文件的一行(例如“${COMPILER}/blinky.axf: ${COMPILER}/startup_${COMPILER}.o”),关于分支库(driverlib、grlib、IQmath、nfclib、sensorlib、usblib)每个文件夹可以有一行(例如“${COMPILER}/blinky.axf: ${ROOT}/driverlib/${COMPILER}/libdriver.a”),其他部分基本可以暂时不管。

    所以,依然采用常规的修改例程的方式来建立项目的模板文件。

    选取例程文件夹(TivaWareC/examples/)下任意一个文件夹(比如boards/ek-tm4c123gxl/blinky),将整个文件夹复制到工作区根目录下(方便管理),作为模板文件夹。

    由于此时文件夹的路径已然改变,所以需要修改项目模板中的Makefile,将其中ROOT和IPATH的赋值从“../../../..”修改为“../TivaWareC”。

    image

    3、开始新的项目

    (1)将模板文件夹复制一份到工作区根目录下作为项目文件夹,改名为预期的项目名称(假定为“test01”);

    (2)修改工作区的code-workspace文件,将项目名称(“name”)和目录(“path”)作为一组值添加到“folder”项中(方便项目管理);

    (3)项目文件夹中的文件名,以及Makefile中的内容,全部从模板文件夹的名称(“blinky”)改名为项目名称(“test01”);

    (4)在VSCode的资源管理器中,在项目文件夹(test01)下新建文件夹“.vscode”,在文件夹“.vscode”下新建文件“tasks.json”,“tasks.json”内容为:

     1 {
     2     "version": "2.0.0",
     3     "tasks": [
     4         {
     5             "label": "test01",
     6             "type": "shell",
     7             "command": "make",
     8             "args": [
     9                 "all"
    10             ],
    11             "group": "build",
    12             "presentation": {
    13                 "reveal": "always",
    14                 "panel": "new"
    15             },
    16             "problemMatcher": "$msCompile"
    17         }
    18     ]
    19 }
    tasks.json

    //-------文件“tasks.json”也可以通过按下F1,输入tasks,

    //选择“tasks:Configure task”(任务:配置任务),来让VSCode自动生成,

    //但内容要注意修改!

    (5)快捷键Ctrl+Shift+B(替代方式为按下F1后输入tasks,选择Run Task),选择任务test01,可以进行编译,在项目文件夹下的gcc目录中能够看到生成的bin文件。

    开始搬砖……搬砖……砖……

    image

    4、修正引用关系

    对于分支库(driverlib、grlib、IQmath、nfclib、sensorlib、usblib)的调用,对照着例程直接在Makefile里添加对.a文件的依赖行即可,但TivaWare C库中还有其他库文件可以#include,比如freeRTOS.h,此时对于依赖关系,对照着freertos_demo例程中的Makefile文件内容,相应修改即可。

    /*———————————线到哪里去?————————————————*/

    关于搬砖过程中,代码补全的问题,可以按快捷键Ctrl+Shift+P,选择“C/C++:Edit configurations…”,在“includePath”项中,将”${workspaceFolder}/**”修改为"${workspaceFolder}/../TivaWareC",然后重新打开工作区即可(有时候不用重新打开也行)。

    这种方式完全采用Makefile完成生成bin文件的过程,arm-none-eabi-gcc.exe是由Cygwin下的make.exe调用的(arm-none-eabi-gcc.exe需要在命令行中能够调用,即需要添加所在目录至系统环境变量path中),所以对于VSCode的设置而言,完全不需要考虑编译器、链接器等设置……所幸,TI的TivaWare C库比较完整,工程文件安排比较合理……但对于其他一些厂商的库(不考虑Arduino和STM32,这俩货用这种方式纯属舍近求远),应当特别注意Makefile的内容是否完整可靠。

    至于调试嘛……留个串口来输出调试信息如何?

    /*———————————没有看到线!————————————————*/

    从上述思路想到,如果用Cmake来生成Makefile,也许能更好的解决依赖项的问题……(但是还不会写Cmake,暂放)

    ------printf("仿佛被囚禁的时间不知所措的变迁,仿佛未知的可能也已经被发现,迎着狂风手插口袋路过你走过的路,荒诞无稽的残酷也拦不住我的脚步…… "); printf("找过无数的理由试着包装我的残缺,而主动承认自己的懦弱却永远无法妥协…… ");------
  • 相关阅读:
    结构型设计模式(上)
    创建型设计模式(下)
    创建型设计模式(上)
    HTTP 简述
    MVC、MVP与MVVM架构模式
    PHP 部分语法(二)
    PHP 部分语法(一)
    TypeScript 学习笔记(四)
    WORD 和Uint16的区别
    extern的用法
  • 原文地址:https://www.cnblogs.com/zarlinq/p/10428955.html
Copyright © 2020-2023  润新知