單片機爬坑記-04-編譯環境(續)

来源:https://www.cnblogs.com/zarlinq/archive/2019/02/25/10428955.html
-Advertisement-
Play Games

(VSCode是最好的編輯器,沒有之一!嗯,就是這樣!) TI的處理器,官方庫是很豐富的,不論官方庫是否混亂、是否難理解,豐富多樣這一點就足夠吸引人,以至於總想著在VSCode里順利地操著官方庫來寫代碼。 前文提過,在VSCode下有兩種擴展插件可以盤弄TI的單片機開發,分別是“PlatformIO ...


(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,暫放)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • & x5B98;& x65B9;& x6587;& x6863;& x4E2D;& x5BF9;DataTrigger& x7684;& x4ECB;& x7ECD; Represents a trigger that applies property values or performs acti ...
  • 進程:進程是一個程式在電腦運行時,全部資源的合集叫進程 線程:是程式的最小執行單位,包含計算資源,任何一個操作的響應都是線程完成的。 多線程:多個線程併發執行 Thread 是.net框架封裝的一個類,描述線程的東西 同步和非同步都是描述方法的,所以需要使用委托。 同步方法:發起一個調用,一定等著計算 ...
  • 本文提供一個現成的範例下載,用 HTML 網頁 + jQuery Mobile,呼叫(調用) ASP.NET Web API 服務。 ...
  • 本文繼續介紹定時任務 Wpf.Quartz.Demo.3的一些小細節, 代碼也請前往第3節下載。 1.RichTextBox右鍵菜單 <RichTextBox.ContextMenu> <ContextMenu> <MenuItem Header="剪貼" Command="ApplicationC ...
  • 先把全部源碼上傳,只是一個Demo,希望大家指點一下不足之處,見本文底部。 1.設置界面 2.詳情頁面 好了,現在慢慢敘述裡面的一些方法。 3.實現拷貝的方法: (1) public static void LeftCopyRight(object left, object right) { var ...
  • 這個大概分為兩種情況:1-在同一程式集訪問該類;2-在不同的程式集訪問 A:同一程式集,使用微軟的創建對象的類:System.Activator: 先通過類名,獲取到類型,在使用用於創建本地或遠程對象的Activator類創建類型的實例: B:不同的程式集(同一程式集也可用):微軟的程式集抽象類提供 ...
  • 這篇文章說明瞭如何使用EPPlus在ASP.NET Core中導入和導出.xls/.xlsx文件(Excel)。在考慮使用.NET處理excel時,我們總是尋找第三方庫或組件。使用Open Office Xml格式(xlsx)讀取和寫入Excel 2007/2010文件的最流行的.net庫之一是EP ...
  • 一、套接字(socket)概念 套接字(socket)是通信的基石,是支持TCP/IP協議的網路通信的基本操作單元。它是網路通信過程中端點的抽象表示,包含進行網路通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議埠,遠地主機的IP地址,遠地進程的協議埠。 應用層通過傳輸層進行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...