C AUTOSAR的内存映射
我是AUTOSAR和嵌入式系统的新手 我的项目将变量与memmap一起定义为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
#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)
)。如果你更关心变量是否存在,你知道如何知道这些变量在正常或特殊的内存中吗?