앞으로 PIC 마이크로 컨트롤러를 위해 C ++로 코드를 작성할 수 있습니까?


8

PIC 코딩을 위해 C ++을 사용할 수 있습니까? C ++을 사용하지 못하게하는 하드웨어 제한이 있습니까? C 대신 C ++를 사용할 때 생성 된 .hex 파일의 크기와 프로그램 실행 시간이 얼마나 증가합니까? 현재 PIC에 C ++을 사용하는 것이 실제로 가능합니까? 이에 대한 향후 계획이나 지속적인 개발이 있습니까?


나는 그것이 가능하고 가능할 것이라고 생각하지만 AFAIK는 강력한 하드웨어 관련 프로그래밍에 적합하지 않은 높은 수준의 구조와 기능을 구현하므로 권장하지 않습니다
clabacchio


2
대답은 "예, 이미 존재하는 C ++ 컴파일러가 있습니다"이므로이 점을 그대로 두겠습니다. 그러나 앞으로 Stack Exchange 질문은 미래에 대한 가정이 아니라 검증 가능한 사실에 대한 것이어야합니다.
케빈 베르메르

2
@clabacchio : 반드시 그런 것은 아닙니다. C ++에서는 사용한만큼만 비용을 지불합니다. 내 답변을 참조하십시오 : electronics.stackexchange.com/questions/3027/…
Rocketmagnet

"PIC"는 쓸모없는 일반화입니다. 일부 저가형 PIC (10F200)에서는 C를 사용하는 것이 거의 불가능합니다. 일부 고급 PIC (32MX 시리즈)에서 C ++은 현재 사용된다는 소문이 있으며, 그렇게 할 수없는 기술적 인 이유는 없습니다. 따라서 더 나은 초점을 맞추면 더 유용한 답변을 얻을 수 있습니다. 현재 모든 사람들이 다른 질문에 효과적으로 대답하고 있습니다.
Wouter van Ooijen

답변:


17

PIC 코딩을 위해 C ++을 사용할 수 있습니까?

예, 지금 가능합니다. dsPIC의 경우 IAR Systems C ++ 컴파일러가 있습니다 (매우 오래되었지만 지원되지는 않음).

또 다른 옵션은 C ++에서 C 로의 변환기를 사용하는 것입니다. 사전 빌드 단계를 사용하여 C ++를 C로 변환 한 다음 C를 일반 C 컴파일러에 제공하십시오. LLVM 또는 Comeau의 C ++ 컴파일러 를 살펴보십시오 . Comeau는 $ 50에 불과하지만 전체 툴체인과 라이브러리가 제대로 작동하려면 약간의 노력이 필요할 것입니다.

C ++을 사용하지 못하게하는 하드웨어 제한이 있습니까?

짧은 대답입니다. 하드웨어 제한이 없습니다. 긴 대답으로 C ++은 힙 및 / 또는 스택을 사용하도록 권장합니다. RAM이 제한된 소형 MCU는 어려움을 겪습니다.

힙 / 스택으로 어려움을 겪는 이유는 무엇입니까? 두 가지 이유 : A) 많은 MCU는 RAM이 제한되어있어 힙에는 충분하지 않으며 스택에는 거의 없습니다. B) 많은 MCU가 포인터를 제대로 처리하지 않으므로 스택에서 변수를 사용하면 실제로 성능이 저하됩니다.

사람들이 MCU에서 C ++ 사용에 대해 물을 때 C ++과 C를 비교하는 것이 건설적인 것으로 나타났습니다. MCU에서 C에 대해 똑같은 질문이 계속되었습니다. 사람들은 그 아이디어를 곤경에 빠뜨렸다. 256 바이트 RAM MCU의 고급 언어 불가능한. 그러나 이제 우리는 그것이 가능하다는 것을 알고 있습니다. PIC12에 대해 C를 작성했습니다. 문제 없어요. A) 소프트웨어 개발자가 약간 조심해야한다는 것을 알고 있기 때문에 가능합니다 : malloc () 등을 사용하지 마십시오 .B) 컴파일러는 특히 MCU 용으로 작성되었습니다. 컴파일러는 메모리 할당에 특히주의를 기울이고 힙을 만들려고 시도하지 않으며 스택을 만들지 않을 수 있습니다. 일부 C 컴파일러는 단순히 스택이 필요한 재진입 (재귀) 코드를 작성하지 못하게합니다.

MCU에 C를 작성할 수 있다는 것을 알고 MCU에 C ++를 작성하는 문제에도 같은 대답이 적용됩니다. 컴파일러가 대상 장치의 제한 사항을 이해하고 사용자가 언어도 이해하는 한 실제로 문제는 없습니다. C ++에서는 사용한만큼만 비용을 지불합니다. C를 사용하면 얻을 수있는 정확한 asm 출력을 생성하는 C ++ (객체와 모든 것 포함)을 작성하는 것이 완벽하게 가능합니다.

이제 PIC32는 C ++에 대처할 수 있습니다. 최대 64kB RAM을 가지고 있으며 올바르게 성장한 32 비트 프로세서 인 MIPS 코어를 기반으로합니다. PC뿐만 아니라 포인터와 스택도 처리 할 수 ​​있습니다. 실제로, MIPS를 기반으로하는 PC가 있습니다 (적어도 그랬습니다).

안타깝게도 C ++을 둘러싼 오해가 많이 있습니다. 경험이 많은 코더조차도 언어가 어떻게 작동하는지 전혀 모른다. C ++이 임베디드 CPU에 적합한 이유에 대한 내 답변 을 참조하십시오 .

C 대신 C ++를 사용할 때 생성 된 .hex 파일의 크기와 프로그램 실행 시간이 얼마나 증가합니까?

내가 말했듯이, 차이가 없을 수 있습니다. Bjarne Stroustrup은 다수의 C / C ++ 컴파일러를 비교하여 여러 작업의 시간 및 공간 성능을 비교했습니다. 결과는 다양했습니다. 어떤 경우에는 C ++이 느리고 커졌습니다. 어떤 경우는 느리고 작거나 빠릅니다. 더 빠르거나 작습니다! 따라서 귀하의 질문에 대한 답변은 컴파일러에 크게 의존한다는 것이지만 일반적으로 전혀 차이가 없습니다. 자세한 내용 은 C ++ 성능에 대한 기술 보고서를 참조하십시오.

이에 대한 향후 계획이나 지속적인 개발이 있습니까?

몰라 Microchip C32 컴파일러가 오픈 소스이며 소스를 다운로드 할 수 있다는 것을 알고 있습니다. 또한 내가 일한 누군가가 실제로 온라인에서 몇 가지 지침을 발견하고 컴파일러가 C ++ 코드를 컴파일하도록했습니다. 그러나 그는 적절한 툴 체인으로 나를 설정하기 전에 회사를 떠났습니다.


최신 정보

Microchip은 이제 PIC32 범위의 임베디드 MCU에 사용할 수 있는 C ++ 컴파일러를 보유하고 있습니다.



IAR 웹 페이지 : "레거시 제품 : dsPIC 용 IAR Embedded Workbench는 레거시 제품입니다. IAR Systems는 제품을 업데이트하지 않으며 이에 대한 지원 및 업데이트 계약을 구입할 수 없습니다."
Jason S

IAR 제품은 훌륭하지만 불행히도 매우 비싸고 '구식'인 것 같습니다. 모든 기능을 사용하지 않는 한 모든 플랫폼에서 C ++을 사용할 수 있다는 것을 알고 있습니다. 그러나 클래스를 사용하여 추상화 계층을 추가 할 가능성을 추가합니다. 템플릿을 자주 사용하지 않으며 동적 메모리 할당을 전혀 사용하지 않습니다. PIC24 / PIC32에서 C ++의 다른 경쟁자를 아는 사람이 있습니까?
Hans

예, 죄송합니다. 실제로 큰 도움이되지 않았습니다. 내 답변에 몇 가지 더 추가하겠습니다.
Rocketmagnet

1
마이크로 컨트롤러에서 C를 C ++의 경쟁자로 생각합니다. C ++에서 할 수없는 일을 C에서 할 수 없으며 보이지 않는 함수 호출 (생성자, 소멸자 등)이 적습니다. 코드를보다 결정적이고 명확하게 만듭니다. C와 혼동 될 수없는 필수 C ++ 기능은 무엇입니까?
AngryEE

1
"ASM에서 방해 할 수없는 C의 기능은 무엇입니까?" "아무것도 없습니다"라고 대답하십시오. 설계자가 설계를 지정할 수있는 기능이 향상되었으며 컴파일러에서 구현이 올바른지 확인하도록합니다. 이와 관련하여 C ++의 실질적이고 즉각적인 이점에 대한 목록은 내 답변 electronics.stackexchange.com/questions/3027/… 을 참조하십시오 .
Rocketmagnet

5

C 대신 C ++를 사용할 때 생성 된 .hex 파일의 크기와 프로그램 실행 시간이 얼마나 증가합니까?

사용하는 기능에 따라 다릅니다. 핵심 객체 지향 기능 (클래스 + 메소드)을 사용하는 경우 효과가 거의 없을 것입니다 (변형 된 변수 / 함수 이름이 길어 기호 테이블이 약간 증가 할 수 있음). 좋은 컴파일러로 템플릿을 많이 추가해서는 안됩니다.

모든 것을 끝내고 표준 템플릿 라이브러리와 같은 것들을 가져오고 동적 메모리 할당 및 예외를 사용하면 코드가 부풀려 질 수 있습니다.


OP에 대한 경고 일뿐 아니라 작은 메모리 아키텍처 및 내장 된 항상 실행되는 시스템의 메모리 할당에 매우주의하십시오.
kenny

"-1"사용자가 동의하지 않는 이유에 대해 언급 할 수 있습니까?
Jason S

나는 -1er는 아니지만 템플릿은 코드 팽창을 피하기 위해 매우 조심스럽게 사용해야하는 기능입니다. 충분할 때 많은 알고리즘 사본을 쉽게 얻을 수 있습니다.
피터 그린

그러기 위해서는 실제로 여러 가지 다른 데이터 형식의 템플릿 을 사용해야 하며 , 공통 기본 클래스를 가진 다형성 코드를 사용하지 않는 한 하나의 사본으로 충분하지 않습니다 . (이 경우 런타임 비용이 발생합니다.) 템플릿은 마술처럼 코드를 부 풀리게 만들지 않으며 결과를 알지 못하는 경우 여러 데이터 유형에 사용할 때 부풀린 코드 만 발생시킵니다.
Jason S


1

질문을 다소 일반화하면 MMU (메모리 관리 장치)가 포함 된 임베디드 시장 용으로 제작 된 ARM 프로세서가 있습니다. 메모리 크기 및 할당으로 인해 Java 및 c ++와 같은 언어는 임베디드 선택이 잘못되었습니다. 임베디드 프로세서가 더욱 빠르고 강력 해지고 메모리가 고밀도화되고 저렴 해짐에 따라 임베디드 엔지니어가 선택할 수있는 언어 선택이 크게 달라집니다. MMU 및 64G 플래시 카드가 장착 된 32 비트 600MHz ARM 프로세서는 c ++ 응용 프로그램의 훌륭한 후보입니다. 기존 임베디드 프로세서의 정의에 맞는지 여부는 또 다른 문제입니다.


0

아마 그렇습니다. 그러나 당신은 어쨌든 ... C는 임베디드 언어이며 C ++를 사용할 때의 이점은 없습니다. 오히려 C의 장점은 임베디드에 대한 C ++의 장점보다 훨씬 큽니다. 시간을 낭비하지 마십시오.

  • 함수 포인터 등을 사용하는 방법을 알고 있다면 C ++과 같은 코드를 작성할 수 있습니다. 문제는 없습니다.

5
나는달라고 간청한다. 런타임 비용이 거의 또는 전혀없이 C ++의 많은 기능 (클래스, 템플릿, 연산자 오버로드, 참조)을 사용할 수 있습니다. 그렇습니다.이 모든 것을 해커 구조로 일반 C에서 수행 할 수는 있지만 두뇌에 끌리기 때문에 C ++을 사용하고 있습니다. (물론 나는 더 나은 언어를 사용하고 싶지만 평범한 C보다 하트 비트로 C ++ 컴파일러를 선택합니다.)
Jason S

1
클래스 = 구조체 (내장 메서드는 없지만 원하는 경우 구조체에 함수 포인터를 저장하고 호출 할 수 있음). 템플릿 = 당신은 그것들을 사용합니까 ??? 연산자 과부하 = 예 나도 그것을 원합니다. 참조 = 포인터? 최소한 C를 사용하면 과도한 코드 생성에 대한 걱정이나 컴파일 할 무언가를 얻기 위해 임의의 큰 라이브러리를 포함하지 않고도 원하는 C ++의 '기능'만 사용할 수 있습니다.
AngryEE

1
나는 또한달라고 간청한다.
Rocketmagnet

3
예, 템플릿은 안정적인 고성능 코드를 생성하는 매우 강력한 방법입니다. 참조는보다 안정적인 포인터입니다. C ++에서는 사용하는 기능에 대해서만 비용을 지불합니다. C ++을 더 많이 이해해야한다고 생각합니다.
Rocketmagnet

3
"C는 임베디드 언어"라는 말의 의미를 모르겠습니다. 물론, 그것은 매우 인기가 있습니다. 가장 좋은 언어라고 말하는가? 분명히 아니다.
Rocketmagnet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.