微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用C在特定内存位置声明二维整数数组

如何解决用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

编辑。评论改变了要求。您需要更改链接脚本。

  1. 添加内存区域(长度gas由你设置,因为我不知道它是多少):
#define

在部分添加新部分

MEMORY
{
     /* the stuff which was already here */
     SHAREDMEM (rw) : ORIGIN = 0x10000,LENGTH = 32M
}  
  1. 在您的 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 举报,一经查实,本站将立刻删除。