【问题标题】:Aligned struct not available globally对齐的结构在全球范围内不可用
【发布时间】:2012-12-03 01:47:21
【问题描述】:

我有一个用于 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 函数移动到另一个文件,一切都可以编译,但没有任何内容被绘制到屏幕上。

我认为结构不是全局可用的,所以指针不正确。

有什么想法可以解决这个问题吗?

谢谢

【问题讨论】:

  • 如果draw_char() 编译正常但没有使用您在putchar() 中设置的framebuf,那么有几种可能会导致这种情况:1. 您的@ 987654326@ 没有写入draw_char() 正在使用的“全局”framebuf2. 一次移动的draw_char() 不再使用您正在编写的“全局”framebufputchar()3. 可能您的putchar() 不再使用您认为的draw_char()。首先检查名为 framebuf 的本地变量。我会开始在那里打猎。
  • 对齐 (16) 定义在另一个 c 文件中不可见。尝试将其添加到 extern frame_buffer 声明/
  • putchar() 实际上并没有改变 framebuf。它只是调用 draw_char(),并将单个像素(以 16 位增量)写入 GPU 提供的指针。还有另一个函数最初向 GPU 请求指针(一旦关闭)。 GPU 将地址存储在结构本身中。此函数已在另一个 .c 文件中。不过感谢您的帮助。

标签: c pointers struct alignment draw


【解决方案1】:

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

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

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

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

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

5) 你说指针是被获取的 - 验证它在整个代码中确实是相同的,并确保值不会被覆盖。

抱歉,没有更多的想法。

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 2015-12-09
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2012-01-13
    • 2021-06-07
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多