여기에 다양한 답변이 있습니다 ... 주로 다양한 방법으로 문제를 해결합니다.
저는 25 년 이상 다양한 언어로 내장 된 저수준 소프트웨어 및 펌웨어를 작성해 왔습니다. 주로 C (Ada, Occam2, PL / M 및 다양한 어셈블러로 전환)입니다.
오랜 사고와 시행 착오 끝에 결과를 상당히 빨리 얻고 테스트 래퍼와 하네스 (값을 추가하는 위치)를 만드는 것이 매우 쉬운 방법으로 정착했습니다.
이 방법은 다음과 같습니다.
사용하려는 각 주요 주변 장치에 대한 드라이버 또는 하드웨어 추상화 코드 장치를 작성하십시오. 또한 하나를 작성하여 프로세서를 초기화하고 모든 것을 설정하십시오 (친숙한 환경을 만듭니다). 일반적으로 소형 임베디드 프로세서 (예 : AVR)에는 10-20 개의 장치가있을 수 있습니다. 이는 초기화, 비 스케일 메모리 버퍼로의 A / D 변환, 비트 출력, 푸시 버튼 입력 (디 바운스가 샘플링되지 않음), 펄스 폭 변조 드라이버, UART / 간단한 직렬 드라이버 사용 인터럽트 및 소형 I / O 버퍼를위한 단위 일 수 있습니다. 예를 들어 EEPROM, EPROM 또는 기타 I2C / SPI 장치 용 I2C 또는 SPI 드라이버가 더있을 수 있습니다.
각 하드웨어 추상화 (HAL) / 드라이버 유닛에 대해 테스트 프로그램을 작성합니다. 이것은 직렬 포트 (UART)와 프로세서 초기화에 의존합니다. 따라서 첫 번째 테스트 프로그램은이 두 장치 만 사용하며 기본 입력 및 출력 만 수행합니다. 이를 통해 프로세서를 시작할 수 있고 직렬 디버그 지원 직렬 I / O 작업이 있는지 테스트 할 수 있습니다. 일단 작동하면 다른 HAL 테스트 프로그램을 개발하여 알려진 우수한 UART 및 INIT 장치 위에 구축합니다. 따라서 비트 입력을 읽고 직렬 디버그 터미널에서 16 진수, 10 진수 등 멋진 형식으로 표시하는 테스트 프로그램이있을 수 있습니다. 그런 다음 EEPROM 또는 EPROM 테스트 프로그램과 같이 더 크고 복잡한 것으로 이동할 수 있습니다. 이러한 메뉴를 대부분 사용하여 실행할 테스트를 선택하여 실행하고 결과를 확인할 수 있습니다. 나는 그것을 쓸 수 없지만 보통 나는
HAL을 모두 실행하면 정기적 인 타이머 틱을 얻는 방법을 찾습니다. 이것은 일반적으로 4 ~ 20 ms 사이의 속도입니다. 이것은 인터럽트에서 생성 된 규칙적이어야합니다. 카운터의 롤오버 / 오버플로는 일반적으로이 작업을 수행하는 방법입니다. 그런 다음 인터럽트 핸들러는 바이트 크기 "세마포어"를 증가시킵니다. 이 시점에서 필요한 경우 전원 관리 기능을 사용할 수도 있습니다. 세마포어의 아이디어는 그 값이> 0이면 "메인 루프"를 실행해야한다는 것입니다.
EXECUTIVE는 메인 루프를 실행합니다. 그것은 그 세마포어가 0이 아닌 것을 기다립니다 (I는이 세부 사항을 추상화합니다). 이 시점에서 카운터를 사용하여 이러한 진드기 (진드기 비율을 알고있는 CO)를 계산할 수 있으므로 현재 경영진 진드기가 1 초, 1 분 및 기타 일반적인 간격인지를 나타내는 플래그를 설정할 수 있습니다. 사용하고 싶을 수도 있습니다. 임원은 세마포어가> 0임을 알면 모든 "응용 프로그램"프로세스 "업데이트"기능을 통해 단일 패스를 실행합니다.
응용 프로그램 프로세스는 서로 효과적으로 배치되고 "업데이트"눈금으로 정기적으로 실행됩니다. 이것은 임원이 호출 한 기능 일뿐입니다. 이것은 아주 간단한 집에서 만든 RTOS를 사용하여 빈약 한 멀티 태스킹입니다.이 RTOS는 모든 응용 프로그램의 입력, 약간의 작업 및 종료에 의존합니다. 응용 프로그램은 자체 상태 변수를 유지해야하며 공정성을 강제 할 선제 적 운영 체제가 없기 때문에 계산을 오래 실행할 수 없습니다. 분명히 응용 프로그램의 실행 시간 (누적)은 주요 틱 기간보다 짧아야합니다.
위의 접근 방식은 쉽게 확장되어 비동기식으로 실행되는 통신 스택과 같은 메시지를 전달하고 통신 메시지를 응용 프로그램에 전달할 수 있습니다 ( "rx_message_handler"인 각 기능에 새 기능을 추가하고 다음과 같은 메시지 디스패처를 작성 함) 어느 응용 프로그램을 파견할지).
이 접근 방식은 이름을 지정하려는 거의 모든 통신 시스템에서 작동합니다. 많은 독점 시스템, 개방형 표준 통신 시스템 및 TCP / IP 스택에서도 작동합니다.
또한 잘 정의 된 인터페이스가있는 모듈 식 조각으로 구축 될 수 있다는 장점이 있습니다. 당신은 언제든지 조각을 꺼내고 다른 조각으로 대체 할 수 있습니다. 방법을 따라 각 지점에서 알려진 하층 부품 (아래 항목)을 기반으로하는 테스트 하네스 또는 핸들러를 추가 할 수 있습니다. 디자인의 약 30 % ~ 50 %가 일반적으로 쉽게 추가되는 특별히 작성된 단위 테스트를 추가하면 도움이 될 수 있습니다.
나는 이것을 한 걸음 더 나아가서 (이 작업을 수행 한 다른 사람이 훔친 아이디어) HAL 레이어를 PC의 동등한 것으로 바꿉니다. 예를 들어 PC에서 C / C ++ 및 winforms 또는 이와 유사한 것을 사용할 수 있으며 코드를주의해서 작성하면 각 인터페이스 (예 : EEPROM = PC 메모리로 읽은 디스크 파일)를 에뮬레이트 한 다음 PC에서 전체 임베디드 응용 프로그램을 실행할 수 있습니다. 친숙한 디버깅 환경을 사용하면 많은 시간과 노력을 절약 할 수 있습니다. 실제로 큰 프로젝트 만이 정도의 노력을 정당화 할 수 있습니다.
위의 설명은 임베디드 플랫폼에서 작업을 수행하는 방법에 고유하지 않은 것입니다. 나는 비슷한 많은 상업 조직을 만났습니다. 구현 방식은 일반적으로 구현 방식이 크게 다르지만 원칙은 종종 동일합니다.
위의 내용이 약간 맛이 났으면 좋겠습니다.이 접근 방식은 영구적으로 전원을 공급하는 100K 이상의 소스 라인을 통해 공격적인 배터리 관리를 통해 몇 kB로 실행되는 소형 임베디드 시스템에서 작동합니다. Windows CE와 같은 큰 OS에서 "내장"을 실행하면 위의 모든 내용이 중요하지 않습니다. 그러나 그것은 실제 임베디드 프로그래밍이 아닙니다.