1. 程式人生 > >【008】ARM gcc編譯指令

【008】ARM gcc編譯指令

ARM gcc編譯指令

關鍵詞:gcc,ARM,Eclipse,STM32,嵌入式

  在“【002】搭建開源嵌入式整合開發環境”和“【003】使用GNU ARM工具鏈進行STM32開發”兩篇博文中介紹了基於GUN的STM32開發環境搭建。在編譯和連線的過程中,均採用系統預設的設定,生成的檔案可以在嵌入式系統中正常執行,並符合預期的結果。嵌入式開發需要根據具體的需求來合理剪裁,以實現效能和成本的雙贏局面。本文對於基於ARM gcc的編譯和連線指令進行介紹,以方便產生緊湊可靠地檔案。

ARM晶片相關設定(Machine-DependentOptions)

圖1 EclipseTarget Processer 截圖

  如圖1所示為Eclipse建立工程中Target Processer頁面的截圖,下面為該頁面下編譯指令解析:

  -mthumb-interwork 生成支援在ATM和Thumb指令之間互相呼叫的程式碼。

  -mfloat-abi=name 指定要使用的浮點ABI。可以是“soft”生成的程式碼使用軟體模擬浮點計算,“softfp”生成的程式碼使用硬體浮點指令,但是軟體浮點呼叫規則,“hard”生成硬體浮點指令程式碼且使用特定FPU呼叫規則。(softfp的意義在哪裡?)

  -mlittle-endian 採用小端模式

  -mbig-endian 採用大端模式

  -march=name 指定ARM架構,如“armv7-a”,“armv7-m”,“armv7-r”,“armv7e-m”等

  -mcpu=name 指定ARM處理器的型號,如“cortex-m4”等

  -mfpu=name 指定硬體FPU型號,如“vfpv2”等

  -mthumb 使用Thumb指令集

  -marm 使用ARM指令集

  -munaligned-access

  -mno-unaligned-access 使能(失能)從非對其的16位或32位地址處讀寫16為或32位數值

優化選項(Optimization)

圖2優化選項頁面截圖

  如圖2所示為Eclipse建立工程中優化頁面截圖,下面為相關編譯指令解析:

  -00(-O1,-O2,-O3)編譯優化等級,數字越大優化越多。

  -fmessage-length=n 格式化錯誤輸出資訊,如果n=0,那麼每條錯誤資訊為一行

  -fsigned-char 設定char為有符號型別

  -ffunction-sections 在編譯的時候把每個函式作為一個section

  -fdata-sections 在編譯的時候把每個資料作為一個section。其中每個sections名與function或data名保持一致,能夠減小生成檔案的大小。

  -fno-common 在編譯過程中,禁止將未初始化的全域性變數放到common段。

  -fno-inline忽略程式碼中的 inline 關鍵字,該選項使編譯器將行內函數以普通函式對待;等同無優化選項時的處理。

  -ffreestanding 按獨立環境編譯,該環境可以沒有標準庫,且對main()函式沒有要求。最典型的例子就是作業系統核心。該選項隱含設定了 -fno-builtin,且與 -fno-hosted 等價。

  -fno-builtin 不適用C語言內建函式。

  -fsingle-precision-constant 將浮點常量作為單精度常量對待。

  -fPIC 生成PIC(Position-IndependentCode),以達到動態連結的目的。

  -flto 優化連線時間。

  -fmove-loop-invariants 使能迴圈優化,將不變部分放在迴圈外執行。

Warnings設定選項

圖3 Eclipse Warning配置頁面

  如圖3所示為Eclipse建立工程中Warning頁面截圖,下面為相關編譯指令解析:

  -fsyntax-only 檢查程式中的語法錯誤,但是不產生輸出資訊。

  -pedantic 允許發出ANSI C標準所列的全部警告資訊。

  -pedantic-errors 允許發出ANSIC標準所列出的錯誤。

  -Wall 編譯後顯示所有警告

  -W 與-Wall類似,會顯示警告,但是僅顯示編譯器認為會出現錯誤的警告。

  -Wunused 提升為使用的函式或變數。

  -Wuninitialised 提示為初始化的變數。

  -Wextra 列印一些額外的警告資訊。

  -Wmissing-declarations 提示聲明確實。

  -Wconversion 提示非顯示轉換。

  -Wpointer-arith 對函式指標或者void *型別的指標進行算術操作時給出警告。

  -Wpadded 開啟包含padding提示。

  -Wshadow 當局部變數遮蔽了引數,全域性變數時,進行提示。

  -Wlogical-op 警告表示式中邏輯運算子的可疑用法。

  -Wfloatequal 警告使用了浮點數相等判定

  -Werror 將所有的警告當做錯誤來處理

連線設定選項

圖4Eclipse 連線頁面

  如圖4示為Eclipse建立工程中連線頁面截圖,下面為相關編譯指令解析:

  -nostartfiles 在連線之時不使用標準的系統啟動檔案。

  -nodefaultlibs 在連線之時,不使用標準的系統庫

  -nostdlib 在連線之時,即不使用標準的系統啟動檔案也不使用標準的系統庫。

  -Xlinker option 傳遞選項作為聯結器的選項,可以用來提供特定系統下GCC不能識別的連線選項

聯絡作者


相關推薦

008ARM gcc編譯指令

ARM gcc編譯指令關鍵詞:gcc,ARM,Eclipse,STM32,嵌入式  在“【002】搭建開源嵌入式整合開發環境”和“【003】使用GNU ARM工具鏈進行STM32開發”兩篇博文中介紹了基

gcc編譯使用gcc編譯動態庫

測試程式碼是在Ubuntu18.04測試。 程式碼如下: hello.c #include <stdio.h> #include "myprint.h" int main() { pri

筆記搭建OpenWrt編譯環境

阿裏雲 開發指南 什麽 checkout ubun 編譯環境 服務 保存 open 參考書目《B智能路由開發指南》 目標:搭建一個OpenWrt編譯環境,可以同時在家裏和公司使用。 【2018-09-13】   剛開始想用自己的電腦共享遠程桌面,但不知道什麽原因

lvs fullnat+ECMP1內核編譯

python wget ros onf driver sym lpc quit mac 0、請使用物理機安裝,虛擬機沒編譯成功 1、先查看一下系統版本,需要是centos6,內核2.6 cat /etc/*release uname -r [root@lvs-fullna

Rsync使用Cygwin編譯Windows版本的Rsync

一、Rsync簡介 wiki-Rsync Rsync是類unix系統下的資料映象備份工具——remote sync。一款快速增量備份工具 Remote Sync,遠端同步 支援本地複製,或者與其他SSH、rsync主機同步。 特性: 1、能更新整個目錄和樹和檔案

makefile多平臺編譯以及makefile自動化編譯總結

Date: 2018.9.30 1、前言     同一套庫程式碼往往需要在不同體系架構或系統上的機器和裝置上編譯和執行,這就需要我們熟悉不同平臺上的編譯方法以及測試方法,本文旨在講述多平臺編譯方法以及makefile自動化編譯的總結。 2、多平臺編譯之Windows平臺

GISCesium1.49編譯

1、npm install 2、npm install --save-dev gulp 3、gulp default 4、npm run build 5、npm start   遇到問題 1、gulp不好使 https://www.cnblogs.com/defineconst/p/

筆記ARM架構和ARM晶片(三)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

筆記ARM架構和ARM晶片(二)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

APK反編譯

exce class文件 可執行jar包 bat tails .bat 新版 升級 文本編輯器 學習和開發Android應用有一段時間了,今天寫一篇博客總結一下Android的apk文件反編譯。我們知道,Android應用開發完成之後,我們最終都會將應用打包成一個apk文件

androidAndroid平臺編譯makefile編寫規則

Date: 2018.10.9 1、參考 https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/ https://blog.csdn.net/yuanjize1996/article/det

QtQTest:編譯Qt單元測試程式

一、使用方法 1、測試程式原始碼 TestQString.pro QT += testlib QT -= gui TARGET = tst_TestQStringTest CONFIG += console CONFIG -= app_bund

caffe模板分離編譯模式和工廠模式

本文轉自: https://blog.csdn.net/raby_gyl/article/details/68489152  caffe中的模板分離編譯模式和工廠模式 1.caffe中模板分離編譯模式的實現方式是在每一個模板原始檔的最後新增一條類似於下面的語句: INST

MyBatis 多種查詢處理- 008

使用association分步查詢: 延遲載入:需要的資訊在使用的時候查詢 在分步查詢的基礎上,在<settiing>中開啟懶載入,LazyLoadingEnable value=“true” aggressiveLazyLoading val

Vue通過自定義指令回顧 v-內建指令

Vue.js 的各種指令(Directives)更加方便我們去資料驅動 DOM,例如 v-bind、v-on、v-model、v-if、v-for、v-once 等內建指令,這些指令的職責就是當表示式改變時將某些行為應用到 DOM 上,儘量不去操作增刪改 DOM。通過了解如何去自定義指

linuxlinux下find指令的用法總結

前言:  先闡述下find指令是幹嘛的,為什麼要來研究他呢?find指令是Linux下一個很重要的操作,因為linux是一個“一切皆檔案”的作業系統,find(查詢檔案)指令就尤為重要了,在windows作業系統下,我們查詢一個檔案可以直接在計算機中搜索檔案,但是linux作

專欄 - ARM與ZYNQ與rtems與linux之旅

ARM與ZYNQ與rtems與linux之旅 zynq 7000是xilinx公司的soc產品,搭載雙核ARM cortex A9處理,ARM相關知識必不可少,對於雙核,一個執行linux,一個執行裸核或者rtos。筆者選擇研究開

Qt全域性忽略編譯警告

msvc編譯器從2010 sp1開始就已經支援UTF-8的原始碼檔案了,然後到vs2012又不支援了,官方表示是BUG。到目前最新的vs2013就解決了這個問題。。。 但是在編譯時仍然會出現4819的警告 網上搜了下答案,都說用“#pragma warning(dis

python關於py2exe編譯py時用到的配置檔案

兩個個星期前我還是用的py2exe,現在改用pyinstaller了 不是說py2exe不好用,主要是pyinstaller更加好用~(沒毛病) 用py2exe是,下載安裝好後編譯成exe,需要一個setup.py (用來生成你的圖示版權資訊之類) 貼上自己的原始碼 # -

008Python全棧日記-函式

一、函式介紹 函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。 函式能提高應用的模組性,和程式碼的重複利用率。你已經知道Python提供了許多內建函式,比如print()。但你也可以自己建立函式,這被叫做使用者自定義函式。 如果在開發程式時,需要某塊程式碼多次,但是