2013-06-13 8 views
0

좋아, 이것은 매우 일반적인 질문 일지 모르지만 나는 그 주제에 익숙하지 않고 어떤 힌트도 기쁘게 생각하지 않는다.베어 메탈에 pthreads를 사용하는 크로스 컴파일 프로그램

ARM (arm-xilinx-linux-gnueabi-) 용 SoucereyCodeBench의 크로스 컴파일 도구 체인을 사용하고 있습니다. 컴파일러를 사용하는 라이브러리를 컴파일했습니다. 옵션 : -DSC_INCLUDE_FX -DSC_USE_PTHREADS -pthreads -fPIC -DPIC

베어 메탈 프로그램에 libary를 사용하려면 베어 메탈 컴파일러 (arm-xilinx-eabi-)에 pthread가 필요합니다.

그렇지 않으면 내 프로그램이 우연히 실행되거나 컴파일되지 않습니다. 그럼 베어 메탈을위한 pthread를 컴파일 할 수 있습니까?

+3

** 베어 메탈 ** 프로젝트에서 누가 * 스레드 *를 관리 할 것입니까? 기본적으로이 작업을 수행하려면 OS가 있어야하며 ** 베어 메탈 ** 프로젝트가 더 이상 필요하지 않습니다. –

+1

당신은 [setjmp()/longjmp()] (http://stackoverflow.com/questions/2560792/multitasking-using-setjmp-longjmp)를 사용하는 스레딩을 할 수 있습니다. ** ** ** pthreads * .이런 방식으로 제한된 멀티 태스킹이나 스레딩을 할 수 있습니다. 일반적으로 사용자 공간 스레딩이라고합니다. 그러나, 만약 당신이 전체 날려 * pthreads *, 그럼 당신은 OS를 가지고 수도 있습니다. 베어 메탈 * 컨텍스트 *에서 사용자 공간 스레딩 *은 원시 OS입니다. –

+0

RAM에서 8MB의 사용량이 많은 상자를 시도했지만 응용 프로그램을 방해하는 일부 프로세스가 포함되어있어 2 초의 에버리를 처리합니다. 내가 알기를 원하지 않고 커널 우선 순위를 nice로 변경하고 커널 옆에있는 모든 프로세스를 운이없는 상태로 닫았다. – eactor

답변

4

저는 코드를 변경하지 않고 코드를 포팅하는 matetr가 될 것이라고 생각합니다. 그 이름에서 알 수 있듯이 POSIX 스레드 (pthreads)은 POSIX API를 사용한다고 가정합니다.

베어 메탈 ARM 타겟에 스레드가 필요한 경우 적어도 many 인 스레드 스케줄링 라이브러리가 필요합니다. 대부분의 RTOS는 Linux라는 의미에서 완전한 OS가 아니라 IPC 메커니즘을 사용하는 단순한 스케줄러로, 다른 것과 마찬가지로 정적 라이브러리로 연결하여 모 놀리 식 응용 프로그램에 연결합니다. 시스템이 직접 부트되는 의미에서 "베어 메탈"로 간주됩니다. main() 함수를 사용하여 작업/스레드를 만들고 스케쥴러를 시작해야합니다.

일부 RTOS는 POSIX API를 지원하므로 pthread를 지원하지만 단순 스케쥴러보다는 더 큰 완전한 OS가되는 경향이 있습니다. 그럼에도 불구하고 일반적으로 Linux는 더 작고 확장 성이 뛰어나므로 "베어 메탈"요구 사항을 충족시킬 수 있습니다.

물론 RTOS 라이브러리를 둘러싼 래퍼를 만들지 않아도 코드를 더 쉽게 이식 할 수있는 pthread 호환 API를 제공 할 수 있습니다.

+0

Zynq AMP 용 FreeRTOS와 같은 RTOS를 사용하는 경우 RAM의 8MB BusyBox에서 잘 작동하는 programm/libs를 변경해야합니까? – eactor

+0

@actactor : API가 동일하지 않을 것이라고 지적 했으므로 ,하지만 크게 포팅 계층을 통해 처리 할 수 ​​있으며 스케줄링 알고리즘은 RTOS에서 상황에 따라 다를 수 있지만 스케줄링이 이미 문제가있는 것처럼 들리 - RTOS를 사용하면 스케줄링 알고리즘이 훨씬 강력합니다. 그 외, 코드가 없으면 어떤 문제가 발생하는지 어떻게 알 수 있습니까? – Clifford

+0

@actactor : [NuttX] (http://nuttx.org/)와 같은 POSIX API를 이미 지원하는 RTOS를 사용하는 것이 더 나을 것입니다. 다른 것들도 있지만, 대부분 상업적으로 허가 된 NuttX입니다. BSD입니다. – Clifford

4

스레드 및 베어 메탈

베어 메탈 프로그램의 목표는 당신이 그들에 넣어 무엇을 제공합니다. 대부분의 사람들이 잘 알고있는 pthread 구현은 Linux NPTL 버전입니다.이 버전은 Linux 커널과 GNU C 라이브러리가 작동하도록하기 때문에 작동합니다. 베어 메탈 타겟에서는 Linux 커널이나 GNU C 라이브러리의 이점을 얻지 못합니다. 자신 만의 베어 메탈 스레드 라이브러리와 런타임을 가져와야하지만 그 시점에서 스레드를 제공하는 RTOS를 사용하는 것이 더 나을 것입니다.

툴체인 접두사

GCC 툴체인 접두사 arm-xilinx-linux-gnueabi-에 참고 ARM 리눅스 아니라 베어 메탈로 대상을 나타낸다. arm-xilinx-linux-gnueabi- 툴체인은 pthread 인식 코드 (-lpthread)를 만들지 만 리눅스 대상에는 pthread 라이브러리와 기타 필요한 소프트웨어 계층이 이미 설치되어 있다고 가정합니다.

대신 gcc ARM xilinx 도구 체인의 베어 메탈 버전으로 전환하면 도구 체인 접두어가 arm-xilinx-eabi-이됩니다. 맨손으로 금속과 스레드에 대해 위에서 말한 모든 것이 적용됩니다.