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];
댓글
i> 시작시 플래시에서 제한된 램으로 상수 이니셜 라이저를 복사하지 않도록하는 것이 바람직합니다 (따라서 " const " 및 pragma 또는 링커의 적절한 사용). 구성), 예외가 있습니다. 이러한 프로세서 중 상당수는 플래시 " 프로그램 " 메모리에서 데이터를 가져 오는 속도가 비교적 느립니다. RAM을 사용할 수 있는지, 시작시 플래시에서 한 번만 초기화 된 RAM의 테이블이 더 빠를 수 있습니다.
답변
다음은 미리 계산 된 값에 대한 조회 테이블을 만드는 방법의 예입니다. 한 바이트 내에서 비트를 앞뒤로 바꾸는 예를 사용하겠습니다. 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를 선택하십시오.)
uint32_t gray( uint32_t number ) { return number ^= ( number >> 1 ); }
테이블이 필요하지 않습니다. 'EOR Rn,Rn,Rn,LSR 1
, 조회 테이블이이를 능가 할 수는 없습니다.