2014-01-17 10 views
1

이 진공 형광 디스플레이 용 라이브러리를 구축 중입니다. 그것의 아주 간단한 인터페이스와 나는 모든 기능을 작동합니다.하나의 배열에서 다른 배열로 비트를 변환합니까?

지금 문제는 코드를 가능한 작게 만들려고하지만 사용자 정의 문자로드는 직관적이지 않습니다. 그것이 글꼴 자체의 비트와 바이트가 완전히 다른 비트 맵입니다. 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 바이트로 확장됩니다. return 문을 인라인 if와 함께 사용하면 800 바이트로 줄일 수 있습니다. 나는 asm이 문장을 생성했지만 현재 컴파일러가 자신이하는 일을 알지 못한다고 생각하기 시작하면서 asm으로 모두 작성하려고한다. 그러나 나는 아마도 그것과 나 그리고 내가 뭘하고 있는지 몰라서 컴파일러를 혼란스럽게 만들었다.

두 개의 return 문이 모두 사용자 정의 문자를 업로드하고 표시됩니다 (두 번 보내야하는 별난 버그가 있지만 별개의 문제입니다).

답변

1

우선, 최소한의 예제로 gcc에 대한 버그 리포트를 제출해야합니다. 왜냐하면 -O는 -O0보다 큰 코드를 생성해서는 안되기 때문입니다. 그런 다음 테이블에 순열을 저장하는 것이 좋습니다.

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

고정 된 0 또는 1 비트를 나타내는 특수 값이 있습니다. 그러면 코드가 더 읽기 쉽습니다.