如何将数组放置在变量提供的特定存储位置?

时间:2018-06-19 16:59:53

标签: c arrays memory memory-management msp430

对于嵌入式系统项目,应该在RAM中放置一个阵列。我将设备的RAM分为两部分,一个部分存储全局数据和其他数据,另一部分RAM_DATA,我希望存储两个数组(源位置和目标位置)。

有一个全局值mem_val设置为RAM_DATA地址的开头,现在想使源数组从location中存储的位置开始。

根据我从在线资源中获得的信息,他们利用stdint.h头文件来使用uintptr_tuint32_t值来设置数组的开始。调试程序时,数组未从该值开始,并且正在询问如何解决此问题。这是与该问题有关的一些代码。

volatile uintptr_t mem_val = 0x0219;

 int main(void)
 {
      char cur_loc[128];
      uint32_t *cur_loc = (void *)mem_val;
      ...
      return 0;
 }

很显然,数组初始化然后将其作为指针存在问题,但是除此之外,还有没有一种方法可以使数组cur_loc从赋予mem_val的值开始?如果有帮助,我正在使用Texas Instruments MSP430嵌入式设备。谢谢

1 个答案:

答案 0 :(得分:2)

关于MSP430的一些有价值的评论。在这里,我的两分钱涉及到指定内存位置的数组:

  1. volatile uintptr_t mem_val = 0x0219;:如果正确,地址将被“烧录”为二进制。因此,volatile毫无意义,但const会:

    const uintptr_t mem_val = 0x0219;`

    相反,(假设修复程序地址在映射到地址空间的I / O范围内),将数组/指针的内容标记为volatile更有意义:

    volatile uint32_t *cur_loc = (void*)mem_val;
  2. 以下是“重复符号错误”:

    char cur_loc[128];
    uint32_t *cur_loc = (void *)mem_val;

    实际上,第2 nd 行已足够,因为可以像数组一样使用指针。 C没有按照标准进行任何边界检查。因此,指向uint32_t的指针可以像uint32_t个元素的数组那样使用。

  3. 使用一些额外的括号,甚至可以设置数组的地址:

    volatile uint32_t (*curLoc)[128 / sizeof (uint32_t)] = (void*)mem_val;

    但是,要访问数组,必须始终使用“ contents”运算符:(*curLoc)[i]。更不用说,括号是必需的(*curLoc[i]做错了)。

因此,我做了一些示例(作为“反例”,用于3.并练习我的C型能力):

#include <stdint.h>
#include <stdio.h>

int main()
{
  char storage[32] = {
    '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07',
    '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f',
    '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17',
    '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f'
  };
  const uintptr_t mem_val
    = (uintptr_t)&storage; /* 0x0219 <- a fix address wouldn't work on wandbox. */
  enum { size = sizeof storage / sizeof (uint32_t) };
  printf("size: %u\n", size);
  /* using pointer */
  volatile uint32_t *pCurLoc = (uint32_t*)mem_val;
  for (unsigned i = 0; i < size; ++i) printf(" %08x", pCurLoc[i]);
  puts("");
  /* using array */
  volatile uint32_t (*curLoc)[size] = (void*)mem_val;
  for (unsigned i = 0; i < size; ++i) printf(" %08x", (*curLoc)[i]);
  puts("");
  /* done */
  return 0;
}

输出:

size: 8
 03020100 07060504 0b0a0908 0f0e0d0c 13121110 17161514 1b1a1918 1f1e1d1c
 03020100 07060504 0b0a0908 0f0e0d0c 13121110 17161514 1b1a1918 1f1e1d1c

Live Demo on wandbox