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에 연결된 모든 정보를 표시 할 수 있습니다.
참고 : 일부는 전체 테스트를 읽어야하는지 한 번에 벡터. 그것은 사실입니다.
비트가 설정된 곳에서 '1'을 저장하는 char 배열이나 실제 위치를 저장하는 int 배열이 될까요? – saad
@saad, 공간을 절약 할 수 있다면, 각 "비트"를'char' 변수에 저장하는 것이 더 쉬울 것입니다. 그렇지 않다면 비트를 저장하고 마스킹 및 비트 시프트를 사용하여 비트를 가져와야합니다. – paxdiablo
아마도 나는 뭔가를 오해하고 있습니다. 그러나 마스크를하거나 비트 시프트 할 필요가 없습니다. 만약 내가 int 배열을 가지고 있고 첫번째 비트 배열에서 만나는 첫 번째 '1'이 20이라면, 제 int 배열의 0 번째 원소에 20을 저장합니다. 비트 집합의 위치 배열입니다. 루프가 n 번만 반복되므로 n은 비트 배열에 설정된 총 비트 수이므로 전체 메모리 사용량이 두 배가되지만 처리 시간은 줄어 듭니다. 현재 시스템은 이미 40 %가 소비되고있는 8K SRAM을 가지고있다. 우리는 보드의 다음 회전에서 64K까지 추가 SRAM을 추가 할 것입니다. – saad