다중 스레드 환경 다루기
기술노트 95292
아키텍처:
Arm
컴포넌트:
compiler
업데이트:
2021-05-11 오전 8:42
소개
다중 스레드 환경을 사용할 때, 다중 스레드를 지원하는 표준 라이브러리 사용이 필요합니다. (예를 들어 malloc()
을 호출하는 경우)
해결방안
표준 라이브러리에서 다중 스레드 지원을 사용할 수 있습니다. Development Guide 에서 'Enabling Multithread Support' 챕터를 확인하세요.
검증
시스템/파일 lock 인터페이스를 구현한 뒤, 예로 malloc/free를 호출할 때 시스템 lock 함수들이 호출 되는 것을 확인 하는 것이 가능합니다. *Mtxinit
, *Mtxlock
그리고 *Mtxunlock
함수 내에 중단점을 설정하고 malloc/free의 호출 단계로 넘어가세요.
RTOS 사용시
실시간 운영체제(RTOS) 사용 시, 가장 먼저 고려해야 할 것은 다중 스레드 지원을 구현해야할 이유가 있는지 여부입니다.
많은 RTOS 벤더들은 이미 상기의 것들을 구현해놓았습니다. 예를 들어:
- Micrium uC/OS-II 와 III: uC/OS-III User's Manual의 "Thread Safety of the Compiler’s Run-Time Library"챕터를 참고하세요.
- Segger embOS": embOS CPU & Compiler specifics의 "Thread-safe system libraries"챕터를 참고하세요.
- Express Logic's ThreadX: ThreadX 와 응용프로그램에 TX_ENABLE_IAR_LIBRARY_SUPPORT 키워드를 정의하는 것에 주의하세요.
- 또한 다른 RTOS: 에서 구현된 자체 heap을 사용하기를 권장합니다.
- Freescale MQX 의 경우 [_mem_alloc].
- Express Logic ThreadX 의 경우 [tx_byte/block_allocate]
RTOS 와 C++ 사용시
다중-스레드 RTOS와 C++ 함께 사용시 다음 컴파일 옵션
--guard_calls
이 사용되어야 합니다. IDE상에, Project -> Options -> C/C++ Compiler -> Extra Options 에서 옵션을 지정할 수 있습니다.
그 이유는 C++의 생성자와 소멸자는 여러 RTOS 스레드에 의해 호출될 수 있기 때문입니다.
IAR Embedded Workbench for ARM 6.60 (혹은 상위버전) 사용시
IAR Embedded Workbench for ARM version 6.60 (혹은 상위버전) 사용시 다음의 링커 옵션을 활성화 해야합니다:
--threaded_lib
Project -> Options -> General Options -> Library Configuration -> Enable thread support in the library IDE 옵션을 통해 활성화 됩니다.
버전 6.40 to 6.50 사용시
Project -> Options -> Linker -> Extra Options에서 링커 옵션의 숫자를 추가하여 다중 스레드 지원을 활성화 합니다.
--redirect 옵션은 다음의 파일에 기술되어 있습니다.
<DLib_Threads.h>
RTOS 구현을 사용하는 경우에도, 이러한 옵션은 추가되어야 합니다.
다음의 링크를 확인하세요 - DLib_Threads.h information, 예제 프로젝트 입니다: Example project (version 6.50.6).zip.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.