• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 在Mac上做嵌入式開發,真的如此簡單

    在Mac上做嵌入式開發,真的如此簡單

    作者: 時間:2017-06-03 來源:網絡 收藏

    前言

    本文引用地址:http://www.czjhyjcfj.com/article/201706/346836.htm

    目前開發平臺按照性能可以分為兩類,一種是只有數十兆的單片機,一種是比較高級的可以跑甚至Android的平臺(其實iPhone、Android手機都屬于產品)。

    后者一般基于/unix操作系統做交叉編譯,但是前者往往更多的是在Keil上做開發,但由于本人個人關系,比較不喜歡Keil界面,所以一般在做嵌入式開發的時候,都會優先考慮是否有/unix類的SDK(指包含編譯工具)。但似乎Mac OSX上做嵌入式開發的人員較稀少,hum...因此資料也會相對較少。

    本文所舉例子,是千千萬萬種嵌入式芯片的一種,并不具備普遍性,但讀完本文應該也會讓你略有收獲。

    系統環境

    操作系統: OS X EI Capitan (10.11.5)

    硬件平臺: nRF51822 (Nordic BLE 芯片)開發板

    什么是嵌入式開發 ?

    基于嵌入式平臺所進行的底層開發,我們稱之為“嵌入式開發”。

    那么現在傳說中的程序猿,哪些猿類是屬于嵌入式開發的呢?

    舉個列子:雖然手機屬于嵌入式設備,但目前人數眾多的APP開發者不屬于嵌入式開發,而是屬于應用開發人員(因為他們都是基于手機操作系統進行編程的)。但手機廠家中那些開發手機底層驅動和底層應用的人員則屬于嵌入式開發。

    目前,因近幾年移動互聯網的大力發展,使得 Web猿 和 APP猿 族群最為龐大。

    什么是交叉編譯?

    簡單來說,在C語言(包括但不限于)編譯過程中會分為四個階段: 預處理 -> 編譯 -> 匯編 -> 鏈接


    但是在以上過程中,需要占用“大量資源”,在嵌入式設備(嵌入式設備的設計要訣之一就是能省則省)中并不具備該資源(如編譯器、足夠快的、內存等),所以需要借助我們的PC平臺進行編譯。這種在一種平臺編譯,另一種平臺運行的編譯,我們稱之為交叉編譯。


    程序是怎樣被創造的?

    在程序被創造到用戶手上的過程中,除了系統提供的APIs,程序員需要三種必不可少工具:

    輸入工具:代碼編輯器,如 Vim,Notepad++、Sublime

    編譯工具:編譯器,可以將人類所寫的代碼轉化為機器能懂的二進制文件,如 GCC、Clang、Javac

    測試工具:程序所運行的環境,如iPhone、Android、PC(Linux、Mac、Windows)

    集成了以上前兩項工具的工具,我們稱之為IDE,如Xcode、Visual Studio 、Eclipse、Keil。

    nRF51822開發工具

    如果你想要跟隨本文一起實驗,首先,你需要購入一塊nRF51822開發板,像這樣的:


    本文主要介紹Mac上的軟件開發工具,在nRF51822開發過程中,軟件我們需要SDK、編譯器以及J-Link驅動軟件:

    nRF5-SDK:SDK由廠商提供,點擊進入官方網站后,選擇目前最新的11.0.0版本進行下載:


    編譯器:下載好官方SDK后,打開SDK中的Makefile.posix文件,可以看到該版本SDK所用的gcc編譯器版本。


    進入到gcc-arm官網后,選擇相對應版本的編譯器下載(相對于Linux和Windows的下載量,Mac版本好慘淡... =_=)


    J-Link驅動:nRF51822采用 J-Link進行程序下載,所以我們需要下載Mac版的J-Link驅動。


    nRF51822環境搭建及測試

    安裝編譯器

    將下載好的編譯工具鏈解壓到 /usr/local 目錄下:

    sudo tar -jxvf gcc-arm-none-eabi-4_9-2015q1-20150306-mac.tar.bz2 /usr/local/
    執行后查看是否成功:


    編譯例子

    進入到下載好的SDK中,找一個例子,如:

    cd $(nRF_51SDK)/examples/ble_peripheral/ble_app_beacon/pca10028/s130/armgcc
    make all


    編譯完成后,會生成相對應的bin文件:

    下載固件至開發板

    J-Link方式寫入

    在安裝完J-Link_for_mac版工具后,我們可以看到系統中已經有了以下命令行工具:


    利用命令行進入J-Link提供的shell中:

    JLinkExe -device nrf51822_xxaa -if swd -speed 4000

    -device 指定了芯片類型,J-Link支持的開發板類型可在jlink_supported_devices查詢。

    輸入燒錄命令:

    J-Link >loadbin s130_nrf51_2.0.0_softdevice.hex 0
    J-Link>loadbin nrf51422_xxac_s130.hex 0x1B000
    J-Link>r
    J-Link>go


    loadbin是燒錄的命令,*.hex是燒錄的固件,0x1B000是燒錄地址。r是reset,go是啟動。

    當flash出現錯誤時,我們需要擦除falsh,此時我們要用Magic方法,分別往兩個地址中寫入1和2:

    J-Link>w4 4001e504 2
    J-Link>w4 4001e50c 1


    可以在Makefile.posix中添加如下命令,讓編譯完成后自動燒錄:

    GNU_INSTALL_ROOT := /usr/local/gcc-arm-none-eabi-4_8-2014q2
    GNU_VERSION := 4.8.3
    GNU_PREFIX := arm-none-eabi
    GDB_PORT_NUMBER := 9992
    FLASH_START_ADDR = $(shell $(OBJDUMP) -h

    $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out -j .text | grep .text | awk {print $$4})

    JLINK_OPTS = -device nrf51822 -if swd -speed 4000

    JLINK_GDB_OPTS = -noir

    JLINK = JLinkExe $(JLINK_OPTS)

    JLINKD_GDB = JLinkGDBServer $(JLINK_GDB_OPTS)

    flash-jlink: flash.jlink

    $(JLINK) flash.jlink

    flash.jlink:

    printf loadbin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(FLASH_START_ADDR)nrngnexitn > flash.jlink

    erase-all: erase-all.jlink

    $(JLINK) erase-all.jlink

    erase-all.jlink:

    # Write to NVMC to enable erase, do erase all, wait for completion. reset

    printf w4 4001e504 2nw4 4001e50c 1nsleep 100nrnexitn > erase-all.jlink

    run-debug:

    $(JLINKD_GDB) $(JLINK_OPTS) $(JLINK_GDB_OPTS) -port $(GDB_PORT_NUMBER)

    .PHONY: flash-jlink flash.jlink erase-all erase-all.jlink run-debug

    利用官方提供的命令行工具

    在 官方固件下載列表中提供了命令行工具:nrfjprog and mergehex。


    其中nrfjprog用于燒錄程序,mergehex用于合并hex文件。安裝好nrfjprog和mergehex工具后,我們只需要在上述的工程目錄下,輸入:

    make flash #燒錄應用程序

    make flash_softdevice #燒錄系統內核


    即可完成固件的燒寫。

    至此,nRF51822 在Mac中的開發環境搭建完畢。



    關鍵詞: 嵌入式 CPU Linux

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 江源县| 丹寨县| 铜鼓县| 灵台县| 弥渡县| 北宁市| 梅河口市| 商都县| 吉林省| 上林县| 冕宁县| 志丹县| 湖南省| 根河市| 深水埗区| 苍溪县| 维西| 云安县| 鄂托克旗| 息烽县| 东明县| 大厂| 环江| 临江市| 沙雅县| 沁水县| 红安县| 阿鲁科尔沁旗| 微山县| 密山市| 右玉县| 阿克陶县| 郯城县| 苍山县| 山东省| 怀远县| 墨江| 河曲县| 嫩江县| 临安市| 平昌县|