5

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

我认为该结构在全球范围内不可用,因此指针不正确。

关于我应该做些什么来解决这个问题的任何想法?

谢谢

4

1 回答 1

0

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

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

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

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

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

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

对不起,没有更多的想法。

于 2013-01-06T22:05:04.900 回答