C를 사용하여 마이크로 컨트롤러에서 조회 테이블 생성

C를 사용하여 마이크로 컨트롤러에서 조회 테이블을 생성하려면 어떻게해야합니까? 하나의 입력과 하나의 출력이 있고 C로 조회 테이블을 구현하고 싶습니다.

Answer

일반적인 질문에 정보가 없기 때문에 답변 :

입력으로 uint8_t가 있고 출력으로 uint8_t가 있다고 가정합니다. 전체 룩업 테이블 (즉, 모든 입력에 출력이 있음)을 생성하려는 경우 입력이 256 개의 서로 다른 값을 가질 수 있으므로 256 개의 값이 필요합니다. 이제 다음을 사용하여 테이블을 만들 수 있습니다.

const uint8_t the_table[256] = { ... } 

const 키워드는 테이블을 플래시 메모리에 저장하는 것입니다. , RAM이 아닙니다. 이는 jippie가 주석에서 지적했듯이 마이크로 컨트롤러에서 RAM이 부족하기 때문입니다.

중괄호 안에 값이 있어야합니다. 이제 the_table[input_value]를 사용하여 입력 값을 쉽게 조회 할 수 있습니다.


일반적으로 조회 테이블은 다음과 같이 보일 수 있습니다.

const OutputType the_table[CountOfInputValues] = { ... };

이 변환을 수행하는 룩업 테이블의 간단한 예 ( 회색 코드 , Anindo Ghosh에게 감사드립니다 ) :

 input -> output 0b000 0b000 0b001 0b001 0b010 0b011 0b011 0b010 0b100 0b110 0b101 0b111 0b110 0b101 0b111 0b100  

uint8_t 또는 바이트를 출력 유형으로 사용하여 다음과 같이 구현할 수 있습니다.

const uint8_t gray_code[8] = {0b000, 0b001, 0b011, 0b010, 0b110, 0b111, 0b101, 0b100}; 

다음을 사용하여 값을 조회 할 수 있습니다.

some_var = gray_code[input]; 

댓글

  • 좋아요 이 설명은 명확하고 간단합니다 :).
  • uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); } 테이블이 필요하지 않습니다. '
  • 클럭 사이클이 1 번 밖에 걸리지 않는 ARM 프로세서에서! EOR Rn,Rn,Rn,LSR 1, 조회 테이블이이를 능가 할 수는 없습니다.
  • ' 보통

i> 시작시 플래시에서 제한된 램으로 상수 이니셜 라이저를 복사하지 않도록하는 것이 바람직합니다 (따라서 " const " 및 pragma 또는 링커의 적절한 사용). 구성), 예외가 있습니다. 이러한 프로세서 중 상당수는 플래시 " 프로그램 " 메모리에서 데이터를 가져 오는 속도가 비교적 느립니다. RAM을 사용할 수 있는지, 시작시 플래시에서 한 번만 초기화 된 RAM의 테이블이 더 빠를 수 있습니다.

  • @PrabinKumar I ' 죄송합니다. send-me-teh-codez 로 표시됩니다. 제공된 가이드 라인에 따라 작업하는 데 노력을 보였지만 해결할 수없는 특정 문제가 발생하면 실제로 필요한 도움을받을 수 있습니다.
  • 답변

    다음은 미리 계산 된 값에 대한 조회 테이블을 만드는 방법의 예입니다. 한 바이트 내에서 비트를 앞뒤로 바꾸는 예를 사용하겠습니다. FFT 알고리즘이나 잘못된 순서를 원하는 SPI 주변기기에 유용 할 수 있습니다.

    먼저 테이블을 생성하는 프로그램을 만듭니다. 테이블을 손으로 유지하는 것은 힘들고 오류가 발생하기 쉬우므로이 작업을 수행해야합니다. 컴퓨터에.

    #!/usr/bin/python def swapbits(x): ret=0 for i in range(8): if x&(1<<i): ret |= 1<<(7-i) return ret print "const uint8_t bitswap[] = {", print ", ".join("0x%02x"%swapbits(x) for x in range(256)), print "}" 

    이 파일을 “bitend.py”라고 부릅니다. C 프로그램 대신 스크립팅 언어를 사용했습니다. 테이블 생성 근본적으로 문자열 처리 문제이고 C는 문자열 처리를 수행하는 데 어려움이 있습니다. 테이블은 컴파일 타임에만 필요하기 때문에 더 분명하게 정확한 원시인처럼 간단한 알고리즘을 사용할 수 있습니다. 최적화 된 것보다.

    이제 이것을 빌드에 통합합니다. 내 Makefile에 다음과 같은 섹션을 넣습니다.

    generated_swapbits.c: bitend.py echo "/* generated by bitend.py, do not edit */" > generated_swapbits.c python bitend.py >> generated_swapbits.c 

    여기에서 Python 스크립트에 종속성을 설정 했으므로 스크립트를 편집하면 C 파일이 자동으로 재생성됩니다.

    기본 C 코드에 생성 된 파일 만 포함합니다.

    #include <stdio.h> #include "generated_swapbits.c" int main(void) { printf("Swapped 0x0f is %0x\n", swapbits[0x0f]); } 

    이제 Makefile에, 생성 된 파일을 C 코드의 종속성으로 포함해야합니다.

    a.out: main.c generated_swapbits.c $(CC) $(CFLAGS) main.c 

    마지막으로 “generated_swapbits.c”를 Makefile에 추가합니다. ” s “clean”대상이므로 “make clean”시 파일이 제거됩니다.

    make 대신 IDE를 사용하는 경우 종속성을 충족시키기 위해 스크립트 실행에 대한 설명서를 참조해야합니다. IDE가이를 지원하지 않습니다. 다른 IDE를 선택하십시오.)

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다