我们将编写C代码的功能/单元测试。该C程序将作为嵌入式软件运行。但是,我们需要在Linux环境中运行测试。
问题在于测试中的部分代码如下所示:
my_addresses.h:
#define MY_BASE_ADDRESS (0x00600000)
#define MY_OFFSET_ADDRESS (0x108)
my_code.c
#include "my_addresses.h"
static const My_Type* my_ptr =
(My_Type*)(MY_BASE_ADDRESS + MY_OFFSET_ADDRESS);
/* my_ptr is dereferenced and used ... */
显然,这在Linux主机环境中运行不会很好。
在测试期间,我们是否可以通过某种方式解决此问题?我们能以某种方式"重定向"程序使用其他地址,这些地址是在测试程序中分配的内存的有效地址吗?
我们的第一次尝试是取代" my_addresses.h"在测试期间使用另一个头文件,其中(extern)声明变量而不是硬定义 - 然后将malloc内存分配给MY_BASE_ADDRESS,等等。问题是"静态const" c文件中的声明。当然,您无法将变量赋值给静态const类型。
最好不要修改被测代码(尽管在最坏的情况下可能会出现这种情况)。
答案 0 :(得分:5)
您可以查看例如__linux__
宏并使用条件编译。在Linux上使用数组作为基础,并使其足够大以保留其中所需的所有数据。
像是一样的东西。
#ifdef __linux__
int8_t array[1024];
# define MY_BASE_ADDRESS array
#else
# define MY_BASE_ADDRESS 0x00600000
#endif
答案 1 :(得分:0)
在Linux环境中,您可以定义全局数组,然后使用此地址作为基指针。
const char my_buffer[1024];
#define my_base_addr (&my_buff)
答案 2 :(得分:0)
假设
My_Type
定义为typedef My_Type1_t * My_Type;
您可以(1)将嵌入式内存布局的定义与决定它的放置方式分开,并且如果为布局声明struct
,则可能(2)获得某种类型安全性:
#pragma (essential: stuff to force structs to contain no extra padding)
typedef struct {
char pad0[0x108];
My_Type1_t foo;
char pad1[0x210];
My_Type2_t bar;
...
} Memory_Layout_t;
#pragma (preferably: something to revert to previous struct layout options)
(如果您不想计算pad1
的尺寸,请使用union
。)
然后制作变体:
#ifdef __linux__
Memory_Layout_t Embedded_Memory;
# define Embedded_Memory_P (& Embedded_Memory)
#else
# define Embedded_Memory_P ((Memory_Layout_t *) (0x00600000))
#endif
并用
引用它static const My_Type my_ptr = & Embedded_Memory_P->foo;