我正在建造一个用于这种真空荧光显示器的库。它是一个非常简单的界面,我有所有功能。
我现在遇到的问题是我正在努力使代码尽可能紧凑,但自定义字符加载并不直观。这是字体映射到位显示器本身完全不同的位和字节的位图。从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);
这显然不是所有的代码。你可以看到余下的my Google code repository,但它应该让你知道我在做什么。
所以我的问题是,如果有更好的方法来优化这个或进行翻译?
更改VFD_CONVERT上的return语句会使GCC变得疯狂(-O1,-O2,-O3和-Os这样做)并将代码扩展为1400字节。如果我使用带有内联if的return语句,它会将其减少到800字节。我一直在浏览asm生成的语句和当前我很想把它全部写在asm中,因为我开始认为编译器不知道它在做什么。但是我想也许是我,我不知道我在做什么,所以它让编译器感到困惑。
作为旁注,那里的代码有效,两个return语句都会上传自定义字符并显示它(有一个奇怪的错误,我必须发送两次,但这是一个单独的问题)。
答案 0 :(得分:1)
首先,您应该使用最小的示例针对gcc提交错误报告,因为-Os永远不应该生成比-O0更大的代码。然后,我建议将排列存储在一个表中,就像这样
const char[][] perm = {{ 7, 13, 30, 23, 4, 14, 33}, ...
具有指示固定零或一位的特殊值。这也将使您的代码更具可读性。