2013-08-17 2 views
-1

저는 최근에 ARM 플랫폼에서 임베디드 프로그래밍을 시작했습니다. 코드 샘플에서 C 언어로 프로젝트를 작성 했음에도 불구하고 코드 사이의 일부 위치에서 자체 작성한 어셈블리 함수를 호출하는 것으로 나타났습니다. 더 놀라운 점은 조립 기능에서 수행하는 작업이 모두 mov smth, smth_else입니다. 코드는 몇몇 전문 팀에서 작성했기 때문에이 작업을 수행하면 어떤 이점이 있습니까? 내 제한 관찰에서왜 임베디드 어셈블리 코드를 작성하고 싶습니까?

UPDATE , 난 그냥이 연습은 예를 필요로하지 않도록 유비쿼터스이라고 생각했습니다, 그러나 그것은 그렇지 않다 것으로 보인다. 그래서 내가 언급 한 사례 중 하나입니다 :

/** 
* @brief Return the Process Stack Pointer 
* 
* @param none 
* @return uint32_t ProcessStackPointer 
* 
* Return the actual process stack pointer 
*/ 
uint32_t __get_PSP(void) __attribute__((naked)); 
uint32_t __get_PSP(void) 
{ 
    uint32_t result=0; 

    __ASM volatile ("MRS %0, psp\n\t" 
        "MOV r0, %0 \n\t" 
        "BX lr  \n\t" : "=r" (result)); 
    return(result); 
} 

CMSIS Cortex-M3 Core Peripheral Access Layer Source File의 한 부분이다. 그래도 나는 왜 branch을 사용하여 BX을 사용하고 C에서는 간단한 함수 호출이나 goto가 아닌가를 이해할 수 없다.

+4

코드를 게시하십시오. –

+1

인라인 어셈블리를 사용하는 것을 제외하면'mrs' (시스템 보조 프로세서 레지스터에서 ARM 레지스터로 이동) 호출은 C를 통해 호출 할 수 없기 때문에 어셈블리를 사용해야합니다. – auselen

답변

3

프로젝트에서 어셈블러를 볼 수있는 많은 이유가있다. :

  • 성능 : 특정 하드웨어의 기능을 최적화합니다. 일반적으로 코덱, CPU 집약적 DSP 조작 (예 : DFT), 일부 C 표준 라이브러리 기능 (예 : memcpy)의 구현에서이를 볼 수 있습니다.
  • C 컴파일러에서는 다음과 같은 작업을 수행 할 수 없습니다. 일반적으로 초기화 코드, 컨텍스트 스위치, 인터럽트 처리기와 같은 운영 체제 구현에있어 매우 전문적인 몇 가지 매우 전문적인 상황입니다. 동기화 작업.
+0

임베디드 아키텍처가 SIMD, VLIW 및 기타 멋진 기능을 지원하지만 ASD는 어디서나 사용할 수 없지만 컴파일러의 단점으로 인해 최적화를위한 장소가 아직 남아 있습니다. 우리는 이상적인 세상에 살지 않기 때문에 :) – lpapp

+0

@LaszloPapp 만약 어떤 것이 있다면 간단히 C 나 C++로 간결하게 표현할 수 없기 때문에 SIMD 단위는 일반 프로세서보다 optiomisation에 덜 따르기 쉽습니다. DSP 연산 및 코덱의 손으로 코딩 된 구현은 매우 보편적입니다. – marko

+0

일반적으로 표준 라이브러리로 싸인 어셈블리 시스템 호출은 필연적으로 사용되지 않았습니다. 팔 세계에서는'svc' (관리자 호출)입니다. – auselen

관련 문제