Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中的特定内存位置创建数据结构_C_Arrays_Memory - Fatal编程技术网

在c中的特定内存位置创建数据结构

在c中的特定内存位置创建数据结构,c,arrays,memory,C,Arrays,Memory,我正在开发一个嵌入式mcu,它有两个内核,都可以看到从0x8000000开始的内存区域 ADC连接到一个磁芯,收音机连接到另一个磁芯。我想将ADC接收到的数据值写入这个内存地址,以便其他内核可以读取它 有人能帮我弄清楚怎么做吗?这不是微型操作系统,而是裸机 我会在特定地址创建指向struct的指针吗 数组中有两个值,如何将它们放入结构中 #define NUM_SAMPLES_POLLED (2) uint16_t samples_polled[NUM_SAMPLES_POLLED] 在这种情

我正在开发一个嵌入式mcu,它有两个内核,都可以看到从0x8000000开始的内存区域

ADC连接到一个磁芯,收音机连接到另一个磁芯。我想将ADC接收到的数据值写入这个内存地址,以便其他内核可以读取它

有人能帮我弄清楚怎么做吗?这不是微型操作系统,而是裸机

我会在特定地址创建指向struct的指针吗

数组中有两个值,如何将它们放入结构中

#define NUM_SAMPLES_POLLED (2)
uint16_t samples_polled[NUM_SAMPLES_POLLED]

在这种情况下,您可以直接将地址分配给指针:

char *memdata = (char *)0x80000000;

请记住,此行为是由实现定义的。

最好阅读工具链中有关定义和使用共享内存的文档

我怎样才能在这个地址创建一个包含一些值的数组

C语言没有定义任何将变量分配到特定地址的机制。事实上,这种机制在托管C实现中不太可能可行,因为几乎所有现代托管实现都依赖于具有虚拟内存的底层操作系统


由于您可能正在为独立的实现编写代码(假设目标是嵌入式MCU),因此很可能有一种机制可以满足您的要求。@dbush建议的一个将是一个很好的候选者,但只有通过检查您的文档才能确定。

数组不是一个对象。“c”中的数组只是数据的表示形式。因此,您无法创建或销毁(或释放)。您可以直接访问它,即读和/或写

void* ptr=(void*)0x80000000;
int* arr_of_int = (int*)ptr;   //access memory location as array of int
arr_of_int[0] = 0x100;          //write value to your array
int i = arr_of_int[10] ;        // read value from array


您必须确保您实际上被允许从程序中访问此地址,因为操作系统内核(如果您以用户程序的形式运行代码)将禁止直接物理寻址。在这种情况下,您需要使用地址转换函数来计算与物理地址对应的虚拟地址

也许吧。具有实现定义的行为的。实际使用的实现可能需要不同的机制,甚至可能根本没有为所需的行为做任何准备。这是一种糟糕的方法。使用节和链接器是正确的方法。但共享数据还需要更多措施。“我需要一个内核将数据写入此地址,以便另一个可以从中读取数据。”可能需要协调两个内核之间的访问-可能使用“volatile”、“atomic”等。但这超出了OP的帖子范围,但很可能是后续问题。@chux:如果OP不得不问这个问题,我严重怀疑他是否会意识到这些问题。这些机制可能需要一个
struct
或多个变量来进行同步,因此简单的
char*
-方法肯定不是一个好主意。@flyswatter:我可以而且我已经在各种架构上做过了,但这不是编码服务,也不是我的项目。共享内存和它有什么关系?显然,一点都没有。。。或者是一切。RTFMArray是对象。对不起,我今天没票了。与
void*
混在一起简直是胡说八道。你有什么理由认为这是一个操作系统吗?OP提到了一个MCU,所以很可能没有或只有像FreeRTOS这样没有内存管理的轻量级操作系统。@Olaf可能在早些时候你有一个评论说指针不是对象。AFAIK,指针和数组是从对象C11§6.2.5 20派生的类型。@chux:我在哪里说的?无论如何,数组不是指针(但指针也是对象)。术语“对象”在3.15中有明确定义:“对象:执行环境中的数据存储区域,其内容可以表示值”。
char* arr_of_char = (char*)ptr;  // access memory as array of char
arr_of_char[0] = 'A';