문제

와 연관되다:

코드를 작성하는 경우 마이크로컨트롤러 어셈블리나 C 또는 다른 고급 언어로 작성하면 실제로 차이가 있습니까?C 코드를 작성한다면 어떻게 컴파일하겠습니까?

감사해요

도움이 되었습니까?

해결책

여러 의견:

1) 물론이다 ~ 아니다 성능이나 최적화 제약으로 인해 보증되지 않는 한 조립하십시오.다음 측정항목은 어셈블리와 함께 지붕을 통과합니다.

  • 코딩할 시간
  • 디버깅할 시간
  • 테스트할 시간
  • 문서화할 시간
  • (1년 후) 코딩할 때 무엇을 하고 있었는지 알아낼 시간입니다.
  • 실수할 확률

2) 나는 네임스페이스 캡슐화와 용이성을 위해 C보다는 C++를 선호합니다. 컴파일 타임 객체 지향 관행.C에는 전역 변수 및 네임스페이스 충돌 가능성이 너무 많습니다.(실시간 Java도 좋겠지만 제가 알기로는 요구 사항이 여전히 꽤 높은 것으로 알고 있습니다.)

또는 오히려 C++의 하위 집합입니다.예외, 가상 함수, 런타임 유형 식별 및 대부분의 경우 동적 메모리 할당을 제외합니다. 기본적으로 런타임 중에 많은 추가 리소스가 필요하므로 컴파일 타임에 지정되지 않은 채로 남아 있는 모든 것입니다.이것이 바로 C++의 "부풀림"입니다.

저는 C++용, TMS320 및 MSP430 마이크로컨트롤러용으로 TI와 IAR의 컴파일러를 각각 사용해 왔으며 적절한 최적화 설정을 사용하면 C++에서 기대할 수 있는 오버헤드를 줄이는 환상적인 작업을 수행합니다.(특히 당신이 이 도구를 현명하게 사용하여 도움을 준다면 더욱 그렇습니다. inline 예어)

나는 좋은 코드 재사용을 촉진하는 컴파일 시간 이점 중 일부를 위해 템플릿을 사용하기도 했습니다.예를 들어8비트, 16비트, 32비트 CRC를 처리하기 위한 단일 소스 코드 파일 작성그리고 컴파일 타임 다형성 클래스의 일반적인 동작을 지정한 다음 이를 재사용하되 해당 기능 중 일부를 재정의할 수 있습니다.다시 말하지만, TI 컴파일러는 적절한 최적화 설정을 통해 오버헤드가 매우 낮았습니다.

저는 Microchip PIC용 C++ 컴파일러를 찾고 있었습니다.내가 찾은 유일한 회사는 IAR입니다.($$$는 장애물이었지만 언젠가 사본을 구입하고 싶습니다.) Microchip C18/C30 컴파일러는 꽤 훌륭하지만 C++가 아니라 C입니다.

3) 컴파일러 최적화에 대한 특정 주의사항:디버깅을 매우 어렵게 만들 수 있습니다.종종 최적화된 C/C++ 코드를 한 단계씩 진행하는 것이 불가능하며 조사식 창에는 최적화되지 않은 코드에 포함되어야 한다고 생각하는 것과 상관 관계가 없는 변수가 표시될 수 있습니다.(좋은 디버거는 특정 변수가 존재하지 않거나 메모리 위치가 아닌 레지스터로 최적화되었음을 경고합니다.많은 디버거는 그렇지 않습니다.>:(

또한 좋은 컴파일러를 사용하면 #pragmas를 통해 함수 수준에서 최적화를 선택/선택할 수 있습니다.내가 사용한 것들은 파일 수준에서 최적화를 지정하는 것만 가능했습니다.

4) C 코드를 어셈블리에 인터페이스:이것은 일반적으로 어렵습니다.가장 쉬운 방법은 원하는 서명이 있는 스텁 함수를 만드는 것입니다. uint16_t foo(uint16_t a, uint32_t b) {return 0; }, 어디 uint16_t = unsigned short의 경우 일반적으로 비트 수를 명시적으로 지정합니다.그런 다음 이를 컴파일하고 생성된 어셈블리를 편집합니다(코드의 시작/종료 부분만 남겨두세요). 조심하세요 작업이 완료된 후 복원하지 않고 레지스터를 훼손하지 마십시오.

인라인 어셈블리는 일반적으로 무언가를 수행하지 않는 한 문제가 발생할 수 있습니다. 매우 인터럽트를 활성화/비활성화하는 것과 같이 간단합니다.

내가 가장 좋아하는 접근 방식은 컴파일러 내장/"확장 ASM" 구문입니다.Microchip의 C 컴파일러는 GNU C 컴파일러를 기반으로 하며 "확장 ASM"를 사용하면 인라인 어셈블리의 비트를 코딩할 수 있지만 어떤 레지스터/변수를 참조하고 있는지 알려주는 많은 힌트를 제공할 수 있으며 어셈블리 코드가 C에서 "잘 작동"하는지 확인하기 위해 레지스터의 모든 저장/복원을 처리합니다. .TMS320 DSP용 TI 컴파일러는 이를 지원하지 않습니다.일부 용도로 사용되는 제한된 내장 함수 세트가 있습니다.

나는 자주 실행되는 일부 제어 루프 코드를 최적화하거나 sin(), cos() 및 arctan()을 계산하기 위해 어셈블리를 사용했습니다.하지만 그렇지 않다면 나는 어셈블리를 멀리하고 고급 언어를 고수할 것입니다.

다른 팁

대부분의 마이크로 컨트롤러 제조업체는 PC에서 코드를 컴파일한 다음 이를 마이크로 컨트롤러로 전송할 수 있는 일종의 크로스 컴파일러를 제공합니다.

왜 C인가?
C의 장점은 나중에 코드를 다른 마이크로 컨트롤러로 포팅하기가 더 쉽다는 것입니다.컴퓨팅의 역사를 보면 코드는 일반적으로 하드웨어 구현보다 오래 지속됩니다.
두 번째 장점은 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만드는 제어 구조(if, for, while)입니다.

왜 어셈블리 언어인가?
최적화를 직접 제작할 수 있습니다.

평결
이런 종류의 질문에서 종종 그렇듯, 장단점은 특정 용도에 따라 크게 달라집니다.
C 코드 내에서 어셈블리 호출을 수행하여 두 가지를 혼합하는 것이 가능한 경우가 많으므로 프로젝트에 적합한 균형을 찾을 수 있습니다.

PIC 하드웨어에만 해당
그것 것 같다 대부분의 PIC 하드웨어에는 GCC 옵션이 없습니다.반면에, 논평자가 언급한 것처럼 16비트 PIC24 및 dsPIC33용 Microchip C30 컴파일러는 gcc입니다.
PIC는 아직 지원되지 않습니다. SDCC.
새로운 정보:의견에 따르면 SDCC는 PIC에 대해 실행 가능한 지원을 제공합니다.
다른 오픈 소스도 있습니다 옵션, 하지만 나는 그들에 대한 경험이 없습니다.

가장 좋은 옵션은 아마도 C로 코딩하는 것일 것입니다. 그런 다음 직접 최적화 해야하는 몇 가지 인스턴스의 경우 컴파일러보다 더 나은 작업을 수행 할 수있는 경우 어셈블리를 C 파일에 코딩해야합니다.

어셈블리 코딩은 PC에서는 과거의 일이지만 임베디드에서는 매우 관련성이 높습니다.

임베디드에서 어셈블리를 작성하는 것은 PC에서 어셈블리를 작성하는 것과 다릅니다.PC 컴파일러는 최적화된 명령을 생성하는 데 있어 "인간보다 우수"합니다.임베디드 시스템은 종종 이상한 아키텍처를 가지고 있으며, 최적화 컴파일러는 PC 최적화 컴파일러만큼 성숙하지 않습니다.

마이크로 컨트롤러를 위해 작문 어셈블리와 함께 실행 한 한 가지 문제는 매우 코드가 어떻게 배치되었는지주의하십시오. 점프 테이블 크로스 메모리 경계를 갖고 코드가 정말 이상한 장소로 점프하는 것은 다소 혼란 스럽습니다. C에서 코딩하면 컴파일러는 귀하를위한 기본으로 덮습니다.

나는 확실히 C와 함께 갈 것입니다. 더 빠르며 더 안정적인 소프트웨어를 만듭니다. 어셈블리에는 제공 할 것이 거의없고 부족한 경우가 있습니다. C에서

  • 기존 플랫폼, 심지어 PC에서도 쉽게 포트 코드를 포트 할 수 있습니다.
  • 실행 속도 나 코드 크기를 손상시키지 않고도 높은 수준의 언어로 개발할 수 있습니다. 단, 품질 컴파일러를 사용할 수있는 경우 (PIC18에 대한 많은 선택이 있습니다), 이들은 손으로 만든 어셈블리보다 C에서 더 나을 것입니다.
  • 코드를 디버그, 테스트 및 유지 관리하는 것이 훨씬 쉽습니다. C는보다 안정적인 코드를 생성합니다.

PIC18과 구체적으로 관련된 또 다른 것. 비 직관적 인 사진 아키텍처 및 메모리 뱅크와 같은 것들을 다룰 필요가 없습니다.

나는 좋은 경험을 가졌다 iar 과거 8051에 대한 C 컴파일러.

나의 최근 접근 방식은 항상 다음과 같습니다.-

우수한 최적화 컴파일러로 C로 작성하고 크기 나 속도에 문제가있는 경우 어셈블러에서 특정 부품을 다시 작성하는 것을 고려하십시오.

그러나이 접근법을 취한 이후로 나는 결코 결코 결코 없습니다 필요합니다 한 줄의 어셈블러를 작성하려면 ...

C로 가십시오!

나는 대형 CE 제조업체에서 일했습니다. 마지막으로 어셈블리를 보았을 때 RC5 및 RC6 디코딩 및 TV 튜닝 알고리즘의 일부 작은 인터럽트 서비스 루틴에서 1996 년경에있었습니다. 그 후에는 항상 C와 C ++ (사용 된 클래스, STL, 예외 없음 또는 RTTI)를 사용했습니다. 8051의 오래된 Keil 컴파일러 및 Greenhills Compiler (MIPS) 및 VXWorks Toolset (PowerPC 기반)에 대한 경험이 있습니다.

Roddy가 말했듯이 먼저 C로 쓰고 나중에 어셈블리에서 최적화하십시오 (필요한 경우).

많은 경우 어셈블리가 더 빠를 수 있습니다. 데스크탑에있을 때는 컴파일러가 핸드 어셈블리가 거의 필수적이지는 않지만 UC 세계에서는 종종 그렇습니다. 또한 인터럽트 처리 루틴과 그와 같은 내용을 작성 해야하는 경우 C에서는 종종 할 수 없습니다.

컴파일에 관해서는 Google 주변의 대상 C 컴파일러를위한 Google.

할 때를 제외하고 확실히 C

  • 프로그램 메모리는 매우 제한적입니다. 어셈블러 코드를 손으로 최적화 한 후에는이 1024 바이트의 플래시에서 0 바이트가 남은 상태에서 프로그램에 맞게 관리합니다. 이 경우 C 컴파일은 좋은 것이 아닙니다.

  • 절대 타이밍 제어를 원합니다. 인터럽트 대기 시간의 양이 너무 길면 어셈블러에 의존해야합니다.

요즘 문제는 내장 된 것이 6 핀과 몇 바이트의 RAM이있는 다락방에서 일부 사람들의 데스크탑 컴퓨터를 부끄러워하는 내장 된 OS를 실행하는 멀티 코어 SBC에 이르기까지 모든 것이 될 수 있다는 것입니다.

따라서 Langauge / Development Environment의 선택은 시스템이 얼마나 복잡한 지에 대해 얼마나 효율적이어야하는지 고려해야합니다.

우선 -C는 어디에서나 작동하고 스케일이 꽤 잘 작동하며, 더 높이 갈수록 외부 라이브러리 등을 더 많이 부르면 복잡성을 처리합니다.

매우 작은 마이크로 (바이트로 플래시/RAM 측정)의 경우 ASM을 사용하는 것이 가장 좋습니다. KB 범위에 도달하면 C 또는 다른 전통적인 언어는 모든 바이트를 계산할 필요가 없으므로 사용할 수 있습니다. 일단 당신이 함께 할 수있는 메가 바이트가 있으면, 당신에게 당신은 당신의 능력과 점점 더 많은 것을 돌보고 개발 시간을 줄이기 위해 RTO를 사용해야하는 요구 사항을 모두 가지고 있습니다. 하드웨어가있을 때까지 완전히 날려 버린 OS를 실행할 수 있습니다. 하드웨어에서 자신을 추출하고 Java 또는 SomeSuch와 같은 패딩 된 셀에 모든 것을 쓸데 걱정하지 않고 모든 것을 쓸데 걱정하지 않고 모든 것을 쓸 수 있습니다. 더 이상 진짜 프로그래머가 아닙니다 ...;)

위의 예외는 하드웨어에서 밀어 넣을 수있는 모든 성능이 필요할 때입니다.이 시점에서 효율적으로 유지하기 위해 레벨 또는 2 개의 레벨을 줄여야 할 수도 있습니다.

C를 사용하면 나중에 직접 최적화 할 수있는 경우 C 또는 어셈블러 (C ++ 등)를 사용하지 않습니다.

키는 PIC를 사용하는 경우 마이크로 컨트롤러 명령어 세트입니다. 또는 8051도 어셈블러 만 사용합니다. ARM 또는 AVR 또는 MSP430과 같은 컴파일러 친화적 인 ISA 인 경우 C를 사용하여 일부 타이핑을 저장하지만 다양한 이유로 어셈블러에 일부 루틴이있을 수 있습니다. 마찬가지로 C 라이브러리를 피하고 싶을 것입니다. Newlib조차도 너무 부피가 크고 코드 나 아이디어를 빌릴 수 있지만 하나만 링크하지 마십시오. 오, 질문으로 돌아가서 대상에 사용할 수있는 C 컴파일러를 다시 살펴보십시오. ARM과 AVR 당신은 아무런 문제가 없습니다. 아마도 MSP도 괜찮을 것입니다. Keil 또는 IAR이 컴파일러를 판매한다고해서 구매하거나 사용해야한다는 의미는 아니지만 무료 컴파일러뿐만 아니라 급여의 출력이 끔찍할 수 있습니다. 어쨌든 ASM에 정통해야하고 출력을 검사해야합니다 (아마도이를 위해 분리기를 작성해야 할 것입니다).

결론 (또 다른 결론), 글로벌 답변이 없습니다 (C보다 높은 모든 것을 피하십시오. 글로벌 답변입니다) 항상 플랫폼이 무엇인지에 따라 다릅니다. 자원이 무엇인지에 따라 작업 요구 사항이 문장성 요구 사항입니다. (마이크로 컨트롤러에 진정으로 내장되어 있다면, 정의에 따라 휴대용이 아님), 어떤 컴파일러, 디버거, JTAG 등을 사용할 수 있는지, 어떤 호스트 운영 체제를 개발하고있는 한 큰 요소가 될 수 있습니다.

어셈블리에 서면이 필요할 때 다른 시간이 필요할 수 있습니다. 저수준 RAM 테스트 또는 이와 유사한 경우 데이터가 저장되는 위치에 대한 절대적인 제어가 필요합니다.

예를 들어, 확인하는 소프트웨어 -2 (안전 무결성 수준) 이상은 가능한 데이터 손상을 감지하기 위해 RAM을 지속적으로 점검해야 할 수 있습니다. 확인중인 RAM 영역은 점검 중에 변경 될 수 없으므로 어셈블러에 테스트를 작성하면 특정 레지스터 또는 다른 RAM 영역에 로컬 변수를 저장하면 이것이 사실인지 확인할 수 있습니다. . 이것은 불가능하지는 않지만 C에서 어렵다.

RAM을 높이고 0이 아닌 정적 변수를 초기화하는 시작 코드는 동일한 서면으로 Assembler로 작성 될 수 있지만 이러한 종류의 코드는 일반적으로 제공됩니다.

장치별 주변 장치에 크게 의존하는 코드를 작성 중이고 사용 중인 도구 체인이 이를 효율적으로 활용하는 데 필요한 내장 기능을 제공하지 않는 경우(예: 형편없는 Freescale DSP563CC 컴파일러) 어셈블리를 사용하십시오.

그 외에도 어셈블리 사용과 어셈블리 사용에 대한 암묵적인 규칙이 있다고 생각합니다.고급 언어는 데스크톱 소프트웨어 개발 언어와 거의 동일합니다.코드를 깔끔하고 유지 관리 가능하게 유지하고 기계어로 핫 코드를 최적화하세요.

어셈블러 언어의 코드는 작은 발자국으로 인해 실제로 빠르지 만 어셈블러 언어로 작성된 코드는 재사용 가능한 코드가 아닙니다. 코드에 대한이 재사용 기능은 소프트웨어 설계에 가장 중요한 기능입니다. 예를 들어, X86 프로세서 용 어셈블러 프로젝트 코드가있는 경우 ARM 프로세서가 아닌 X86 프로세서에만 사용할 수 있습니다. 그러나 X86 프로세서에 대한 프로젝트 C/C ++ 코드가있는 경우 ARM 프로세서 에이 코드를 사용할 수 있습니다. 따라서 소프트웨어 개발을 위해 어셈블러를 피하는 것이 좋습니다.

아무도 언급 한 것은 너무 나쁘다. 둘 다 소규모 환경에 적합 할 수 있으며 인상적인 생산성을 제공 할 수 있습니다.

일반 C 또는 파스칼, modula2. 그러나 C를 의미하는 컴파일러 가용성으로 인해 C.

동적 할당과 프로그램 크기는 일반적으로 매우 제한적이기 때문에 C ++ 및 유사한 추가는 스타일의 근거가 흥미 롭습니다.

또한 앱이 빡빡하면 더 복잡한 런타임이 고통 스러울 수 있습니다.

어셈블러도 유용 할 수 있지만 실제로 거대한 양을 판매하는 경우에만 더 작은 펌웨어는 더 작고 저렴한 칩 (플래시가 적음)을 의미하며 프로그램 크기를 감독 할 수 있습니다 (읽기 : 시간이 지남에 따라 버그가 없을 가능성이 있습니다. )

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top