2014-01-17 146 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}, ... 

具有指示固定零或一位的特殊值。這也會讓你的代碼更具可讀性。