首页 > 解决方案 > 嵌入式系统内存冲突

问题描述

我正在为 PowerPC 构建一个带有 Diab 编译器的应用程序。我遇到了内存冲突问题。

header1.h我已经宣布

...
void NullFunct_1 (int);
...

然后函数NullFunct_1定义在main.c

    #include "header1.h"
...
           void NullFunct_1 (int f)
           {
              return;
           }

header2.h我已经宣布

    struct tp_key 
    {
        int a;                    
        void (*fn_ptr)(int);     // function pointer    
        unsigned int b;             
        unsigned int c;                
        int d;                  
        int e;                 
    };

header2.c我初始化数组Key如下

struct tp_key Key[48] = {0, &NullFunct_1, 0, 0, 0, 0};

header3.h我声明全局变量Units

extern int Units;

header3.c我定义和初始化变量Units

int Units = 0; //Units variable can then assume the values of 0, 1000 or 10000 only.

该程序被编译和链接,没有错误生成可执行文件。

生成的链接编辑器内存映射如下

    input           virtual                        
    section         address     size     file
...
    .data           50036adc    00000484 header2.o
           Key      50036adc    00000480
           Xxxx     50036f5c    00000004

    .data           50036f60    00000170 header3.o
           Units    50036f60    00000004
...
...
        NullFunct_1 500038b8    0000000c main.o
...

您可能会注意到变量Key并且Units是内存“邻居” 0x50036adc + 0x480 = 0x50036f5c

在某些情况下,变量Units包含1342191800 (0x500038B8 in hex)对应于变量内存地址的值Null_Funct_1

这是因为指令

struct tp_key Key[48] = {0, &NullFunct_1, 0, 0, 0, 0};

这是没有正确计算变量 Key 的内存大小的链接器问题吗?还是我犯了一个错误?即使存在链接器问题,您能否建议如何避免此类问题?

标签: clinkerfunction-pointers

解决方案


这里没有“冲突”。

sizeof(struct tp_key) [24] * 48 十六进制为 0x480。所以一切都100%没问题。

我的建议:不要专注于追逐“编译器错误”。假设编译器已经过测试并被数百万程序员使用。


推荐阅读