我有一个用于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函数移动到另一个文件,所有内容都可以正常编译,但屏幕上没有任何内容。
我认为结构全局不可用,因此指针不正确。
关于我应该采取什么措施来解决这个问题?
三江源
答案 0 :(得分:0)
您没有提供足够的信息来实际解决您的问题,但上述评论很可能是正确的 - 数据结构不同或功能。我只能给出一些建议如何找到原因,这在过去帮助我解决类似的问题:
1)使用objdump
(gcc工具链)或类似工具,检查目标文件需要的内容和导出内容。每个函数和结构应该只存在于一个目标文件中(并且应该从其他目标文件中导入)。
2)验证是否存在具有相同名称且在链接阶段处理的库函数(此处名称putchar()
非常危险)。 C链接器不验证参数(与C ++链接器不同)。确保链接器首先获取对象,然后获取库。对于大多数编译器/链接器,参数的顺序是相关的。
3)在文件和标题中单独重命名变量,并检查代码是否仍然编译。未修改的文件不应编译。
4)添加调试语句,为您提供函数和变量的地址。运行软件时,变量的地址应始终相同(我假设您发现另一种可能在显示功能旁边输出调试文本)。
5)你说获取了指针 - 验证它是否与代码完全相同,并确保不会覆盖这些值。
抱歉,没有更多的想法。