不确定这行代码是做什么的。 (ARM嵌入式软件)

时间:2014-07-26 18:08:35

标签: c embedded arm

我最近在一些嵌入式软件中遇到过这行C代码,但我从未见过这种语法。我认为这与将内容存储在非初始化内存中有关(但我可能完全错误)。

char *SomeName1 @ ".noinit";

还有

#### #define DEF 100

char SomeName[DEF] @ ".noinit";

任何?

4 个答案:

答案 0 :(得分:2)

如果您阅读的代码是用IAR ARM编译器编译的,那么请阅读the IAR C/C++ Development Guide

中的以下摘录。
  
      
  • @运算符和#pragma location指令   安置
  •   
     

使用@运算符或#pragma location指令   在命名中放置函数组或全局和静态变量   部分,没有明确控制每个对象。部分   例如,可以放在特定的记忆区域,或   使用section和section以受控方式初始化或复制   终端运营商。如果您想要一个接口,这也很有用   单独链接的单元,例如应用程序项目和引导   装载机项目。绝对控制时使用命名部分   不需要放置单个变量,也不需要放置。

然后指针和数组都将被放置在内存的no-init部分中。即启动代码不会打扰初始化这些变量,因此程序第一次访问它们时,它们(可能)可能包含垃圾值。

答案 1 :(得分:1)

这似乎是place-at / section / segment规范的变体。通常使用Pragma。代码可能意味着“链接器,将其置于部分.noinit ...并且链接器脚本将其放置在非初始化的内存部分中”

答案 2 :(得分:1)

它是一个特定于编译器的扩展(也许是IAR EWARM编译器?),用于在特定链接器部分中定位变量。它不是标准C - 不同的编译器为执行类似的事情提供了不同的方法。它还可用于定位特定地址。毫无疑问,你的compiler documentation会详细说明。

答案 3 :(得分:1)

对于没有内容的部分(零初始化部分),情况正好相反。该 链接器在应用程序启动时安排所有这些部分的零初始化,除外 对于中未提及指令中提到的那些。通常,只 {em>不初始化指令中指定了.noinit个部分,但您可以添加 您喜欢的任何零初始化部分,并直接控制这些部分的时间和方式 部分已初始化。

enter image description here