我最近在一些嵌入式软件中遇到过这行C代码,但我从未见过这种语法。我认为这与将内容存储在非初始化内存中有关(但我可能完全错误)。
char *SomeName1 @ ".noinit";
还有
#### #define DEF 100
char SomeName[DEF] @ ".noinit";
任何?
答案 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
个部分,但您可以添加
您喜欢的任何零初始化部分,并直接控制这些部分的时间和方式
部分已初始化。