2012-02-18 3 views
1

SPI를 통해 40 바이트 비트 배열을 읽는 uC 용 프로그램을 개발 중입니다. 이 40 바이트 배열은 SD 카드에 저장된 '알려진 좋은'테스트 벡터와 비교되는 테스트 벡터입니다.Malloc, 가변 길이 배열 또는 정적 배열?

예외/오류/오류를 찾기 위해 수신 된 테스트 벡터의 모든 바이트를 저장된 데이터와 XOR합니다. 이것은 결함이있는 '1'의 비트 배열을 생성합니다. 다음의 algorithm을 사용하여이 '1'의 위치를 ​​쉽게 찾을 수 있습니다.

문제는 '1'의 위치를 ​​저장하는 것입니다. 현재 가변 길이 어레이를 사용하고 있지만 이들에 대한 지원은 GCC4.2에서 제공되지 않으므로 AVR-GCC에서 얼마나 신뢰할 수 있는지 확신 할 수 없습니다.

내 생각은 malloc을 사용하는 것이지만 일반적으로 임베디드 시스템에서는 권장하지 않습니다. 난 그냥 길이 320의 unsigned char 배열을 선언하고 비트 세트를 찾을 때 '1'을 저장해야합니까? 예 : 비트 배열에 비트 4, 8, 10, 42 및 250이 설정되어 있습니다. 그런 다음 해당 요소를 '1'로 설정하여이 위치에서 '1'이 발견되었음을 나타냅니다. 이것은 SRAM의 320 바이트를 차지합니다. 또는 배열을 int로 선언하고 배열의 맨 위에서 시작하여 실제 위치를 저장할 수 있습니다.

왜 비트 세트의 위치가 필요합니까? SD 카드에는 비트 배열의 위치에 해당하는 정보가 포함 된 다른 파일이 들어 있습니다. 따라서 위치 24에서 오류가 발견되면 프로그램은 파일을 읽고 위치 24에 연결된 모든 정보를 표시 할 수 있습니다.

참고 : 일부는 전체 테스트를 읽어야하는지 한 번에 벡터. 그것은 사실입니다.

답변

3

저장소의 상한선을 알고 있고 부담스럽지 않은 경우 일반적으로 고정 크기 배열을 만드는 것이 좋습니다.

언급 한대로 가변 길이 배열 지원은 일부 구현에서는 불규칙적이며 다른 구현에서는 전혀 사용할 수 없습니다. malloc에는 오버 헤드가 추가되어 실패 할 가능성이 있습니다.

가변 길이가 아닌 고정 크기 (여기서는 static라고 생각합니다.)로 사용하겠습니다.


이제, 각각의 값은 해당 비트가 불량하거나, 각 요소는 잘못된 비트의 순차적 인 목록 정수 배열이 다른 물질인지 여부를 지정하는 문자 배열을 사용 여부에 대한.

처음에는 16 비트 값을 사용하여 두 번째 사례 사용에서 데이터를 최소화하려고합니다. 모르겠다는 구현에서 short 또는 int이든 상관 없습니다.

그러나 320 비트가 있으므로 8 비트 문자는 비트 위치에서 작동하지 않으므로 16 비트 값이 필요합니다.

따라서 두 번째 경우에는 샘플의 모든 비트가 나쁜 최악의 경우 320 개가 아닌 640 바이트를 사용해야합니다. 이 배열의 사용되지 않은 슬롯에 -1 값을 저장하여 나쁜 비트 수를 필요로하지 않고 도망 갈 수 있습니다.

그래서 선택은 정말 (예를 들어, 42, 314의 나쁜 비트 위치에 대한)입니다 :

BytePos BadBitFlag or:  BytePos BadBitPosition 
0..41 0      0/1  42 
42  1      2/3  314 
43..313 0      4/5  -1 
314  1      : 
315..319 0      638/9 -1 

정말 스토리지의 한계에 따라 달라집니다.

첫 번째 솔루션에서 문자 기반 "비트"를 선택하므로 XOR 결과를 40 비트 배열에서 확장해야하므로 선택하는 방법에 관계없이 데이터를 계산해야합니다. 바이트를 320 바이트의 바이트 배열로 변환합니다.

불량 비트 목록을 많이 처리하고 추가 저장 용량을 절약 할 수 있다면 두 번째 해결 방법을 선택하십시오.

목록을 몇 번만 처리하거나 메모리가 부족한 경우 첫 번째 해결 방법을 찾으십시오.

+0

비트가 설정된 곳에서 '1'을 저장하는 char 배열이나 실제 위치를 저장하는 int 배열이 될까요? – saad

+0

@saad, 공간을 절약 할 수 있다면, 각 "비트"를'char' 변수에 저장하는 것이 더 쉬울 것입니다. 그렇지 않다면 비트를 저장하고 마스킹 및 비트 시프트를 사용하여 비트를 가져와야합니다. – paxdiablo

+0

아마도 나는 뭔가를 오해하고 있습니다. 그러나 마스크를하거나 비트 시프트 할 필요가 없습니다. 만약 내가 int 배열을 가지고 있고 첫번째 비트 배열에서 만나는 첫 번째 '1'이 20이라면, 제 int 배열의 0 번째 원소에 20을 저장합니다. 비트 집합의 위치 배열입니다. 루프가 n 번만 반복되므로 n은 비트 배열에 설정된 총 비트 수이므로 전체 메모리 사용량이 두 배가되지만 처리 시간은 줄어 듭니다. 현재 시스템은 이미 40 %가 소비되고있는 8K SRAM을 가지고있다. 우리는 보드의 다음 회전에서 64K까지 추가 SRAM을 추가 할 것입니다. – saad

2

공간이 그다지 중요하지 않다면 전체 배열을 한 번에 인덱스로 변환해야하는 이유는 무엇입니까? 40 바이트짜리 xor 배열을 잡고 (비트 시프트 알고리즘을 사용하여) 오프셋을 찾아야 할 때 반복합니다.

+0

테스트 벡터는 모든 위치에서 관련 오류를 보유 할 수 있기 때문에. 위치 5의 오류는 위치 25의 오류와 관련이있을 수 있습니다. 접근 방식은 효과가 있지만 이렇게하면 운영자에게보다 완벽한 정보를 제공 할 수 있습니다. – saad

+1

정보를 처리해야한다면 어떻게 든 구성해야 할 것입니다. 직접 비트를 반복하여 구성하십시오. 내 요점은, 40x32 비트의 배열은 정확히 1280 정수의 배열과 같은 정보를 포함하고 있습니다. – alexis