ARM指令整理
阿新 • • 發佈:2018-12-11
1.__set_PRIMASK(0)
PRIMASK是隻有單一位元的暫存器。置為1後,就關掉所有可遮蔽異常,只剩下NMI和硬Fault可以響應。預設值是0,表示沒有關閉中斷。
簡單來說,使用__set_PRIMASK(1)關閉中斷;__setPRIMASK(0)開啟中斷。
2.__attribute__(section(".noinit"),zero_init)
提到section,就得說RO RI ZI了,在ARM編譯器編譯之後,程式碼被劃分為不同的段,RO Section(ReadOnly)中存放程式碼段和常量,RW Section(ReadWrite)中存放可讀寫靜態變數和全域性變數,ZI Section(ZeroInit)是存放在RW段中初始化為0的變數。
__attribute__((section("section_name"))),其作用是將作用的函式或資料放入指定名為"section_name"對應的段中。
MDK給出的幫助文件如下,他將__attribute__的用法歸類到編譯器特性裡,以變數和函式的兩種用法做區分。
1.編譯時為變數指定段
__attribute__((section("name"))) RealView Compilation Tools for µVision Compiler Reference Guide Version 4.0 Home > Compiler-specific Features > Variable attributes > __attribute__((section("name"))) 4.5.6. __attribute__((section("name"))) Normally, the ARM compiler places the objects it generates in sections like data and bss. However, you might require additional data sections or you might want a variable to appear in a special section, for example, to map to special hardware. The section attribute specifies that a variable must be placed in a particular data section. If you use the section attribute, read-only variables are placed in RO data sections, read-write variables are placed in RW data sections unless you use the zero_init attribute. In this case, the variable is placed in a ZI section. Note This variable attribute is a GNU compiler extension supported by the ARM compiler. Example /* in RO section */ const int descriptor[3] __attribute__ ((section ("descr"))) = { 1,2,3 }; /* in RW section */ long long rw[10] __attribute__ ((section ("RW"))); /* in ZI section * long long altstack[10] __attribute__ ((section ("STACK"), zero_init));/
2.編譯時為函式指定段
__attribute__((section("name"))) RealView Compilation Tools for µVision Compiler Reference Guide Version 4.0 Home > Compiler-specific Features > Function attributes > __attribute__((section("name"))) 4.3.13. __attribute__((section("name"))) The section function attribute enables you to place code in different sections of the image. Note This function attribute is a GNU compiler extension that is supported by the ARM compiler. Example In the following example, Function_Attributes_section_0 is placed into the RO section new_section rather than .text. void Function_Attributes_section_0 (void) __attribute__ ((section ("new_section"))); void Function_Attributes_section_0 (void) { static int aStatic =0; aStatic++; } In the following example, section function attribute overrides the #pragma arm section setting. #pragma arm section code="foo" int f2() { return 1; } // into the 'foo' area __attribute__ ((section ("bar"))) int f3() { return 1; } // into the 'bar' area int f4() { return 1; } // into the 'foo' area #pragma arm section