gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:00:33 25 4
gpt4 key购买 nike

对于嵌入式系统项目,一个数组应该放在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 嵌入式设备。谢谢

最佳答案

有一些关于 MSP430 的有值(value)的评论。在这里,我对指定内存位置的数组的两分钱:

  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;

    实际上,第 2nd 行就足够了,因为指针可以像数组一样使用。 C 没有按照标准进行任何绑定(bind)检查。因此,指向 uint32_t 的指针可以用作 uint32_t 元素的数组。

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

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

    但是,要访问数组,必须始终使用“内容”运算符:(*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

关于c - 如何将数组放置在变量提供的特定内存位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50933494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com