Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C AUTOSAR的内存映射_C_Memory_Memory Management_Embedded_Autosar - Fatal编程技术网

C AUTOSAR的内存映射

C AUTOSAR的内存映射,c,memory,memory-management,embedded,autosar,C,Memory,Memory Management,Embedded,Autosar,我是AUTOSAR和嵌入式系统的新手 我的项目将变量与memmap一起定义为autosar标准的一部分,如下所示 #define ABC_START_SEC_VAR_CLEARED_BOOLEAN #include "abc_MemMap.h" boolean var1_b; boolean var2_b; #define ABC_STOP_SEC_VAR_CLEARED_BOOLEAN #include "abc_MemMap.h" ->var1_b和var

我是AUTOSAR和嵌入式系统的新手 我的项目将变量与memmap一起定义为autosar标准的一部分,如下所示

#define ABC_START_SEC_VAR_CLEARED_BOOLEAN
#include "abc_MemMap.h"
   boolean var1_b;   
   boolean var2_b;        
#define ABC_STOP_SEC_VAR_CLEARED_BOOLEAN
#include "abc_MemMap.h"
->var1_b和var2_b将被安排到特定的内存中 如果有人犯了下面的错误

boolean var1_b;   
boolean var2_b;
他们忘记了包括ABC\u START\u SEC\u VAR\u CLEARED\u BOOLEAN和STOP,当我构建时->没有错误发生 那么你对这一点怎么看

var1和var2在内存中的排列位置是什么? 你有没有办法检测到这一点,因为编译是通过的,编译器无法识别这个错误


谢谢

您应该按照AUTOSAR正确初始化变量。您可以从AUTOSAR编译器抽象规范文档中找到变量声明原型

根据AUTOSAR,您的变量声明应如下所示:

#define ABC_START_SEC_VAR_CLEARED_BOOLEAN
#include "abc_MemMap.h"
VAR(boolean, ABC_VAR_CLEARED) var1_b;
VAR(boolean, ABC_VAR_CLEARED) var2_b;
#define ABC_STOP_SEC_VAR_CLEARED_BOOLEAN
#include "abc_MemMap.h"

您必须将ABC_VAR_CLEARED memory类添加到链接器文件中,完成编译过程后,
var1_b
var2_b
将分配到映射文件的ABC_VAR_CLEARED部分下。

这是Autosar堆栈开发中内存映射的一般问题

var1和var2在内存中的排列位置:

它将被放入未映射和未初始化的内存部分,通常是
非bss或.data
部分。根据链接器文件中分配的基于微控制器的内存对齐和内存部分大小,var1和var2将放置在相邻的内存位置上。了解var1和var2所在位置的最佳方法是转到编译后生成的
.map
,您可以找到映射部分和地址。 要了解有关内存类型的更多信息,请使用此

你有办法检测到这一点吗?:

我假设当前内存映射是在项目中的
memmap.h
中完成的,在该项目中,您正在使用
\define ABC\u START\u SEC\u VAR\u CLEARED\u BOOLEAN等标记进行节映射
我更喜欢的解决方案是在
memmap.h
文件下设置
#ifdef
条件。 通过这种方式,在这个
memmap.h
的最后,您将拥有
#否则
条件,您可以引入
#错误
及其消息,并可以创建编译错误。 你可以看到这个问题的语法

上述解决方案有一个缺点,即。
此条件方法不表示哪个映射节有问题,但表示又有一个映射节错误,然后所有者需要手动检查错误映射发生的位置。

如果不使用宏或不包含头文件,则只有两个正常的C变量定义。标准编译器无法检测到这些变量不应该是正常的全局(我假设)变量。您不能使用宏吗?(即
断言(var1_b==FALSE)
)。如果你更关心变量是否存在,你知道如何知道这些变量在正常或特殊的内存中吗?