1

我想为闪存访问模块编写一些单元测试。我有

extern char_t _internal_flash_start[]; /**< Exported from ICF file. */
extern char_t _internal_flash_end[]; /**< Exported from ICF file. */

我认为将我自己的数组作为闪存内容注入是完美的,因为在应用程序中这些符号是通过链接器文件提供的。在我的测试中,我想要类似的东西:

char_t _internal_flash_start[2048]; /**< Exported from ICF file. */
char_t _internal_flash_end[1];

但是我需要第二个数组在第一个数组之后开始。我尝试了很多,但我无法让它为我工作。有没有办法实现给定的声明并在内存中有连续的数组?

[编辑 1/2021]

我需要_internal_flash_end位于的地址,_internal_flash_start + sizeof(_internal_flash_start)因为代码必须通过这些名称引用数组。

4

1 回答 1

0

我需要第二个数组在第一个数组之后开始。

形成一个struct

struct my_data {
  char_t _internal_flash_start[2048]; /**< Exported from ICF file. */
  char_t _internal_flash_end[1];
} x;

仍然有可能在成员之间存在填充:当然不可能使用char_t [2048].

特定的实现packed将确保没有填充。


一个迂腐的解决方案会创建一个数组并使用指向它的各个部分的指针。然而现在我们有 2 个指针,而不是两个数组。他们的sizeof意志与上面不同。

char_t _internal_flash[2048+1];
char_t *_internal_flash_start = &_internal_flash[0];
char_t *_internal_flash_end   = &_internal_flash[2048];

OP补充说:

我需要_internal_flash_end位于的地址,_internal_flash_start + sizeof(_internal_flash_start)因为代码必须通过这些名称引用数组。

可以用union和求解define_internal_flash_start仍然是一个数组。

union {
  char_t both[2048 + 1];
  char_t start[2048];
} _internal_flash;
#define _internal_flash_start (_internal_flash.start)
#define _internal_flash_end (_internal_flash_start + sizeof _internal_flash_start)

用法

int main() {
  printf("%p\n", _internal_flash_start);
  printf("%p\n", _internal_flash_end);
  printf("%zu\n", sizeof _internal_flash_start);
}

输出

0x10040b020
0x10040b820
2048
  

如果代码需要_internal_flash_end作为数组而不仅仅是指针,请使用特定的实现packed

struct __attribute__((packed)) { // gcc specific
  char_t start[2048];
  char_t end[1];
} _internal_flash;
#define _internal_flash_start (_internal_flash.start)
#define _internal_flash_end   (_internal_flash.end)
于 2020-12-20T18:02:37.723 回答