산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 임베디드

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

외부 텍스트 파일을 사용하여 C 배열 초기화하는 방법

이 가이드는 별도의 텍스트 파일에 저장된 데이터로 C 프로그램의 배열을 채우는 방법을 설명합니다. 값은 소스 코드에 임베디드되지 않고 컴파일 타임에 로드됩니다. 1차원 및 다차원 배열을 다루고, 배열이 RAM 또는 비휘발성 메모리에 상주하도록 제어하는 방법, 초기화를 위한 여러 데이터 파일 간 선택 방법을 보여줍니다.

예제는 32비트 ARM 마이크로컨트롤러를 대상으로 하며 GCC로 컴파일됩니다. 모든 스니펫은 표준 C를 사용하며 이 컴파일러와 호환됩니다.

배열 초기화 기초

C에서 배열을 선언할 때 중괄호 안에 값 목록(초기화자)을 제공할 수 있습니다. 예를 들어:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

대괄호 안의 크기를 생략하면 컴파일러가 초기화자 수로부터 크기를 추론합니다. 배열이 초기화자 목록보다 크게 선언되면 나머지 요소는 기본적으로 0으로 설정됩니다. 선언된 크기보다 더 많은 초기화자를 제공하면 컴파일 오류가 발생합니다.

공백

초기화자는 쉼표로 구분되며, 그들 사이에 공백(스페이스, 탭, 줄바꿈, 캐리지 리턴, 수직 탭, 폼 피드)을 자유롭게 추가할 수 있습니다. C에서 문장은 여러 줄에 걸쳐 있을 수 있으며, 이는 소스 코드 여러 페이지를 채울 수 있는 큰 배열에 특히 유용합니다.

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

파일에서 배열 초기화

C 전처리기는 #include 지시문을 사용하여 임의의 텍스트 파일을 포함할 수 있습니다. 이 기능은 헤더나 소스 파일에 국한되지 않으며, 일반 텍스트 파일이면 모두 허용됩니다. 숫자, 쉼표, 공백을 포함하는 간단한 파일을 사용하여 배열을 초기화할 수 있습니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

포함된 파일은 일반 텍스트여야 하며, 리치 텍스트 서식, 헤더 또는 기타 아티팩트는 없어야 합니다. Windows 메모장으로 만든 간단한 예제는 다음과 같습니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

컴파일 시 디버거 스크린샷과 같이 배열이 메모리에 나타납니다. 이 경우 'Location' 열의 높은 주소로 보아 배열은 RAM에 상주합니다.

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

비휘발성 메모리에 배열 저장 및 데이터 파일 선택

위 예제에서 배열은 명시적 배치 없이 전역 변수입니다. 컴파일러는 런타임에 수정될 수 있다고 가정하므로 변수를 RAM에 배치합니다. 초기값은 비휘발성 메모리(일반적으로 Flash)에 상주하고 부팅 루틴이 이를 RAM으로 복사합니다. 배열이 진정으로 상수라면 const로 선언하여 컴파일러가 Flash에만 유지하도록 하여 소중한 RAM을 절약할 수 있습니다. 다음 스크린샷은 그 효과를 보여줍니다: 배열의 'Location'이 낮은 Flash 주소를 가리킵니다.

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

#define과 #if 지시문을 사용하여 RAM과 Flash 저장소를 전환하거나 초기화를 위한 다른 데이터 파일을 선택할 수 있습니다. 다음 코드는 컴파일 타임에 저장소 위치를 선택할 수 있게 합니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

#if 구문은 조건부 포함의 전형적인 예입니다. 컴파일 타임 플래그에 따라 const 한정자가 적용될지 결정합니다.

마찬가지로 초기 데이터를 제공할 파일을 조건부로 선택할 수 있습니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

대용량 배열로 테스트

기법을 검증하기 위해 CSV 파일에 저장된 10,000샘플 노이즈 파형을 사용했습니다. 아래 플롯은 파형을 보여주며, 선언은 데이터가 프로그램에 어떻게 통합되는지 보여줍니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

원본 CSV 파일에는 각 값 뒤에 쉼표가 없었습니다. 정규식 찾기/바꾸기(\R 검색 후 ,\R로 대체)를 사용하여 10,000개 모든 항목에 쉼표를 한 번에 추가했습니다.

결과 배열은 디버거에서 100개 요소씩 행으로 깔끔하게 그룹화되어 보입니다.

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

다차원 배열

2차원 또는 3차원 데이터로 작업할 때 C는 행 우선 순서로 배열을 저장한다는 점을 기억하세요. 예를 들어 uint16_t test[2][3] 배열은 메모리에 다음과 같이 배치됩니다:

[0,0] [0,1] [0,2] [1,0] [1,1] [1,2]

가장 오른쪽 첨자를 따라 연속된 요소에 접근하는 것이 더 빠릅니다. 데이터가 연속적이기 때문입니다. 1,000샘플 두 벡터가 필요하다면 캐시 친화성을 극대화하기 위해 test[2][1000]으로 선언하세요.

2차원 배열의 초기화자는 일반적으로 중첩된 중괄호로 그룹화됩니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

그러나 외부 중괄호를 생략할 수 있으며, 컴파일러는 배열을 왼쪽에서 오른쪽으로 채웁니다. 초기화자 주위에 중괄호가 없습니다라는 경고를 발생시킵니다. 전체 값의 수가 배열 크기와 일치하는 한 코드는 컴파일됩니다.

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

데이터를 여러 파일에 분산하려면 각 파일을 순서대로 포함하고 전체 목록을 한 쌍의 중괄호로 감싸면 됩니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

공용체에서 배열 초기화

union은 서로 다른 타입이 동일한 메모리를 공유하도록 허용합니다. 예를 들어 1차원 벡터와 2차원 행렬을 포함하는 공용체는 동일한 주소 공간을 차지합니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

초기화 시 컴파일러는 첫 번째 멤버를 먼저 채웁니다. 순서가 반전되면 초기화자 목록이 완전히 괄호로 묶이지 않아 경고가 발생할 수 있습니다. #include 주위에 이중 중괄호를 사용하면 올바른 그룹화가 보장됩니다:

공용체용 데이터 파일은 다음과 같습니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

메모리에서 vector와 matrix 모두 동일한 위치에서 시작합니다. 디버거에 표시된 바와 같습니다:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

단일 숫자 파일에서 다차원 배열을 초기화하는 다른 방법을 아시나요? 댓글로 아이디어를 공유해 주세요.

보너스 팁: 문자열

외부 파일에서 문자열을 초기화하려면 따옴표가 파일 자체 내부에 있어야 합니다. 문자열 리터럴 내부의 직접 #include는 컴파일러를 망가뜨립니다. 대신 파일에 따옴표를 넣고 다음과 같이 포함하세요:

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례

결과 문자열은 스크린샷과 같이 RAM에 상주합니다.

임베디드 펌웨어: 외부 파일 데이터와 신호 파형으로 C 배열 초기화 모범 사례


이 예제들은 이론적이며 모든 표준 C 컴파일러에서 작동해야 합니다. 컴파일러별 특이 사항을 발견하면 댓글로 알려주세요.

출처 제공.

임베디드

  1. 클라우드 혁명: 클라우드 컴퓨팅이 IT, 보안, 커리어를 변화시키는 방식
  2. ST마이크로일렉트로닉스, STM32Cube.AI 출시… 임베디드 신경망으로 에지 디바이스 강화
  3. DATA MODUL, 실내외용 초고휘도 21.5" & 31.5" 오픈프레임 모니터 EasyTouch 출시
  4. Microchip, 153.6kSPS 데이터 레이트의 24비트 및 16비트 델타시그마 ADC 출시
  5. Contrinex 2020: 클라우드 대응 센서 및 블루투스 라이트 커튼으로 안전성 강화
  6. C++ 배열 완전 정복: 선언, 초기화, 포인터 기법
  7. C++ 동적 배열 할당 완벽 가이드: new, delete, 실전 코드 예제
  8. Java BufferedReader로 파일 읽기: 실전 가이드와 예제
  9. IBM과 테크데이터로 IoT 구현하기 – 2부
  10. IoT를 현실로: 테크데이터 & IBM 인사이트 – 1부