문제

질문

나는 두 컴파일러에 내 하드웨어는 C++및 C89

나는 생각을 사용하여 C++클래스로 하지 않고 다형성(피 vtables).주요 이유로 사용하고 싶 C++습니다:

  • 내가 사용하는 것을 선호"inline"기능을 대신의 매크로를 정의 합니다.
  • 나는 다음과 같이 사용하는 네임스페이스로 접두사를 혼란 코드입니다.
  • 나는 C++비트 입력을 더 안전한 주로하기 때문에 템플릿을 자세한 캐스팅.
  • 정말 좋아한 과부하 기능과 생성자(사용을 위한 자동적인 주조).

너는 어떤 이유로든 집착 C89 을 개발할 때 매우 제한된 하드웨어(4kb RAM)?

결론

귀하의 답변을 주셔서 감사합니다,그들은 정말 도움이 되었다!

나는 생각을 통해 주제와 내가 지팡이와 함께 C 기 때문에 주로:

  1. 그것은 쉽게 예측하는 실제 코드에서는 C 이것은 정말 중요가 있는 경우에만 4kb ram.
  2. 내 팀으로 주로 구성되어의 C 개발자,그래서 고급 C++기능을 수 없는 자주 사용됩니다.
  3. 내가 찾는 방법을 인라인 기능을 내 C 컴파일러(C89).

그것을 받아들이기 힘들어 하나 대답을 제공하는 많은 좋은 대답을 제공합니다.불행하게도 내가 만들 수는 없습니다 wiki 고 그것을 받아들이다,그래서 나는 것 중 하나를 선택하는 답변을 생각하게 했다.

도움이 되었습니까?

해결책

C ++보다 C를 사용하는 두 가지 이유 :

  1. 많은 임베디드 프로세서의 경우 C ++ 컴파일러가 없거나 추가 비용을 지불해야합니다.
  2. 내 경험은 내장 된 소프트웨어 엔지니어의 중요한 비율이 C ++에 대한 경험이 거의 없거나 전혀 없다는 것입니다. 그들이 아는 것.

또한 원래의 질문과 여러 의견은 4KB를 언급합니다. . 일반적인 임베디드 프로세서의 경우 RAM의 양은 코드가 저장되고 Flash에서 실행될 때 코드 크기와 관련이 없습니다.

확실히, 코드 저장 공간의 양은 염두에 두어야 할 것이지만, 새롭고 더 다양한 프로세서가 시장에 나타나기 때문에 가장 비용에 민감한 프로젝트를 제외한 모든 문제보다 문제가 적습니다.

임베디드 시스템과 함께 사용하기 위해 C ++의 서브 세트를 사용하는 경우 : 이제 Misra C ++ 표준, 이는 볼만한 가치가 있습니다.

편집하다: 또한보십시오 이 질문, 이로 인해 임베디드 시스템의 C 대 C ++에 대한 토론이 이루어졌습니다.

다른 팁

자원 제한된 대상 등과 같은 4KB RAM,나는 물 테스트로 일하기 전에 샘플을 저지르고 많은 노력할 수 없는 쉽게 이식으로 순수한 ANSI C 의 구현입니다.

임베디드 C++작업 그룹았다고 제안한 표준의 일부 언어 및 표준의 하위 집합은 표준 라이브러리를 가진다.나의 노력 때 C 는 사용자의 저널,사망했습니다.이 문서에서 Wikipedia, 고 위원회 여전히 존재합니다.

에 포함된 환경,당신은 정말 조심해야에 대한 메모리를 할당합니다.을 적용하는 관리할 수 있을 정의하는 데 필요한 글로벌 operator new() 고 그 친구가 될 수 없는 심지어는 연결을 알 수 있도록 그것이 사용되지 않습니다.위치 new 다른 한편으로는 가능성이 당신의 친구가 될 때 신중하게 사용되와 함께 안정적이,thread-safe,및 대기 시간을 보장 할당 방식입니다.

인라인 기능을 발생시키지 않 많은 문제되지 않는 한,큰 충분히 그들은 있었어야 진정한 기능입니다.물론 그들의 매크로 교체하는 동일한 문제입니다.

템플릿 너무 문제가 발생하지 않을 수 있습니다면 자신의 인스턴스를 실행 날뛰.에 대한 모든 템플릿을 사용할,감사의 생성된 코드(링크를 지도할 수 있는 충분한 단서)에 확인만 인스턴스화할 예정 사용하는 일이 일어났습니다.

하나는 다른 문제가 발생할 수 있는 것 호환성의 디버거.그것을 위해 특별하지 않는 그렇지 않으면 사용 가능한 하드웨어 디버거가 매우 제한적 지원와의 상호 작용을 위해 원본 소스 코드입니다.는 경우 효과적으로 디버깅해야에서 어셈블리,그 재미있는 이름을 엉망으로 C++추가 할 수 있습 추가 혼동하는 작업입니다.

온,동적이트에 여러 기업에 무거운 다형성,그리고 예외를 모두와 함께 일부 금액의 런타임 비용에 대한 그들의 사용입니다.몇 사람들의 특징하는 수준 이상의 비용이 전체 프로그램을 사용되는 경우,다만 다른 사람의 무게를 증가시키는 클래스가 필요합니다.이의 차이를 알고,선택은 고급 기능을 현명하게 전체의 지식이 적어도 간단한 비용/효과 분석.

에서 작은 포함된 환경을 하나로 직접 연결하는 실시간 커널이나 실행에서 직접 하드웨어입니다.어느 쪽이든,당신은 필요하신이 있는지 확인하십시오 런타임이 시작 코드 핸들 C++특정 시작 잡습니다.이 될 수 있는 것처럼 간단을 사용하십시오른 링커 옵션이 있지만,는 것이 일반적이기 때문가 직접 제어 소스에 전원을 다시 설정 항목이 포인트이 필요할 수 있습 감사는 특정 그것은 모든 것입니다.예를 들어,Dhcp 플랫폼에서 근무했고,개발 도구와 함께 제공됩 CRT0.모듈는 C++를 이니셜라이저 존재하기는 하지만 의견니다.는 경우에 사용했다 그것은 바로부터 상자,내가 속으로 글로벌 객체의 생성자를 했지에서 모두.

또한,에 포함된 환경,그것은 종종 필요한을 초기화 하드웨어 장치기 전에 그들이 사용할 수 있고,없을 경우 OS 없 부트로더,그것은 당신의 코드입니다.당신을 기억할 필요가 생성자를 위한 글로벌 객체가 실행 main() 이라는 것입니다 그래서를 수정할 필요가 지역 CRT0.S(또는 그 상당액)을 얻을 수 있는 하드웨어 초기화 수행 글로벌 생성자 자신이라고합니다.분명히,최고의 main() 너무 늦습니다.

아니요. 문제를 일으킬 수있는 C ++ 언어 기능 (런타임 다형성, RTTI 등)은 내장 개발을 수행하는 동안 피할 수 있습니다. 임베디드 C ++ 개발자 커뮤니티가 있습니다 (이전 C/C ++ 사용자 저널에서 C ++를 사용하는 임베디드 개발자가 열을 읽는 것을 기억합니다).

그만큼 C ++ 성능에 대한 기술 보고서 이런 종류의 훌륭한 가이드입니다. 임베디드 프로그래밍 문제에 대한 섹션이 있습니다!

또한 답변에 포함 된 C ++의 언급에 대한 ++. 표준은 내 취향에 대해 100%가 아니지만 C ++의 어떤 부분을 떨어 뜨릴 수 있는지 결정할 때 약간의 참조입니다.

소규모 플랫폼에 대한 프로그래밍 동안 예외와 RTTI를 비활성화하고 가상 상속을 피하고 우리가 거주하는 가상 기능의 수에주의를 기울였습니다.

친구는 링커 맵입니다. 자주 확인하면 코드 소스와 정적 메모리가 빨리 발견됩니다.

그런 다음 표준 동적 메모리 사용 고려 사항이 적용됩니다. 언급 한 것만 큼 제한된 환경에서는 동적 할당을 전혀 사용하지 않을 수 있습니다. 때로는 작은 다이내믹 한 allocs를 위해 메모리 풀 또는 "프레임 기반"할당을 통해 블록을 prealloged하고 나중에 모든 것을 버릴 수 있습니다.

C ++ 컴파일러를 사용하지만 C ++ 특정 기능 사용을 제한하는 것이 좋습니다. C ++에서 C와 같은 프로그램을 할 수 있습니다 (C 런타임은 C ++를 수행 할 때 포함됩니다. 대부분의 임베디드 응용 프로그램에서는 표준 라이브러리를 사용하지 않습니다).

계속해서 C ++ 클래스를 사용할 수 있습니다.

  • 가상 기능 사용을 제한하십시오 (말한대로)
  • 템플릿 사용을 제한하십시오
  • 임베디드 플랫폼의 경우 운영자를 새롭게 재정의하거나 메모리 할당을 위해 새로 사용하는 배치를 원합니다.

펌웨어/임베디드 시스템 엔지니어로서 C가 여전히 C ++보다 #1 선택 인 이유를 알려줄 수 있습니다.

1) 우리가 개발 한 일부 대상은 코드와 데이터 모두에 대해 64KB의 RAM을 가지고 있으므로 모든 바이트 계산을해야합니다. 예, 2 시간이 지난 4 바이트를 절약하기 위해 코드 최적화를 처리했습니다. 2008.

2) 크기 제한으로 인해 최종 코드로 입력하기 전에 모든 C 라이브러리 기능을 검토하므로 사람들이 분할 (하드웨어 분배기 없음, 큰 라이브러리가 필요하지 않음), Malloc (힙이 없기 때문에)을 사용하지 않는 것을 선호합니다. , 모든 메모리는 512 바이트 청크의 데이터 버퍼에서 할당되며 코드를 검토해야 함) 또는 큰 벌금을 부과하는 다른 객체 지향 관행. 카운트를 사용하는 모든 라이브러리 기능을 기억하십시오.

3) 오버레이라는 용어를 들어 본 적이 있습니까? 코드 공간이 거의 없으므로 때로는 다른 코드 세트로 물건을 교환해야합니다. 라이브러리 기능을 호출하면 라이브러리 기능이 상주해야합니다. 오버레이 함수에서만 사용하는 경우 너무 많은 객체 지향 방법에 의존하는 많은 공간을 낭비하고 있습니다. 따라서 C ++를 수락 할 수는 없지만 C 라이브러리 기능을 가정하지 마십시오.

4) 제한된 하드웨어 설계 (예 : 특정 방식으로 연결된 ECC 엔진)로 인해 캐스팅 및 포장 (부정확하지 않은 데이터 구조가 단어 경계를 가로 지르는 경우)이 필요하거나 하드웨어 버그에 대처해야합니다. 당신은 너무 많은 것을 너무 많이 가정 할 수 없으므로 왜 물체가 너무 많이 방향을 배치합니까?

5) 최악의 시나리오 : 객체 지향 방법 중 일부를 제거하면 폭발 할 수있는 자원을 사용하기 전에 생각할 수 있습니다 (즉, 데이터 버퍼가 아닌 스택에 512 비트를 할당 함). 전체 코드 경로를 모두 테스트하거나 제거하지 않습니다.

6) 우리는 많은 추상화를 사용하여 하드웨어를 소프트웨어로부터 유지하고 가능한 한 휴대용으로 코드를 만들고 시뮬레이션 친화적입니다. 하드웨어 액세스는 다른 플랫폼간에 조건부로 컴파일되는 매크로 또는 인라인 함수로 래핑해야하며, 데이터 유형은 대상별로 바이트 크기로 캐스팅되어야하며 직접 포인터 사용이 허용되지 않아야합니다 (일부 플랫폼은 메모리 매핑 I/O가 데이터 메모리와 동일) 등

나는 더 많은 것을 생각할 수 있지만 당신은 아이디어를 얻습니다. 미국 펌웨어 녀석들은 객체 지향 교육을 가지고 있지만 임베디드 시스템의 작업은 하드웨어 지향적이고 낮은 수준 일 수 있으므로 본질적으로 높은 수준이나 추상적이지 않습니다.

BTW, 내가 본 모든 펌웨어 작업은 소스 제어를 사용합니다. 그 아이디어를 어디서 얻는 지 모르겠습니다.

-Sandisk의 펌웨어 녀석.

내 개인적인 취향은 C입니다.

  • 나는 모든 코드 라인이 무엇을하고 있는지 (및 비용) 알고 있습니다.
  • 나는 모든 코드 라인이 무엇을하고 있는지 알기에 충분히 C ++를 잘 모른다 (그리고 비용)

사람들은 왜 이것을 말합니까? 너 ~하지 않다 ASM 출력을 확인하지 않으면 C의 모든 라인이 무엇을하는지 알아보십시오. C ++도 마찬가지입니다.

예를 들어,이 무고한 진술은 다음과 같습니다.

a[i] = b[j] * c[k];

상당히 결백 해 보이지만 GCC 기반 컴파일러는 8 비트 마이크로를 위해이 ASM을 생성합니다.

CLRF 0x1f, ACCESS
RLCF 0xfdb, W, ACCESS
ANDLW 0xfe
RLCF 0x1f, F, ACCESS
MOVWF 0x1e, ACCESS
MOVLW 0xf9
MOVF 0xfdb, W, ACCESS
ADDWF 0x1e, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfa
MOVF 0xfdb, W, ACCESS
ADDWFC 0x1f, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0xfee, 0x1c
NOP
MOVFF 0xfef, 0x1d
NOP
MOVLW 0x1
CLRF 0x1b, ACCESS
RLCF 0xfdb, W, ACCESS
ANDLW 0xfe
RLCF 0x1b, F, ACCESS
MOVWF 0x1a, ACCESS
MOVLW 0xfb
MOVF 0xfdb, W, ACCESS
ADDWF 0x1a, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfc
MOVF 0xfdb, W, ACCESS
ADDWFC 0x1b, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0xfee, 0x18
NOP
MOVFF 0xfef, 0x19
NOP
MOVFF 0x18, 0x8
NOP
MOVFF 0x19, 0x9
NOP
MOVFF 0x1c, 0xd
NOP
MOVFF 0x1d, 0xe
NOP
CALL 0x2142, 0
NOP
MOVFF 0x6, 0x16
NOP
MOVFF 0x7, 0x17
NOP
CLRF 0x15, ACCESS
RLCF 0xfdf, W, ACCESS
ANDLW 0xfe
RLCF 0x15, F, ACCESS
MOVWF 0x14, ACCESS
MOVLW 0xfd
MOVF 0xfdb, W, ACCESS
ADDWF 0x14, W, ACCESS
MOVWF 0xfe9, ACCESS
MOVLW 0xfe
MOVF 0xfdb, W, ACCESS
ADDWFC 0x15, W, ACCESS
MOVWF 0xfea, ACCESS
MOVFF 0x16, 0xfee
NOP
MOVFF 0x17, 0xfed
NOP

생성 된 지침의 수는 다음과 같습니다.

  • a, b 및 c의 크기.
  • 그 포인터가 스택에 저장되어 있는지 또는 글로벌인지
  • i, j 및 k가 스택에 있든 전역인지

이것은 프로세서가 C를 처리하기 위해 설정되지 않은 작은 임베디드 세계에서 특히 그렇습니다. 따라서 내 대답은 C와 C ++가 항상 ASM 출력을 검사하지 않는 한 서로만큼 나쁘다는 것입니다. 서로만큼 좋습니다.

휴고

일부 사람들은 더 간단하고 생성 될 실제 코드를 예측하기가 더 쉽기 때문에 임베디드 작업에 대해 C를 선호한다고 들었습니다.

나는 개인적으로 C 스타일 C ++ (유형 안전에 템플릿을 사용하여)를 쓰면 많은 장점을 줄 것이라고 생각할 것입니다.

C ++ 대신 C를 사용할 이유가 없습니다. C에서 할 수있는 것은 C ++에서도 할 수 있습니다. VMT의 오버 헤드를 피하려면 가상 방법과 다형성을 사용하지 마십시오.

그러나 C ++는 오버 헤드없이 매우 유용한 관용구를 제공 할 수 있습니다. 내가 가장 좋아하는 것 중 하나는 Raii입니다. 메모리 또는 성능면에서 클래스는 비용이 많이 들지 않습니다 ...

IAR Workbench에 ARM7 Embedded Paltform에 대한 코드를 작성했습니다. 컴파일 타임 최적화 및 경로 예측을 수행하기 위해 템플릿에 의존하는 것이 좋습니다. 전염병과 같은 역동적 인 캐스팅을 피하십시오. Andrei Alexandrescu의 저서에 규정 된대로, 당신의 유리한 특성/정책을 사용하십시오. 현대 C ++ 디자인.

배우기가 어려울 수 있지만, 귀하의 제품 이이 접근법의 혜택을받을 것이라고 확신합니다.

정당한 이유와 때로는 유일한 이유는 특정 임베디드 시스템에 대한 C ++ 컴파일러가 여전히 없기 때문입니다. 예를 들어 그렇습니다 마이크로 칩 사진 마이크로 컨트롤러. 글을 쓰기가 매우 쉽고 무료 C 컴파일러 (실제로 C의 약간의 변형)가 있지만 C ++ 컴파일러는 보이지 않습니다.

4K의 RAM으로 제한된 시스템의 경우 C ++가 아닌 C를 사용하여 진행중인 모든 것을 볼 수 있습니다. C ++를 사용하는 것은 코드에서 빛나는 것처럼 보이는 것보다 훨씬 더 많은 리소스 (CPU 및 메모리)를 사용하기가 매우 쉽다는 것입니다. (오, 나는 그 일을하기 위해 또 다른 blerfobject를 만들 것입니다 ... Whoops! 기억에서!)

이미 언급했듯이 C ++ (RTTI, VTABLE 등 없음 등)로 C ++로 수행 할 수 있지만 C ++ 사용량이 C에서 해당하는 것처럼 C ++ 사용량이 멀어지지 않도록하는 데 많은 시간을 소비합니다. .

인간의 마음은 가능한 한 많이 평가 한 다음 집중해야 할 중요한 것을 결정하고 나머지를 버리거나 감가 상각하는 것을 결정함으로써 복잡성을 다룹니다. 이것은 마케팅의 브랜딩 뒤에 뒷받침되는 전체와 크게 아이콘입니다.

이 경향을 막기 위해 나는 C에서 C ++를 선호합니다. 코드에 대해 생각하고 하드웨어와 더 밀접하게 상호 작용하는 방법 - 끊임없이 근접하는 방법을 선호합니다.

오랜 경험을 통해 C는 당신이 당신의 길을 벗어나서 당신이 당신의 길을 벗어나서 많은 시간을 낭비하여 문제에 대한 더 나은 해결책을 제시하도록 강요한다는 것이 나의 믿음입니다. 또는 "커버 아래"에 무슨 일이 일어나고 있는지 알아냅니다.

그 정맥에서 C와 같은 저급 언어에서 하드웨어에 초점을 맞추고 좋은 데이터 구조/알고리즘 번들을 구축하는 데 많은 시간을 소비하고, 높은 수준의 언어는 머리를 긁는 데 많은 시간을 소비해야합니다. 그리고 왜 당신이 당신의 특정 상황과 환경에서 완벽하게 합리적인 일을 할 수 없는지. 컴파일러를 제출하여 (강한 타이핑은 최악의 범죄자 임) 생산적인 시간을 사용하는 것이 아닙니다.

나는 아마도 프로그래머 곰팡이에 잘 맞습니다 - 나는 제어를 좋아합니다. 제 생각에, 그것은 프로그래머에게는 성격 결함이 아닙니다. 통제는 우리가 지불하는 일입니다. 보다 구체적으로, 완벽하게 제어. C는 C ++보다 훨씬 더 많은 제어를 제공합니다.

개인적으로 4KB의 메모리를 사용하면 C ++에서 훨씬 더 많은 마일리지를 얻지 못한다고 말하면 언어가 중요하지 않기 때문에 작업에 가장 적합한 컴파일러/런타임 조합으로 보이는 것을 선택하십시오.

도서관이 중요하기 때문에 어쨌든 언어에 관한 것이 아닙니다. 종종 C libs는 최소 크기가 약간 작지만 임베디드 개발을 목표로하는 C ++ lib가 줄어들므로 테스트해야한다고 상상할 수 있습니다.

일부는 C 컴파일러가 고급 C ++ 기능을 지원할 필요가 없으므로 최적화에 더 공격적 일 수 있기 때문에 훨씬 더 효율적인 코드를 생성 할 수 있다고 말합니다.

물론이 경우 두 개의 특정 컴파일러를 테스트에 넣을 수 있습니다.

C는 이식성에서 승리합니다 - 언어 사양이 덜 모호하기 때문입니다. 따라서 다양한 컴파일러 등 (두통이 적음)에서 훨씬 더 나은 휴대 성과 유연성을 제공합니다.

C ++ 기능을 활용하지 않으려면 필요를 충족시키지 않으면 C와 함께 가십시오.

매우 제한된 하드웨어 (4KB의 RAM)를 개발할 때 C89를 고수 할 이유가 있습니까?

개인적으로, 임베디드 애플리케이션과 관련하여 (내장을 말할 때, 나는 Wince, iPhone 등을 의미하지 않습니다. 자원 제한 장치를 의미합니다. 나는 C를 선호하지만 C ++도 꽤 많이 작업했지만 C를 선호합니다.

예를 들어, 당신이 말하는 장치는 가지고 있습니다 4KB 램의, 그 이유 때문에 나는 C ++를 고려하지 않을 것입니다. 물론, C ++를 사용하여 작은 것을 설계하고 다른 게시물과 같이 응용 프로그램에서 사용을 제한 할 수 있지만 C ++ "은"잠재적으로 표지 아래에 응용 프로그램을 복잡하게/팽창시킬 수 있습니다.

정적으로 연결 하시겠습니까? C ++ 대 C를 사용하여 정적 A 더미 응용 프로그램을 비교할 수 있습니다. 대신 C를 고려하게 할 수 있습니다. 반면에 메모리 요구 사항 내에서 C ++ 애플리케이션을 구축 할 수 있다면 이동하십시오.

IMHO는 일반적으로 임베디드 애플리케이션에서 진행중인 모든 것을 알고 싶습니다. 누가 메모리/시스템 리소스를 사용하고 있습니까? 그들은 언제 그들을 풀어 주나요?

X 양의 리소스, CPU, 메모리 등을 가진 대상을 개발할 때 .. 나는 당신이 어떤 미래의 요구 사항이 무엇인지 알지 못하기 때문에 해당 리소스를 사용하는 것의 하단에 머물려고 노력합니다. 단순한 작은 응용 프로그램 이었지만 결국 훨씬 더 커지는 것으로 추정되었습니다.

내 선택은 일반적으로 우리가 사용하기로 결정한 C 라이브러리에 의해 결정되며, 이는 장치의 수행에 따라 선택됩니다. 따라서 9/10 번. 결국 UCLIBC 또는 Newlib 및 C입니다. 우리가 사용하는 커널은 이것에도 큰 영향을 미치거나 우리가 자신의 커널을 작성하는 경우에도 큰 영향을 미칩니다.

그것은 또한 공통점의 선택이기도합니다. 대부분의 좋은 C 프로그래머는 C ++를 사용하는 데 아무런 문제가 없습니다 (많은 사람들이 그들이 사용한다고 불평하지만). 그러나 나는 반대가 사실이라는 것을 알지 못했습니다 (내 경험상).

우리가 진행중인 프로젝트에서 (접지 커널과 관련된) 대부분의 작업은 C에서 수행되지만 C ++를 사용하여 네트워킹을 구현하는 것이 더 쉽고 문제가되지 않았기 때문에 C ++에서 작은 네트워크 스택이 구현되었습니다.

최종 결과는 장치가 작동하고 수락 테스트를 통과하거나 그렇지 않습니다. 언어 Z를 사용하여 XX 스택 및 YY 힙 제약 조건에서 FOO를 구현할 수 있다면, 더 생산성을 높이는 것은 무엇이든 사용하십시오.

내 개인적인 취향은 C입니다.

  • 나는 모든 코드 라인이 무엇을하고 있는지 (및 비용) 알고 있습니다.
  • 나는 모든 코드 라인이 무엇을하고 있는지 알기에 충분히 C ++를 잘 모른다 (그리고 비용)

예, 나는 C ++에 익숙하지만 표준 C를 수행하는 것뿐만 아니라 모르겠습니다.

이제 그 반대를 말할 수 있다면, 당신이 알고있는 것을 사용하십시오 :) 그것이 작동한다면, 테스트를 통과하는 등 .. 문제는 무엇입니까?

얼마나 ROM/FLASH 있습니까?

4kB RAM 수 있는 여전히 뜻의 수백이 있다 kb 의 플래시에 저장이 실제 코드는 정적이다.RAM 이 크기는 경향이 있을 의미한 변수,그리고 당신은 신중과 함께할 수 있는 적합 매우 큰 프로그램 측면에서 코드의 라인으로 메모리입니다.

그러나,C++로 만드는 경향이 퍼팅 코드 및 데이터 플래시에 더 어려운 때문에-실행 시간을 건설 규칙에 대한 개체입니다.C 에서,일정한 구조체 수 쉽게 넣으로 플래시 메모리처럼 액세스 하드웨어-지속적인 개체입니다.C++에서,일정한 객체를 필요로는 컴파일러를 평가하는 생성자를 컴파일 시간에는 생각은 여전히 넘어는 C++컴파일러를 할 수 있(이론적으로,당신은 그것을 할 수 있지만,그것은 매우 매우 어렵습).

그래서"작은 램","큰 FLASH"종류의 환경 이동으로 C 가능합니다.참고 중간에 좋은 선택이 나는 C99 있는 가장 좋은 C++기능을 위한 비 클래스를 기반으로-코드입니다.

일반적으로 아니요. C ++는 C의 슈퍼 세트입니다. 이것은 새로운 프로젝트에 특히 그렇습니다.

CPU 시간 및 메모리 풋 프린트 측면에서 비용이 많이 드는 C ++ 구조물을 피하는 데 올바른 길을 가고 있습니다.

다형성과 같은 일부는 매우 가치가있을 수 있습니다. 본질적으로 기능 포인터입니다. 필요하다고 생각되면 현명하게 사용하십시오.

또한 우수한 (잘 설계된) 예외 처리는 기존 오류 코드로 물건을 처리하는 앱보다 임베디드 앱을 더 안정적으로 만들 수 있습니다.

C IMHO를 선호하는 유일한 이유는 플랫폼의 C ++ 컴파일러가 양호하지 않은 경우 (버기, 최적화가 좋지 않은 등).

그 책 게임 프로그래머의 경우 C ++ C ++의 기능을 기반으로 코드 크기가 증가하는시기와 관련된 정보가 있습니다.

C99에는 인라인이 있습니다. 어쩌면 당신은 ctors를 좋아하지만 dtors를 올바르게 얻는 사업은 지저분 할 수 있습니다. C를 사용하지 않는 나머지 이유가 네임 스페이스라면 C89를 고수합니다. 이는 약간 다른 임베디드 플랫폼으로 포트를 제공하기를 원하기 때문입니다. 나중에 동일한 코드에서 C ++로 쓰기를 시작할 수 있습니다. 그러나 C ++가 C의 슈퍼 세트가 아닌 다음을 조심하십시오. 나는 당신이 C89 컴파일러가 있다고 말했지만 어쨌든 C99 와이 C ++를 비교한다고 말합니다.

'a'크기 C ++가 아닌 C에서> 1. C에는 VLA 변수 길이 배열이 있습니다. 예시: func (int i) {int a [i. C에는 VAM 변수 배열 멤버가 있습니다. 예시: struct {int b; int m [];}.

그냥하고 싶은 말이 없는 시스템으로"무한한"리소스입니다.이 세상의 모든 것이 제한적이고 모든 응용 프로그램을 고려해야 한 리소스 사용 여부에 상관없이 그 ASM,C,JAVA 자바스크립트.인형을 할당하는 몇 Mbs"는지 확인하기 위해"만든 아이폰 7,픽셀과 다른 장치에 매우 luggy.여부에 상관없이 당신이 4kb40 기가바이트.

하지만 다른 측면에서 반대하는 자원 낭비-은 시간이 걸리는 사람들을 저장 리소스입니다.걸리는 경우 1 주일이 추가하여 간단한 일 C 을 저장하는 몇 가지고 몇 바이트가 사용하는 대신 C++이미 구현,테스트 및 분산됩니다.왜?그와 같은 구매 usb 허브입니다.네 당신이 그것을 만들 수 있습니 자신이 그러나 그것은 더 나은?더 많은 신뢰할 수 있습니까?저렴하면 당신이 계산하는 시간입니까?

그냥 생각도원에서 당신의 콘센트가 제한되지 않습니다.을 시도하는 연구이에서 오는 당신이 볼 대부분의 연소에서 무언가이다.법의 에너지와 소재는 여전히 유효합니다.없는 자료나 에너지가 나타나거나 사라지지만 오히려으로 변환합니다.

메모리 할당 문제의 경우, 초기화 시간에 필요한 모든 것을 할당하므로 양자 플랫폼과 상태 기계 접근 방식을 사용하는 것이 좋습니다. 또한 경합 문제를 완화하는 데 도움이됩니다.

이 제품은 C와 C ++에서 실행됩니다.

컴파일러에 따라 다릅니다.

모든 임베디드 컴파일러가 모든 C ++를 구현하는 것은 아니며, 그렇게하더라도 코드 팽창 (항상 템플릿의 위험)을 피하는 데 능숙하지 않을 수 있습니다. 몇 가지 작은 프로그램으로 테스트하고 문제가 발생하는지 확인하십시오.

그러나 주어진 좋은 컴파일러, 아니요, C ++를 사용하지 않을 이유가 없습니다.

방금 내장 개발에 ISO C ++를 사용하는 방법을 찾았습니다. 이는 C ++ 또는 C를 사용할 때마다 결정을 내리는 사람에게 흥미로울 수 있습니다.

그것은 Bjarne Stroustrup에 의해 제공되었습니다 그의 홈페이지에서:

ISO C ++가 심각한 임베디드 시스템 프로그래밍에 어떻게 사용될 수 있는지 살펴 보려면 JSF 공기 차량 C ++ 코딩 표준.

질문의 다른 측면에 대한 다른 답변 게시물 :

"Malloc"

일부 이전 답변은 이것에 대해 상당히 이야기합니다. 그 전화가 존재한다고 생각하는 이유는 무엇입니까? 진정으로 작은 플랫폼의 경우 Malloc은 사용할 수없는 경향이 있거나 확실히 선택 사항입니다. 동적 메모리 할당을 구현하는 것은 시스템 맨 아래에 RTO가있을 때 의미가있는 경향이 있지만 그때까지는 순전히 위험합니다.

당신은 그것 없이는 아주 멀리 갈 수 있습니다. 로컬 변수에 대한 적절한 스택이없는 모든 오래된 Fortran 프로그램에 대해 생각해보십시오 ...

전 세계에는 여러 가지 다른 컨트롤러 제조업체가 있으며 디자인을 살펴보면 많은 문제가 발생할 수 있습니다. 어셈블리 언어의 주요 단점은 기계/아키텍처가 의존한다는 것입니다. 개발자에게 다른 컨트롤러 코딩을 달성하기 위해 설정 한 모든 지침을 심장으로 요구하는 것은 정말 큰 일입니다. 그렇기 때문에 C는 하드웨어 의존적 세부 사항에서 알고리즘과 데이터 구조를 추상화하기에 충분히 높은 수준이기 때문에 C는 다양한 대상 하드웨어, 아키텍처 독립 언어 및 매우 쉽게 이루어질 수 있기 때문에 CERMEDDED 개발에서 더 인기를 얻은 이유입니다. 코드를 변환하고 유지 관리합니다. 그러나 우리는 C, C ++, Python, Java 등과 같은 일부 고급 언어 (객체 지향)가 임베디드 시스템 개발의 레이더 아래로 만들기에 충분히 진화하고 있음을 알 수 있습니다.

그런 제한된 시스템에서. 어셈블러로 가십시오. 모든 측면을 완전히 제어 할 수 있으며 오버 헤드를 제공하지 않습니다.

많은 임베디드 컴파일러가 최고의 최적화기가 아니기 때문에 아마도 훨씬 더 빠릅니다 (특히 데스크탑에 대한 것과 같은 최신 컴파일러와 비교하는 경우 (Intel, Visual Studio 등)).

"그래 ...하지만 C는 재사용 할 수 있고 ...". 이러한 제한된 시스템에서는 어쨌든 다른 시스템에서 해당 코드의 많은 부분을 재사용하지 않을 가능성이 있습니다. 같은 시스템에서 어셈블러는 재사용 가능합니다.

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