3.1 개발도구
1. 호스트 환경 및 타겟 환경
1) 호스트 환경
- 소프트웨어 개발 도구
ㄴ Cross Compiler : PC 환경에서 타겟 시스템에 구동이 가능하도록 컴파일 하는 컴파일러
ㄴ System Library : 컴파일, Linking에 필요한 각종 S/W
ㄴ Utility (Binutils) : 바이너리 압축, 전송, 관리도구
- 테스트 도구
ㄴ Terminal : Target 환경에 명령 입력, 결과 확인
2) 타겟 환경
- 하드웨어 개발 도구
ㄴ JTAG S/W : 실행 코드 퓨징 도구
ㄴ ISP (In-System Programming) : EEPROM, Flash 메모리가 장착된 보드의 프로그램 수정
- 테스트 도구
ㄴ 오실로스코프 : 칩 동작 상태를 전송 신호로 확인
2. ARM 환경 개발 GNU 교차 개발 툴
- arm-linux-ar : 라이브러리 생성, 수정 도구
- arm-linux-as : GNU 크로스 어셈블러
- arm-linux-gcc : GNU 크로스 C 컴파일러
- arm-linux-ld : GNU 크로스 컴파일 링커
- arm-linux-nm : 오브젝트 파일 심볼 확인
- arm-linux-objcopy : 오브젝트 파일 변환 도구
- arm-linux-strings : 파일 내 문자열 표시 도구
- arm-linux-strip : 파일 내의 심볼 제거 도구
3. 메모리 리매핑 (Memory Remapping)
- ARM SoC에서 시스템 전원이 인가되면 물리 메모리 주소 0x00번지에 ROM이나 Flash 메모리를 할당하고, 초기화 이후 RAM을 0x00번지에 할당하도록 메모리 구조를 변경하는 기법
- 예외처리나 인터럽트 벡터를 런타임 내에서 바꾸기 위해서는 RAM을 0x00번지로 할당해야 한다.
4. 컴파일 최적화 옵션
- -O0 : 기본 값으로 최적화를 수행하지 않음
- -O1 : 코드 크기와 실행 시간만 최적화
- -O2 : 메모리 공간과 속도를 희생하지 않는 범위 내의 모든 최적화 수행
- -O3 : -O2 최적화, 인라인 함수와 레지스터 최적화 수행
5. 링커 & 로더
1) 링커
① 링커 : 목적 프로그램 또는 라이브러리를 결합하여 실행 가능한 적재모듈로 생성하는 프로그램
② 링킹 종류
- 동적 링킹 : 실행 가능한 목적 파일을 만들 때 프로그램에 사용하지 않는 모든 라이브러리 모듈을 복사하지 않고 해당 모듈의 주소만을 가지고 있다가 런타임에 실행파일과 라이브러리가 메모리에 위치될 때, 해당 모듈 주소로 가서 필요한 것을 가지고 오는 방식
- 정적 링킹 : 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사
2) 로더
① 로더 : 외부 기억장치에 저장된 실행 가능한 적재모듈을 주 기억 장치로 옮기기 위하여 메모리 할당 및 연결, 재배치 적재를 담당하는 서비스 프로그램
② 로더의 기능
- 할당 (Allocation) : 목적 프로그램이 적재될 주 기억장치의 공간 할당
- 연결 (Linking) : 타 목적 프로그램이나 라이브러리 루틴과의 링크 작업
- 재배치 (Relocation) : 실제 주 기억 장소에 적재되는 상대 주소를 이용하여 절대 주소를 치환
- 적재 (Loading) : 실제 프로그램과 데이터를 주기억 장소에 적재
② 로더 종류
- 컴파일 즉시 로더 (Compile and Go) : 컴파일러가 로더 역할 까지 하는 것으로 실행 시마다 컴파일 해야 함
- 절대 로더 (Absolute Loader) : 주 기억 장치의 프로그래머가 지정한 주소에 적재하는 기능을 가짐
- 직접 연결 로더 (Direct Linking Loader) : 일반적인 로더로 메모리 할당, 연결, 재배치, 적재 기능 모두 수행
- 동적 적재 로더 (Dynamic Loading Loader) : 실행 시 필요한 일부분만을 적재하는 로더
3.2 디버깅 도구
1. 교차 디버거
1) 주요 디버깅 동작
- 실행 제어 : 실행 중 브레이크 포인트 또는 와치 포인트를 설정하여 실행을 중단하고 데이터를 액세스하여 값을 검증
- 상태 제어
ㄴ 시스템이나 프로세스 상태를 관찰하면서 제어
ㄴ 프로세스 내부 레지스터의 값을 읽거나 변경하는 동작, 주 기억장치의 내용을 읽거나 변경하는 동작
- 실행 분석 : 소프트웨어를 실행하여 실시간 추적 및 메모리 참조 내역을 분석
2. ICE
- In-Circuit Emulator의 약어로 디버깅을 위한 인터페이스 장치이다
- 호스트 시스템과 패러럴 포트, 이더넷, USB을 통해 연결이 가능하다
3. gdb
1) gdb
- GNU Debugger의 약어로 GNU 소프트웨어를 위한 기본 디버거이다.
- 컴파일 시 -g 옵션을 붙여야 한다.
3.3 테스팅 기법
1. 단위 테스트 기법 ( 테스트 대상 기반 분류 )
- Interface 테스트 : 파일 속성, 입력 및 출력 매개 변수, 요구되는 입출력 I/O 등을 테스트
- 자료구조 테스트 : 자료 형태, 변수 초기화, 자료 형태의 일관성 테스트
- 실행경로 테스트 : 다른 자료형태 간 비교, 잘못된 루프 문 테스트
- 오류처리 테스트 : 오류 메시지 이해용이성, 오류 정보 상세정보 제공 여부 테스트
2. 단위 테스트 기법 ( 프로그램 실행 여부에 따른 분류 )
1) 정적 테스트
- 소프트웨어 실행 없이 소스 코드, 설계 문서, 요구사항 정의서를 수작업(manual) 및 자동화(automatic) Tool을 사용하여 Test하는 방법
- 정적 테스트 종류는 두 가지가 있다.
① 코드 리뷰 : 오류 유형 체크리스트, 네이밍 규칙 검사 등
② 정적 분석 : 자동화 툴 기반의 소스 코드 분석 기법이며 소스 코드의 복잡도, 데드 코드(dead code), 코딩 룰 에러(변수명 규칙, 함수명 규칙 등), 소스 코드 구조(Data Flow, Control Flow) 및 의존 관계를 분석하고 검출하는 방식
2) 동적 테스트
- 소프트웨어 프로그램이나 시스템 실행을 통하여 무엇이 어떻게 수행되고 동작되는지 Test하는 방법
- 동적 테스트 종류는 2가지가 있다.
① 블랙박스 테스트 : 입력과 출력에 의존하여 수행되는 테스트. 프로그램의 내부 처리 로직은 모른다는 전제로 수행
- 동등분할 : 입력 데이터 특성에 따라 클래스로 분류 (ex) 0~100 테스트 일 경우, 0, 50, 100 도출)
- 경계값 분석 : 경계 값에서 오류 발생 확률이 높은 점 활용 (ex) 0~100 테스트 일 경우, -1, 0, 1, 99, 100, 101 도출)
- 원인 결과 그래프 : 입력 데이터가 출력에 대한 영향을 그래프로 표현 (ex) 0~100테스트 일 경우 0~100 결과값 확인)
- 오류 예측 : 과거 경험 기반으로 예측되는 오류를 케이스로 설계
② 화이트박스 테스트 : 테스트 대상의 내부를 참고하여 테스트를 수행
- 기초 경로 검사 : 수행 가능한 모든 경로를 검사
- 제어 구조 검사 : 프로그램 논리적 복잡도에 기반한 케이스 설계 기법 (ex) 복잡도 10~30 평균, 50 복잡)
ㄴ 조건 검사 : 프로그램 조건문에 초점을 맞추어 검사
ㄴ 루프 검사 : 프로그램 반복 구조에 초점을 맞추어 검사
ㄴ 데이터 흐름 검사 : 프로그램 변수의 정의와 사용 위치에 초점을 맞추어 검사
3.4 테스트 케이스
1. 테스트 커버리지
- 구문 커버리지 (Statement Coverage) : 프로그램 모든 구문을 적어도 한번은 실행되도록 구성
- 결정 커버리지 (Decision Coverage) : 결정 포인트의 전체 조건이 한번씩 참/거짓이 되도록 구성
- 조건 커버리지 (Condition Coverage) : 결정 포인트 개별 조건이 참/거짓이 되도록 테스트 케이스 구성
- 조건/결정 커버리지 (Condition/Decision Coverage) : 고려하지 않는 조건 커버리지를 개선한 것으로 실행된 개별 조건식의 참/거짓과 전체 조건 모두를 측정하도록 구성
# References
- https://live-everyday.tistory.com/69
'임베디드 기사 > 실기 - 임베디드 소프트웨어' 카테고리의 다른 글
| 임베디드 소프트웨어 실기 용어 정리 (0) | 2023.10.12 |
|---|---|
| 1. 임베디드 프로그램 분석 및 설계하기 (0) | 2023.09.28 |