对于嵌入式系统项目,应该在RAM中放置一个阵列。我将设备的RAM分为两部分,一个部分存储全局数据和其他数据,另一部分RAM_DATA,我希望存储两个数组(源位置和目标位置)。
有一个全局值mem_val
设置为RAM_DATA地址的开头,现在想使源数组从location
中存储的位置开始。
根据我从在线资源中获得的信息,他们利用stdint.h
头文件来使用uintptr_t
和uint32_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嵌入式设备。谢谢
答案 0 :(得分:2)
关于MSP430的一些有价值的评论。在这里,我的两分钱涉及到指定内存位置的数组:
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;
以下是“重复符号错误”:
char cur_loc[128];
uint32_t *cur_loc = (void *)mem_val;
实际上,第2 nd 行已足够,因为可以像数组一样使用指针。 C没有按照标准进行任何边界检查。因此,指向uint32_t
的指针可以像uint32_t
个元素的数组那样使用。
使用一些额外的括号,甚至可以设置数组的地址:
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