【发布时间】:2010-11-30 04:50:24
【问题描述】:
我的一个项目涉及绘制文本。该项目基于中级 16 位微控制器 dsPIC33FJ128GP802。它有 40 MIPS 的能力,但其中大约 92% 保留用于后台处理(输出屏幕显示),因此平均它有 3 MIPS 来渲染内容。该处理器具有硬件乘法、辅助除法(18 个周期)和一个完整的 16 位桶形移位器。
原来的方法很简单。它只是为需要写入的每个像素调用设置像素例程,但是,这非常慢:每个像素写入都需要地址解码、位掩码和写入内存 - 平均每个像素大约 60 个周期。此外,需要为要设置的每个像素写入两位:掩码数组中的一位(确定像素是否可见),级别数组中的一位(确定像素是白色还是黑色)。对于 8x14 像素的单个字符,这意味着 13,440 个周期加上开销。鉴于缺乏太多的处理能力,这很多。
因此,我想出了一个绘制水平线的算法。它可以在大约 20 个周期内有效地写入多达 16 个像素,这比单独设置像素提高了 60 倍;它还可以处理不位于单词边界上的行(使用一些聪明的位数学),甚至可以处理完全位于一个单词内的行。 (注意 - 一个字是 16 位,视频内存存储为 4 个 3,072 个字的数组,一个前缓冲区和后缓冲区。)我不确定该算法是否是原始的 - 我对此表示怀疑 - 但对于那些好奇的人, I've documented it here.
现在我正在绞尽脑汁,试图找出一种方法来为多个单词设置多个不同的像素。理想情况下,它会像这样工作 - 我们希望从第一个字的第 4 位(从零开始计数的位)开始写入这个字,并让它溢出到下一个:
Memory before : 0000 0000 0000 0000 0000 0000 0000 0000
Word to write : 1111 1010 1111 1111
Memory after : 0000 0111 1101 0111 1111 1000 0000 0000
如果有人知道任何此类算法或过去做过类似的事情,那么知道你是如何做到的会很棒。我现在脑部严重阻塞。
【问题讨论】:
标签: algorithm bit-manipulation