当前位置:   article > 正文

关于__attribute__中section部分的一些了解___attribute__((used, section("ram_code_section")))

__attribute__((used, section("ram_code_section")))的作用

诸如我辈菜鸟,对编译器了解比较少,面对代码中出现的陌生字眼真是茫然不知所措。今天查阅了一些资料,总算是有了一点了解,现在将些许理解记录在案。

__attribute__这个关键词是GNU编译器中的编译属性,ARM编译器也支持这个用法。__attribute__主要用于改变所声明或定义的函数或 数据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除 返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。当然,__attribute__肯定有很多的用法,今天就用到了section部分,所以就只针对这个做一些记录。

提到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.编译时为变量指定段

  1. __attribute__((section("name")))
  2. RealView Compilation Tools for µVision Compiler Reference Guide Version 4.0
  3. Home > Compiler-specific Features > Variable attributes > __attribute__((section("name")))
  4. 4.5.6. __attribute__((section("name")))
  5. 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.
  6. Note
  7. This variable attribute is a GNU compiler extension supported by the ARM compiler.
  8. Example
  9. /* in RO section */
  10. const int descriptor[3] __attribute__ ((section ("descr"))) = { 1,2,3 };
  11. /* in RW section */
  12. long long rw[10] __attribute__ ((section ("RW")));
  13. /* in ZI section *
  14. long long altstack[10] __attribute__ ((section ("STACK"), zero_init));/


2.编译时为函数指定段

  1. __attribute__((section("name")))
  2. RealView Compilation Tools for µVision Compiler Reference Guide Version 4.0
  3. Home > Compiler-specific Features > Function attributes > __attribute__((section("name")))
  4. 4.3.13. __attribute__((section("name")))
  5. The section function attribute enables you to place code in different sections of the image.
  6. Note
  7. This function attribute is a GNU compiler extension that is supported by the ARM compiler.
  8. Example
  9. In the following example, Function_Attributes_section_0 is placed into the RO section new_section rather than .text.
  10. void Function_Attributes_section_0 (void)
  11. __attribute__ ((section ("new_section")));
  12. void Function_Attributes_section_0 (void)
  13. {
  14. static int aStatic =0;
  15. aStatic++;
  16. }
  17. In the following example, section function attribute overrides the #pragma arm section setting.
  18. #pragma arm section code="foo"
  19. int f2()
  20. {
  21. return 1;
  22. } // into the 'foo' area
  23. __attribute__ ((section ("bar"))) int f3()
  24. {
  25. return 1;
  26. } // into the 'bar' area
  27. int f4()
  28. {
  29. return 1;
  30. } // into the 'foo' area
  31. #pragma arm section



记录完毕,希望能够给遇到同样问题的朋友些许帮助。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/246750
推荐阅读
相关标签
  

闽ICP备14008679号