在lpc1788上进行双缓冲

时间:2013-01-08 14:15:46

标签: c embedded heap double-buffering

我正面临着极大的担忧。我目前正参与三明治课程,我正在学习如何在嵌入式系统上开发软件 - 就像在open1788板上一样。

我计划实施双缓冲功能,因为我可以在液晶屏上看到闪烁。在绘制时可以查看形状!

使用双缓冲,重绘整个屏幕的速度足够快。也许我应该深入研究管理裁剪,所以我只需要重新绘制需要的部分屏幕?但那不是问题。

所以,我写了几个函数来处理双缓冲选项选择。如果我不希望软件使用双缓冲,那么我不会为它分配内存;否则我会。

问题是为堆分配的默认空间最多为1024字节。我的临时缓冲区长度为261120字节! (每272像素高481像素宽,每一个16bpp)。

因此,malloc返回NULL。

我采取的第一个解决方案是放置静态缓冲区,我的意思是:

static WORD s_double_buf[481*272];

但明显的缺点是,即使你不使用双缓冲,它仍然会被分配。

第二个解决方案是编辑配置文件以使堆更大,每个替换1024个字节,例如1048576字节(0x100000)。我不喜欢这个解决方案,因为我应该专注于节省内存空间。

也许我非常想念嵌入式编程技巧?根据那个,最好的解决方案是什么?我怎么能取得进步?我不会告诉你我阅读和挖掘数据表的混乱能力。

如果有人能为我提供初学者的参考资料,我真的很感激,大多数情况都适合我编程的电路板。

提前致谢!

2 个答案:

答案 0 :(得分:5)

在嵌入式空间中,您通常会决定基本方面,例如是否在编译时使用双缓冲,而不是在运行时。因此,使用预处理器和条件编译是完全可以接受的:

#ifdef WITH_DOUBLEBUFFERING

    static WORD s_double_buf[481*272];
    #define SCREEN s_double_buf

#else

    #define SCREEN your_real_framebuffer

#endif

在GUI库的实现中,您将绘制到SCREEN。

答案 1 :(得分:4)

对于嵌入式系统,您通常希望在启动时分配所有内存。这意味着你已经知道你有足够的东西来做你想做的事情,这意味着它不会失败,这通常是一件好事,特别是对于嵌入式系统。

静态分配内存 - 这很简单,看起来你可以随意使用它。如果您以后发现内存不足并且可以在没有双缓冲的情况下离开,那么您可以轻松地将其取出。

如果您使用malloc,请在启动时完成所有操作,然后您就不必处理在正常操作期间从内存不足中恢复的问题。