각 마이크로 컨트롤러 라인에는 고유 한 프로그래밍 언어 / 구문이 있습니까?


10

Arduino를 프로그래밍하고 Teensy 프로그래밍을 시작했습니다. 그것들은 C와 비슷하지만 프로그래밍 언어에는 약간의 뉘앙스가 있습니다.

예를 들어 Arduino의 C에서는 pinMode (pin #, Output / Input) 함수를 호출하여 출력 신호 또는 수신 신호에 디지털 핀을 지정합니다. Teensy의 C에서는 입력 또는 출력 ( Teensy IO 구문 ) 으로 총 4 개의 포트 (각 포트는 핀 모음을 나타냄) 중 하나와 관련된 "DDR"레지스터를 설정합니다 .

새로운 마이크로 컨트롤러를 사용할 때 새로운 "언어"를 효과적으로 배워야하는 경우에 대해 알고 싶습니다. 구문의 뉘앙스에도 불구하고 소프트웨어에서 구성 요소 및 구성 요소가 설정되는 방식이 근본적으로 동일하기 때문에 "언어"라는 단어를 따옴표로 묶습니다. 신호.

같은 의미의 담론에서 : 소프트웨어로 프로그래밍 되지 않은 마이크로 컨트롤러가 있습니까? 아니면 uController를 프로그래밍하는 데 항상 소프트웨어 계층이 있습니까? 후자 인 경우 누가 문서를 작성 / 제공합니까?


2
Arduino프로그래밍 언어는 C ++ ( C 만이 아님)이거나 C ++의 일부 (또는 Processing ) 일뿐 입니다. 완전히 명확하지는 않지만 확실히 C 이상입니다. 예를 들어 클래스와 사용자 정의 연산자 + =가 있습니다.
피터 Mortensen

1
C ++이며 g ++-avr을 사용하여 컴파일합니다. 기술적으로 이것은 독립형 C ++ 구현이 될 것이며 동적 메모리 할당 및 예외가 필요한 것과 같은 이유로 C ++ 표준 라이브러리를 포함하지 않습니다. 클래스 및 템플릿과 같은 언어 기능을 사용할 수 있습니다. 레지스터에 직접 액세스하는 것과 동일한 성능을 달성 하는 템플릿 기반 digitalWrite () 대체 를 보았습니다 . Arduino 메서드에는 상당히 많은 오버 헤드가 있습니다.
r_ahlskog

1
언어는 같습니다. 다른 API입니다. 마이크로 컨트롤러에서 멀어지고 데스크톱 앱을 작성하기 시작하면 Windows, Linux 및 Mac 용 C 프로그램을 작성할 때 정확히 같은 문제에 직면하게됩니다. 순전히 POSIX API (3 가지 플랫폼 모두 지원)를 사용하더라도 사용자의 설정 / 환경 설정을 저장하려는 경우 플랫폼 별 차이가 발생합니다.
slebetman

답변:


3

마이크로 프로세서와 마이크로 컨트롤러는 일반적으로 서로 다른 제품 및 제조업체 라인간에 공유 아키텍처 를 사용합니다 . 이러한 아키텍처는 일반적으로 모든 구현에 공통적 인 저수준 명령 세트 ( 명령 세트 )를 정의합니다 . AC 또는 C ++ 컴파일러는 모든 예를 들어 ARM 프로세서에서 바이트 코드 실행 파일을 생성 할 수 있습니다.

그러나 아키텍처는 절반에 불과합니다. 특정 메모리 주소가 많으므로 온보드 주변 장치, 메모리 관리 및 아키텍처가 다루지 않는 기타 구현 세부 사항

제조업체 나 타사는 일반적으로 정의, 포트 매핑 및 예제 코드를 제공 하는 소스 파일 모음 ( HDK )을 제공합니다. 일반적으로 HDK는 CC ++ 용 입니다. 일반적으로 HDK에는 이와 관련된 데모 보드가 있습니다 ($ 500 arduino 생각). 개발 / 샘플 플랫폼을 설계하려는 장치에 맞게 조정하려면 많은 세부 구성 작업이 필요한 경우가 많습니다.

Arduino는 AVR 아키텍처를 기반으로하며 주로 Atmel에서 지원합니다. Arduino는 최소한의 노력으로 플랫폼을 사용할 수 있도록 플랫폼 부트 로더와 단순화 된 C ++ 함수 및 객체 라이브러리를 만들었습니다. Arduino 플랫폼 및 IDE는 최소 장비를 갖춘 애호가를 위해 설계되었습니다. arduino 이전에 PIC는 사용하기 쉽고 저렴한 BASIC 환경으로 비슷한 역할을 수행했습니다.

전문적인 환경에서이 지원은 일반적으로 공급 업체 / 제조업체에서 제공하거나 제 3 자와 계약을 맺습니다. 저수준 코드와 헤더를 제공하며 HDK를 사용하여 응용 프로그램을 작성하면 대규모 조직에서는 사내에서 수행 할 수 있습니다. 최근 제조업체는 플랫폼 주위에 공개 API / 소프트웨어 에코 시스템을 구축하여 arduino처럼 즉시 사용하기 쉬운 경향이 있습니다. 프로그래밍 지원이 거의없는 수많은 칩이 여전히 존재하며 대부분의 플랫폼 지식은 회사 세계에 잠겨 있습니다.


14

이 경우의 언어는 정확히 동일합니다. Arduino 환경에는 약간의 사용자 친화적 인 기능으로 실제 하드웨어 레지스터 (DDRx, PORTx, INx 등)에 대한 액세스를 '랩핑'하는 추가 라이브러리 (더 많은 C 코드)가 있습니다. 이렇게하면 오버 헤드가 증가하지만 (동일한 작업에 대해 더 많은 명령을 실행해야 함) 이러한 호출 만 사용하는 프로그램을 작성하고 다른 칩 (예 : arduino mega)에 대해 대상을 변경하는 것이 "간단"하므로 유연성이 향상됩니다. 라이브러리는 내부적으로 적절한 매핑을 처리합니다.

다른 벤더의 칩에서 실제로 저수준 액세스를위한 '표준'API는 없습니다. 그러나 모든 하위 수준 액세스는 고정 메모리 주소를 읽고 쓰는 것과 같은 방식으로 수행되므로 전체 액세스 방법은 서로 다른 부분에서 비슷하므로 세부 사항과 이름 만 다릅니다. 아마도 포인터로 캐스팅 된 #defines 레지스터 주소의 거대한 목록이있는 헤더 파일을 제공 할 것입니다. 또는 헤더 파일은 구조를 사용하여 약간의 계층 구조로 항목을 구성합니다. 일부 제조업체는 더 높은 수준의 API를 제공 할 수도 있습니다. 복잡하고 구성하기 어려운 주변 장치에 매우 유용 할 수 있습니다. GPIO는 매우 간단하지만 DMA를 지원하는 USB 컨트롤러와 같은 장치에는 수백 개의 레지스터가있을 수 있습니다.

결론은 그렇습니다. 새로운 레지스터 이름을 알아야하지만 언어는 여전히 C ++ (또는 C, 어셈블리 또는 더 난해한 것)입니다.


4
Arduino는 C (실제로는 C ++)가 아닙니다 .C 컴파일러에 공급하기 전에 약간 변경하는 전처리 기가 있습니다.
Nick Johnson

실제로 Arduino의 경우 C 이상입니다. C ++ (또는 C ++ 의 하위 집합)입니다.
피터 Mortensen

Arduino 라이브러리가있는 기본 C ++입니까?
kayleeFrye_onDeck 1

Arduino IDE는 표준 C ++을 기반으로 약간의 추가 사전 처리를 수행합니다. 대부분의 IDE는이 작업을 수행하지 않습니다.
alex.forencich

기본적으로 C ++이지만 main()미리 정의되어 있습니다. 대신 당신은 두 개의 진입 점을 얻는다 : ( init()그리고 loop()내가 틀렸다면 내가 20 피트 폴로 만 아두 이노를 만졌을 때 나를 교정하라)
slebetman

5

마이크로 컨트롤러와 컴파일러가 혼동되고 있습니다. 특정 마이크로를 프로그래밍 할 수있는 고급 언어는 해당 마이크로에 사용할 수있는 컴파일러의 기능입니다.

낮은 수준에서 마이크로는 머신 명령어를 실행하는데, 컴파일러는 사용자가 "프로그램"으로 간주하는 텍스트 파일을 생성합니다. 실제로 수행 할 논리를 지정하고 있으며 컴파일러는 사용 가능한 기계 명령어를 사용하여 해당 논리를 구현하는 방법을 알아냅니다. 이 경우 프로그래밍하는 것은 마이크로의 기본 명령어 세트가 아니라 컴파일러의 기능입니다.

기본 명령어를 직접 지정하여 마이크로를 프로그래밍 할 수 있습니다. 이것은 어셈블리 언어를 사용하여 수행됩니다. 컴파일러와 마찬가지로 어셈블러는 작성하는 텍스트 파일을 가져 와서 기계 명령어를 생성하는 변환기입니다. 차이점은이 경우 해당 기계 명령어를 직접 지정한다는 것입니다. 각 명령어에는 이름이 주어지며 이진 opcode 대신 이러한 이름을 쓰지만 여전히 명령어를 직접 지정하고 있습니다. 어셈블러는 텍스트 파일에 작성하는 이름과 옵션에서 각 명령어의 정확한 이진 인코딩을 알아내는 단순한 작업 만 수행합니다.

고급 언어는 매우 다른 마이크로에서 동일 할 수 있지만 기계 명령어는 일반적으로 관련 마이크로 제품군 내에서만 유사합니다. 예를 들어, 모든 Microchip PIC 18은 기본 PIC 16과 다르고 PIC 24 및 dsPIC 30 및 33과 같은 16 비트 부분과는 다른 명령 세트 (주로)가 동일합니다.


1
또한 어셈블러는 점프 명령문의 레이블을 해결하므로 손으로 수행 할 때 오류가 발생하기 쉽습니다.
피트 베커

2

프로그래밍 언어는 여전히 C입니다. 그러나 하드웨어에 액세스하는 제조업체의 라이브러리는 다릅니다. 내가 아는 한 표준이 없으므로 모든 제조업체마다 자체 API가 있습니다. 여러 제조업체간에 이식성을 원한다면 API를 제조업체 별 메소드에 매핑하는 특정 구현으로 하드웨어에 액세스하기 위해 고유 한 추상 API를 도입 할 수 있습니다.


실제로 는 C 이상입니다. C ++ (또는 C ++ 의 하위 집합)입니다.
피터 Mortensen

2

다른 답변은 고급 언어 (예 : C ++)와 기계 코드를 구별했지만 각 마이크로 컨트롤러에 관련 '언어'가 있다는 귀하의 진술이 무효화되는 것은 아닙니다.

언어 구현의 차이점은 다른 언어로 분류하기에 충분히 크지 않지만 '방언'으로 구분하는 것을 망설이지 않습니다. 여기에는 두 가지 변경 계층이 존재할 수 있습니다.

  1. 고급 래퍼 라이브러리는 제조업체 또는 타사에서 구할 수 있습니다.
  2. 특정 컴파일러는 표준 호환 코드를 생성하지 않을 수 있습니다

Arduino 플랫폼을 관찰하면서 이러한 점을 살펴 보겠습니다.

  • Arduino 커뮤니티는 AVR 아키텍처 칩을 위해 상당히 추상화 된 C ++ 라이브러리를 제공합니다. 이 라이브러리는 일반적인 C ++ 프로그램에서 기대할 수있는 것과 다른 제어 흐름을 제안합니다 (예 : main () 숨기기).
  • Arduino는 C / C ++ 코드를 생성하는 avr-gcc를 사용하여 코드를 컴파일합니다. 그러나 AVR 칩에서는 예외가 잘 지원되지 않으며 거의 ​​항상 비활성화되어 있습니다. 이러한 큰 기능이 누락되면 결과 프로그램은 '일반적인'C ++ 프로그램처럼 작동하지 않을 수 있습니다.

이것을 알면 임의의 마이크로 컨트롤러를 프로그래밍하는 방법을 어떻게 결정합니까? 몇 가지 옵션이 있습니다.

  1. 특정 칩에 맞는 커뮤니티 제작 라이브러리 및 IDE를 검색하십시오. AVR 칩은 때때로 C 만 사용하여 개발되지만 Arduino 프로젝트는 애호가에게보다 사용자 친화적 인 경험을 제공합니다.
  2. 특정 칩에 맞게 컴파일 할 수있는 컴파일러를 찾으십시오. 적절한 컴파일러, 칩의 데이터 시트 및 약간의 인내심을 사용하면 금속에 매우 가까운 코드를 작성할 수 있습니다.

참고로 다음은 GCC에 지원되는 백엔드 목록입니다. ARM, AVR, MIPS 및 기타 몇 가지가 지원됩니다.

'소프트웨어'로 프로그래밍되지 않은 칩 정보

FPGA (Field-Programmable Gate Array)를 살펴볼 수 있습니다! FPGA는 로직 게이트를 에뮬레이션하기 위해 룩업 테이블의 값을 변경하여 제어됩니다. 이것은 그에 상응하는 소프트웨어 형태를 갖지 않지만 여전히 VHDL 및 Verilog와 같은 하드웨어 설명 언어를 사용하여 개발되었습니다.


1

하나의 pcboard를보고 일부 표면 실장 장치, 일부 저항 및 커패시터 및 LED를 봅니다. 이는 해당 보드 중 하나가 비디오 카드이기 때문에 저항과 커패시터가있는 모든 보드와 다중 레이어 및 트레이스가 모두 비디오 카드라는 것을 의미합니까? 아니.

여기 또 다른 예가 있습니다.이 웹 페이지는 영어 알파벳과 영어 단어를 사용합니다. 뉴욕 타임즈 웹 사이트도이 웹 사이트를 뉴욕 타임즈로 만들었습니까? 그들은 단지 같은 알파벳과 언어를 공유하지만 완전히 다릅니다.

C는 그 아래에 설정된 명령어를 추상화하는 범용 프로그래밍 언어입니다. 베어 메탈에 사용할 수 있고, 서로 다른 운영 체제와 호환되지 않고 서로 호환되지 않게 만드는 데 사용될 수 있으며, 비디오 게임 등을 만드는 데 사용할 수 있습니다. 모두 동일한 기본 C 언어, 일부 공통 C 기능 및 구성 및 대상 응용 프로그램에 고유 한 함수 호출 언급 한 각 플랫폼 또는 다른 플랫폼에 대해 누군가가 선택한 기능 세트가있을 수 있습니다. 지금까지 저를 포함한 소수의 사람들이 당신에게 같은 대답을 주었지만 다른 방식으로 썼습니다. 100 명의 프로그래머를 데려와 서로 분리하고 프로그래밍의 자유를 완전히 제한하지 않고 특정 문제를 해결하기위한 프로그래밍 작업을 제공합니다. 그리고 당신은 서로 다른 솔루션과 호환되지 않는 1에서 100까지의 다른 곳을 얻을 것입니다. 아마도 훈련과 경험에 따라 1이 아니라 몇 가지 공통 주제, 그리고 세트로 고유 한 변수 이름과 기능 이름. 이미 이야기하고있는 보드를 가져 가면 다른 플랫폼과 호환되지 않을뿐만 아니라 다른 많은 플랫폼과 호환되지 않는 (arduino 함수와 호환되는) 자체 C 코드가 있음을 알 수 있습니다. 그것은 베어 메탈 임베디드 프로그래밍의 아름다움이며, 당신은 어떤 식 으로든 제약을받지 않으며, 운영 체제 표준 라이브러리 호출이나 guis 제한된 규칙 세트 등 완전한 자유 안에 살 필요가 없습니다. 훈련과 경험에 따라 1이 아니라 여러 가지 공통 주제가 있으며, 각 개인마다 고유 한 변수 이름과 기능 이름이 있습니다. 이미 이야기하고있는 보드를 가져 가면 다른 플랫폼과 호환되지 않을뿐만 아니라 다른 많은 플랫폼과 호환되지 않는 (arduino 함수와 호환되는) 자체 C 코드가 있음을 알 수 있습니다. 그것은 베어 메탈 임베디드 프로그래밍의 아름다움이며, 당신은 어떤 식 으로든 제약을받지 않으며, 운영 체제 표준 라이브러리 호출이나 guis 제한된 규칙 세트 등 완전한 자유 안에 살 필요가 없습니다. 훈련과 경험에 따라 1이 아니라 여러 가지 공통 주제가 있으며, 각 개인마다 고유 한 변수 이름과 기능 이름이 있습니다. 이미 이야기하고있는 보드를 가져 가면 다른 플랫폼과 호환되지 않을뿐만 아니라 다른 많은 플랫폼과 호환되지 않는 (arduino 함수와 호환되는) 자체 C 코드가 있음을 알 수 있습니다. 그것은 베어 메탈 임베디드 프로그래밍의 아름다움이며, 당신은 어떤 식 으로든 제약을받지 않으며, 운영 체제 표준 라이브러리 호출이나 guis 제한된 규칙 세트 등 완전한 자유 안에 살 필요가 없습니다. 이미 이야기하고있는 보드를 가져 가면 다른 플랫폼과 호환되지 않을뿐만 아니라 다른 많은 플랫폼과 호환되지 않는 (arduino 함수와 호환되는) 자체 C 코드가 있음을 알 수 있습니다. 그것은 베어 메탈 임베디드 프로그래밍의 아름다움이며, 당신은 어떤 식 으로든 제약을받지 않으며, 운영 체제 표준 라이브러리 호출이나 guis 제한된 규칙 세트 등 완전한 자유 안에 살 필요가 없습니다. 이미 이야기하고있는 보드를 가져 가면 다른 플랫폼과 호환되지 않을뿐만 아니라 다른 많은 플랫폼과 호환되지 않는 (arduino 함수와 호환되는) 자체 C 코드가 있음을 알 수 있습니다. 그것은 베어 메탈 임베디드 프로그래밍의 아름다움이며, 당신은 어떤 식 으로든 제약을받지 않으며, 운영 체제 표준 라이브러리 호출이나 guis 제한된 규칙 세트 등 완전한 자유 안에 살 필요가 없습니다.

자신 만의 것을 만드는 대신 다른 사람의 샌드 박스에서 게임을하도록 선택할 수도 있고, 많은 사람들이 할 수도 있습니다. 즉, arduino GUI와 C 라이브러리를 사용하는 것을 의미합니다.

동일한 PC를 사용하고 다른 버전의 Windows, Linux, bsd 및 C를 사용하지만 함수 호출이 서로 호환되지 않는 다른 운영 체제의 세탁 목록을 실행할 수 있습니다. 동일한 하드웨어 및 호환되지 않는 C는 다른 하드웨어, 동일한 언어로 확장되어 호환되거나 호환되지 않는 코드를 가질 수 있습니다. 언어는 결코 호환되지 않습니다.

C는 이러한 임베디드 플랫폼에서 사용되는데, 이것이 일반적인 관행이므로 C를 대신 할 수있는 다른 언어는 없습니다. 새로운 프로세서의 첫 번째 단계는 물론 어셈블리입니다. 그리고 거의 항상 C 다음이고, 운영 체제 (linux, bsd 등)를 실행할만큼 강력하다면 다른 프로세서 일 것입니다. C는 플랫폼간에 코드를 포팅하는 당시 문제를 해결하려고 노력했으며 운영 체제가 운영 체제에서 실행되는 운영 체제가있는 한 표준 C 파일을 수행하는 경우 작업 및 printf 등 그러나 베어 메탈 (bare metal)은 운영 체제가 없다는 것과는 다른 이야기입니다. 파일 시스템이나 디스플레이에 대한 개념이없는 경우가 많지만, 일반적으로 C 컴파일러는 기본적으로 C를 대상 특정 어셈블리 언어로 바꾸는 C 컴파일러가 있습니다.


실제로 Arduino의 경우 C 이상입니다. C ++ (또는 C ++ 의 하위 집합)입니다.
Peter Mortensen

1

두 번째 질문에 답하기 위해 "마이크로 컨트롤러"라는 용어는 칩에 CPU 및 RAM (및 아마도 ROM)이 내장되어 있음을 의미합니다. 모든 마이크로 컨트롤러는 소프트웨어를 실행하므로이를 선호합니다.

첫 번째 질문에 대해 더 자세히 살펴보면 모든 MCU에 C 컴파일러가 있지만 기본 C 언어가 모든 프로세서의 모든 명령을 지원하지는 않습니다. 예를 들어 C에는 왼쪽 / 오른쪽 이동 연산자가 있지만 왼쪽 / 오른쪽 회전 연산자는 없습니다. C의 포인터 시스템은 (일부 하버드 아키텍처에서와 같이) 별도의 프로그램 및 데이터 주소 공간을 자연스럽게 지원하지 않습니다. C는 SIMD를 직접 지원하지 않습니다.

컴파일러에는 이러한 기능을 처리하기위한 몇 가지 옵션이 있습니다.

  1. 일반적으로 새 키워드를 사용하여 기본 언어를 확장하십시오 (예 : 페이지 메모리의 경우 근거리 및 원거리).

  2. 내장 함수를 제공하십시오 (예 : 회전을위한 __ror () 및 __rol ()).

  3. C 연산 시퀀스가 ​​하나의 효율적인 명령어 (예 : 곱하기 / 누산)로 컴파일되도록 최적화기로 처리하십시오.

  4. C 표준이 아닌 기능을 원한다면 무시하고 사용자가 어셈블리 코드를 작성하도록하십시오.

다음 단계는 주로 모든 레지스터를 정의하는 제조업체가 제공 한 헤더 파일입니다. 직접 만들 수도 있지만 MCU의 전문가가 아니라면 큰 고통입니다.

마지막으로 제조업체에서 제공하는 라이브러리 함수가 있으며 레지스터 쓰기와 같은 하위 항목을 처리합니다.

귀하의 예는 두 가지 수준을 혼합합니다. DDR은 레지스터를 나타내는 매크로입니다. 포인터 액세스 또는 컴파일러 내장 함수로 구현됩니다 (어떤 것을 잊어 버렸습니다). pinMode ()는 DDR 레지스터에 쓰는 함수입니다.

한 MCU 라인에서 다른 MCU 라인으로 갈 때 새로운 레지스터와 새로운 컴파일러 단점을 배워야합니다. 같은 회사에 머무르면 비슷한 API를 얻을 수 있습니다. 다른 회사는 API를 공유하지 않습니다. 경쟁 업체로 전환하는 데 왜 도움이됩니까? :-)


1

마이크로 컨트롤러는 종종 하드웨어 레벨에서 다른 마이크로 코드를 갖습니다. 기계어 코드 (즉, 숫자 형태의 명령어-각각은 마이크로 컨트롤러의 원시 마이크로 코드를 나타내는 명령어) 또는 기호 어셈블러 (각 기계어 코드 명령어에 대한 니모닉 레이블을 제공함)를 입력하지 않도록하기 위해 휴대용 고급 언어가 사용됩니다.

C와 Forth는 여러 머신 코드 세트에서 쉽게 이식 할 수 있도록 의도적으로 설계되었습니다.

Arduino에서 C를 사용하고 Teensy에서 C를 사용하면 두 경우 모두 C를 사용합니다.

Arduino에서 Forth를 사용하고 Teensy에서 Forth를 사용했다면 두 경우 모두 Forth를 사용하게됩니다.

때때로, 추가적인 하드웨어 설비는 언어를 새로운 하드웨어로 포팅하는 사람 (또는 그룹)에게 많은 저수준 코드를 작성할 필요없이 하드웨어 플랫폼의 새로운 설비에 액세스 할 수 있도록 사전 제작 된 코드를 작성하도록합니다. 당신 자신.

이러한 라이브러리 (C) 또는 사전 (Forth)은 하드웨어 관련 기능이나 단어를 포함 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.