ARM編譯程序參考

ARM 204瀏覽

from:

http://mcuos.com/thread-2843-1-1.html

————————————————————————————————————————————————————————————

ARM編譯程序參考

介紹ARM編譯程序的ARM特有方面,包括:

Pragmas? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 編譯指示

Function keywords? ?? ?? ?? ?? ?? ???函數關鍵字

Variable declaration keywords 變量聲明關鍵字


Pragmas

ARM編譯程序可識別一下格式的編譯指示:

#pragma [no_] feature-name

編譯指示優于相關的命令行選項。

能識別的編譯選項如下:



Pragma name

? ? ? ??

Default

? ? ? ??

Reference

arm section

? ? ? ??

Off

? ? ? ??

Pragmas controlling code generation

check_printf_formats

? ? ? ??

Off

? ? ? ??

Pragmas controlling printf and scanf argument checking

check_scanf_formats

? ? ? ??

Off

? ? ? ??

Pragmas controlling printf and scanf argument checking

check_stack

? ? ? ??

On

? ? ? ??

Pragmas controlling code generation

debug

? ? ? ??

On

? ? ? ??

Pragmas controlling debugging

import

? ? ? ??


? ? ? ??

code generation

Ospace

? ? ? ??


? ? ? ??

optimization

Otime

? ? ? ??


? ? ? ??

optimization

Onum

? ? ? ??


? ? ? ??

optimization

softfp_linkage

? ? ? ??

Off

? ? ? ??

code generation




? ? * check_printf_formats


該編譯指示標記類似于printf的函數,如果存在文字格式串,則對照進行類型檢查。

#pragma check_printf_formats

extern void myprintf(const char *format, …);

#pragma no_check_printf_formats


? ? * check_scanf_formats


該編譯指示對聲明為類似于scanf的函數做標記,以便對照文字格式串檢查自變量的格式。

#pragma check_scanf_formats

extern void myformat(const char *format, …);

#pragma no_check_scanf_formats


? ? * debug 該編譯指示可打開或關閉調試表生成, 如果指定#pragma no_debug,則不會為隨后的聲明和函數生成調試信息表條目,直到下一個#pragma debug出現。

? ? * Pragmas controlling optimization


Ospace

Otime

Onum


? ? * Pragmas controlling code generation

? ?? ?? ? o check_stack 如果已經使用了#pragma no_check_stack和-apcs/swst命令行選項禁止棧檢查,則該編譯指示可使的檢查是否違反了棧限制的函數入口代碼的重新生成。

? ?? ?? ? o once? ?? ?? ?? ? 同#ifndef …#endif效果相類似,用于頭文件。但一般推薦使用#ifndef…#define。

? ?? ?? ? o softfp_linkage? ?該編譯指示指定了至下一個#pragma no_softfp_linkage之間的所有函數聲明描述了使用軟件浮點鏈接的函數。__softfp關鍵字與該編譯指示的效果相同

? ?? ?? ? o import(symbol_name) 該編譯指示生成對symbol_name的導入引用。同如下匯編語言相同:IMPORT symbol_name。符號名作為外部符號放在映像的符號表中。

? ?? ?? ? o arm section section_sort_list This pragma specifies the code or data section name that used for subsequent function or objects.This include definitions of anonymous objects the compiler creates for initializations.該編譯指示可指定代碼或數據段的名稱用于隨后的函數或對象。包括編譯程序為初始化而創建的匿名對象的定義。該選項對一下情況沒有影響:


內聯函數(及其局部靜態變量)

模板實例(及其局部靜態變量)

消除未使用的變量和函數

將定義寫入目標文件中的順序

? ?? ?? ?? ?? ?? ?? ?? ?該編譯指示完整語法為:

? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#pragma arm section [sort_type[[=]“name”]][,sort_type=??

“name”]

? ?? ?? ?? ?? ?? ?? ?? ?此處name用于段名稱,sort_type可為如下之一code, rwdata, rodata

? ?? ?? ?? ?? ?? ?? ?? ?和zidata。若指定sort_type,沒有指定name,則sort_type的段名被

? ?? ?? ?? ?? ?? ?? ?? ?重新設置為默認值。單獨輸入#pragma arm section,則所以對象段的

? ?? ?? ?? ?? ?? ?? ?? ? 恢復為其默認值

int x1 = 5;? ?? ?? ?? ?? ?? ?? ?// in .data (default)

? ? int y1[100];? ?? ?? ?? ?? ?? ???// in .bss (default)

? ? int const z1[3] = {1,2,3};? ?? ?// in .constdata (default)

#pragma arm section rwdata = "foo", rodata = "bar"


int x2 = 5;? ?? ?? ?? ?? ?? ?? ?// in foo (data part of region)

int y2[100];? ?? ?? ?? ?? ?? ???// in .bss

? ???int const z2[3] ={1,2,3};? ?? ?// in bar

??char *s2 = "abc";? ?? ?? ?? ?? ?// s2 in foo, "abc" in bar

??#pragma arm section rodata

??int x3 = 5;? ?? ?? ?? ?? ?? ?? ?// in foo

??int y3[100];? ?? ?? ?? ?? ?? ???// in .bss

? ?? ?int const z3[3] ={1,2,3};? ?? ?// in .constdata

??char *s3 = "abc";? ?? ?? ?? ?? ?// s3 in foo, "abc" in .constdata

??#pragma arm section code = "foo"

? ?int add1(int x)? ?? ?? ?? ?? ?? ? // in foo (code part of region)

? ?? ?{

? ?? ???return x 1;

? ?? ?}?

? ? #pragma arm section code



使用分散加載描述文件和鏈接程序,以控制將命名段放置在存儲器中

? ?? ?? ?? ?? ?? ?? ?? ? 的特定地址。

·? ?? ?? ? Function keywords

一些關鍵字指示編譯程序對其某個函數進行特殊處理。包括函數內的聲明,函數限定符及函數存儲類限定符。即Declarations inside function, Function qualifiers and Function storage.

? ?? ?__asm{assembler-code} 指示編譯程序該語句是用匯編語言編寫的。

? ?? ?__irq? ?? ?This enables a C or C function to be used as an interrupt routine called by the IRQ, or FIQ vectors. All corrupted registers except floating-point registers are preserved, not only those that are normally preserved under the ATPCS. The default
ATPCS mode must be used. The function exits by setting the pc to lr-4 and the CPSR to the value in SPSR. It is not available in tcc or tcpp. No arguments or return values can be used with __irq functions.

? ?? ?__pure? ?? ?指明函數聲明為純的。純函數沒有了公共子表達式。默認情況下,函數假定是不純的(產生副作用)。純函數需要滿足:其結果僅取決于其自變量的值;沒有副作用,其不能調用非純函數。不能使用全局變量或廢棄指針,同一參數兩次調用純函數,返回應該相同。
?

七星彩走势图2元网官网