1. 程式人生 > >ARM指令整理

ARM指令整理

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