对齐结构在全球范围内不可用

时间:2012-12-15 04:01:51

标签: c pointers struct alignment draw

我有一个用于Raspberry Pi的小型裸机程序,它可以绘制到屏幕上。 我使用C,GCC作为编译器,Yagarto作为ARM工具链。

目前,我有一个标头(gpu.h),它声明了GPU读取的帧缓冲结构(它包含分辨率和位深度)。 GPU填充结构中的值,包括绘制到的指针:

struct frame_buffer {
    int width;
    int height;
    int vwidth;
    int vheight;
    int bytes;
    int depth;
    int ignorex;
    int ignorey;
    int pointer;
    int size;
};
extern struct frame_buffer framebuf;

结构在main.c中定义(不在函数内):

struct frame_buffer framebuf __attribute__ ((aligned (16))) = {GPU_HRES, GPU_VRES, GPU_HRES, GPU_VRES, 0, GPU_BITDEPTH, 0, 0, 0, 0};

同样在main.c中是一个向屏幕绘制字符的函数(draw_char),以及我自己的putchar()实现,它使用draw_char函数。目前这个工作正常。

如果我将draw_char函数移动到另一个文件,所有内容都可以正常编译,但屏幕上没有任何内容。

我认为结构全局不可用,因此指针不正确。

关于我应该采取什么措施来解决这个问题?

三江源

1 个答案:

答案 0 :(得分:0)

您没有提供足够的信息来实际解决您的问题,但上述评论很可能是正确的 - 数据结构不同或功能。我只能给出一些建议如何找到原因,这在过去帮助我解决类似的问题:

1)使用objdump(gcc工具链)或类似工具,检查目标文件需要的内容和导出内容。每个函数和结构应该只存在于一个目标文件中(并且应该从其他目标文件中导入)。

2)验证是否存在具有相同名称且在链接阶段处理的库函数(此处名称putchar()非常危险)。 C链接器不验证参数(与C ++链接器不同)。确保链接器首先获取对象,然后获取库。对于大多数编译器/链接器,参数的顺序是相关的。

3)在文件和标题中单独重命名变量,并检查代码是否仍然编译。未修改的文件不应编译。

4)添加调试语句,为您提供函数和变量的地址。运行软件时,变量的地址应始终相同(我假设您发现另一种可能在显示功能旁边输出调试文本)。

5)你说获取了指针 - 验证它是否与代码完全相同,并确保不会覆盖这些值。

抱歉,没有更多的想法。

相关问题