2014-01-17 44 views
1

我正在为这个真空荧光显示器建立一个库。它是一个非常简单的界面,我拥有所有的功能。将位从一个阵列转换为另一个阵列?

我现在遇到的问题是,我试图使代码紧凑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中,因为我开始认为编译器不知道它在做什么。然而,我想也许是我的,我不知道我在做什么,所以它混淆了编译器。

作为一个侧面说明,有工作的代码,都返回语句上传自定义字符,它被显示(一个奇怪的错误,我必须发送它两次,但这是另外一个问题)。

回答

1

首先,你应该用一个最小的例子提交一个针对gcc的bug报告,因为-Os不应该比-O0生成更大的代码。然后,我建议将该排列存储在表中,如下所示:

const char[][] perm = {{ 7, 13, 30, 23, 4, 14, 33}, ... 

具有指示固定零或一位的特殊值。这也会让你的代码更具可读性。