我正在为这个真空荧光显示器建立一个库。它是一个非常简单的界面,我拥有所有的功能。将位从一个阵列转换为另一个阵列?
我现在遇到的问题是,我试图使代码紧凑possable,但自定义字符加载不直观。这是字体映射到显示器本身的完全不同的位和字节的位图。从IEE VFD datasheet,当您向下滚动时,您会看到位映射到整个地方。
我到目前为止的代码工作像这样:
// input the font bitmap, the bit from that line of the bitmap and the bit it needs to go to
static unsigned char VFD_CONVERT(const unsigned char* font, unsigned char from, unsigned char to) {
return ((*font >> from) & 0x01) << to;
//return (*font & (1 << from)) ? (1<<to) : 0;
}
// macros to make it easyer to read and see
#define CM_01 font+0, 4
#define CM_02 font+0, 3
#define CM_03 font+0, 2
#define CM_04 font+0, 1
#define CM_05 font+0, 0
// One of the 7 lines I have to send
o = VFD_CONVERT(CM_07,6) | VFD_CONVERT(CM_13,5) | VFD_CONVERT(CM_30,4) | VFD_CONVERT(CM_23,3) | VFD_CONVERT(CM_04,2) | VFD_CONVERT(CM_14,1) | VFD_CONVERT(CM_33,0);
send(o);
这是oviously不是所有的代码。你可以在my Google code repository以上看到其余的内容,但它应该让你知道我在做什么。
所以我的问题是,如果有更好的方法来优化这个或做翻译?
改变对VFD_CONVERT return语句使GCC发疯(-O1,-O2,-O3和-Os做它)和代码扩展到1400个字节。如果我使用带有inline的return语句,它会将其减少到800字节。我一直在讨论asm生成的语句,目前我很想将它全部写入asm中,因为我开始认为编译器不知道它在做什么。然而,我想也许是我的,我不知道我在做什么,所以它混淆了编译器。
作为一个侧面说明,有工作的代码,都返回语句上传自定义字符,它被显示(一个奇怪的错误,我必须发送它两次,但这是另外一个问题)。