如何解决用C在特定内存位置声明二维整数数组
我正在 BeagleBone Black MCU 上用 C 编写。 我需要创建一个 2D unsigned int 数组来存储一些从两个传感器收集的模拟数据。 目前,我为每个传感器的数据设置了单独的 unsigned int 数组,但我想将其更改为一个二维变量,其中一维是数据来源的传感器。
这是我到目前为止所拥有的,它工作得很好。 (如果格式不正确,我深表歉意。我尝试将代码加粗,但它在 Chrome 中似乎并没有像我期望的那样工作。)
#define SHARE_MEM 0x10000
#define E_RING_BUFFER_SIZE 200
volatile unsigned int *DetTSampleSet = (unsigned int *) SHARE_MEM;
volatile unsigned int *DetBSampleSet = (unsigned int *) (SHARE_MEM + (E_RING_BUFFER_SIZE * sizeof(unsigned int)));
我相信这段代码可以确保 DetBSampleSet 位于 DetTSampleSet 之后,没有重叠。它工作正常。我可以像这样使用这些变量。
int pnr;
for (pnr = 0; pnr <10;pnr++)
{
// do some stuff to get RawAnalog from sensor T.
DetTSampleSet[pnr] = RawAnalog;
// do some stuff to get RawAnalog from sensor B.
DetBSampleSet[pnr] = RawAnalog;
}
我想要的是这个。
int pnr;
for (pnr = 0; pnr <10; pnr++)
{
// do some stuff to get RawAnalog from sensor T (0)
DetSampleSet[0][pnr] = RawAnalog;
// do some stuff to get RawAnalog from sensor B (1)
DetSampleSet[1][pnr] = RawAnalog;
我想我可以像这样将其声明为该内存空间中的第一个变量。
#define SHARE_MEM 0x10000
#define E_RING_BUFFER_SIZE 200
volatile unsigned int *DetSampleSet = (unsigned int *) SHARE_MEM
如果我这样做,我认为我不必担心这些数据在内存中的实际结构
是前四个字节 DetSampleSet[0][0] 和接下来的四个字节 DetSampleSet[0][1] 或 DetSampleSet[1][0] 因为我不打算使用任何指针/地址访问这些数据?
但是,如果我想在与此变量相邻的内存中声明另一个没有重叠的变量,我是否只是像这样将大小偏移量加倍?
volatile unsigned int *NewIntvariableAfterFirstOne = (unsigned int *) (SHARE_MEM + (E_RING_BUFFER_SIZE * 2 * sizeof(unsigned int)));
感谢大家的帮助和耐心,因为我在将近 30 年后重新开始使用 C。
感谢您的评论和回答。我试图发表回复,但似乎我无法详细评论,但必须添加到我原来的问题中。所以这里是...
所以,我很容易承认有时会迷失在像这样的指针声明中。我发布的原始代码工作正常。我需要在这个内存空间中声明多个变量,所以我主要关心的是正确声明它们以免覆盖一个。基本上,确保声明的下一个变量的开始超过先前声明的变量的末尾。因此,例如,如果指向整数变量 A 的指针用作 X 元素的一维数组,那么 Xsizeof(int) 应该是下一个变量的安全开始,比如整数变量 B。对?如果我想将变量 A 用作要作为二维数组访问的数组,那么我只需执行 2X*sizeof(int) 来获取 A 之后的下一个变量的开始,对吗?
解决方法
假设首先根据您的 C 实现,以您正在执行的方式创建指针值是有效且适当的,那么您需要将指针声明为指向数组的指针,并适当施放:
//database arraylist
ArrayList<VarList> database=new ArrayList<VarList>();
database.add(new VarList(105,19,"b"));
database.add(new VarList(101,18,"c"));
database.add(new VarList(106,54,"database"));
//object array list
ArrayList<VarList> object=new ArrayList<VarList>();
object.add(new VarList(105,"b"));
database.add(new VarList(106,"database"));
List<VarList> resultList = new ArrayList<VarList>();
for(VarList user1 : database) {
for(VarList user2 : object) {
if(user1.getName().equals(user2.getName())) {
resultList.add(user2);
}
System.out.println(resultList);
}
}
然后,您应该能够通过双重索引 #define SHARE_MEM 0x10000
#define E_RING_BUFFER_SIZE 200
volatile unsigned int (*DetSampleSet)[E_RING_BUFFER_SIZE] =
(unsigned int (*)[E_RING_BUFFER_SIZE]) SHARE_MEM;
来访问该块,正如您所说的那样,DetSampleSet
的所有值都在内存中连续排列,并且紧接在 DetSampleSet[0]
的值之前{1}}。
我宁愿建议在访问硬件固定大小的整数时使用
您可以使用指向数组的指针:
watcher,err := clientset.CoreV1().Events(namespace).Watch(ctx,metav1.ListOptions{
FieldSelector: "involvedObject.kind=Pod,involvedObject.name=<pod-name>",})
#define SHARE_MEM 0x10000
#define E_RING_BUFFER_SIZE 200
typedef int32_t buff[E_RING_BUFFER_SIZE];
#define DetSampleSet ((volatile buff *)SHARE_MEM)
//example usage
int32_t foo(size_t sample,size_t sensor)
{
return DetSampleSet[sensor][sample];
}
用于避免不必要的内存读取。
https://godbolt.org/z/c45rKvvvh
编辑。评论改变了要求。您需要更改链接脚本。
- 添加内存区域(长度gas由你设置,因为我不知道它是多少):
#define
在部分添加新部分
MEMORY
{
/* the stuff which was already here */
SHAREDMEM (rw) : ORIGIN = 0x10000,LENGTH = 32M
}
- 在您的 C 代码中:
.shared_mem_section (NOLOAD):
{
shared_mem_section_start = .;
KEEP(*(.shared_mem_section))
KEEP(*(.shared_mem_section*))
shared_mem_section_end = .;
} > SHAREDMEM
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。