서비스 핫라인
MCU는 마이크로컨트롤러 유닛의 약자로, 일반적으로 단일 칩 마이크로컴퓨터라고 불립니다. 이는 CPU의 주파수와 사양을 적절히 낮추고 메모리, 카운터, USB, A/D 변환기, UART, PLC, DMA, 심지어 LCD 드라이버 회로와 같은 주변 장치 인터페이스를 단일 칩에 통합하여 칩 수준의 컴퓨터를 구현한 것입니다. MCU는 휴대폰, PC 주변기기, 리모컨, 자동차 전자 장치, 산업용 스테퍼 모터, 로봇 팔 제어 등 다양한 응용 분야에서 여러 가지 제어 조합을 수행할 수 있습니다. 그림에서 MCU를 확인할 수 있습니다.
한
마이크로컨트롤러 개발의 간략한 역사
마이크로컨트롤러의 역사는 그리 길지 않지만, 매우 빠르게 발전해 왔습니다. 마이크로컨트롤러의 생산과 개발은 일반적으로 마이크로프로세서(CPU)의 생산 및 개발과 궤를 같이합니다. 미국의 인텔사가 1971년 최초로 4비트 마이크로프로세서를 출시한 이후, 그 발전 과정은 크게 다섯 단계로 나눌 수 있습니다. 다음은 인텔사의 마이크로컨트롤러 개발 과정을 간략하게 소개합니다.
1971 ~ 1976
마이크로컨트롤러 개발의 초기 단계. 1971년 11월, 인텔은 2,000개의 트랜지스터를 칩당 집적한 4비트 마이크로프로세서인 인텔 4004를 최초로 설계했습니다. 이 제품은 RAM, ROM, 시프트 레지스터를 탑재한 최초의 MCS-4 마이크로프로세서였습니다. 이후 인텔은 8비트 마이크로프로세서인 인텔 8008을 출시했고, 다른 회사들도 8비트 마이크로프로세서를 출시했습니다.
1976 ~ 1980
저성능 마이크로컨트롤러 단계는 인텔이 1976년에 출시한 MCS-48 시리즈로 대표되며, 8비트 CPU, 8비트 병렬 I/O 인터페이스, 8비트 타이머/카운터, RAM 및 ROM을 하나의 반도체 칩에 통합한 모놀리식 구조를 사용합니다. 주소 지정 범위가 제한적이고(최대 4KB), 직렬 I/O가 없으며, RAM과 ROM 용량이 작고, 인터럽트 시스템이 비교적 단순하지만, 일반적인 산업 제어 및 지능형 계측기의 요구 사항을 충족할 수 있습니다.
1980 ~ 1983
고성능 마이크로컨트롤러 단계. 이 단계에서 출시된 고성능 8비트 마이크로컨트롤러는 일반적으로 시리얼 포트, 다단계 인터럽트 처리 시스템, 그리고 여러 개의 16비트 타이머/카운터를 갖추고 있습니다. 온칩 RAM과 ROM 용량이 증가했으며, 주소 지정 범위는 최대 64KB에 달합니다. 일부 칩은 A/D 변환 인터페이스도 제공합니다.
1983년~1980년대 후반
16비트 마이크로컨트롤러 시대. 1983년 인텔은 고성능 16비트 마이크로컨트롤러인 MCS-96 시리즈를 출시했습니다. 최신 제조 기술을 채택하여 칩 집적도가 칩당 최대 120,000만 개의 트랜지스터에 달했습니다.
1990s
마이크로컨트롤러는 통합, 기능, 속도, 신뢰성 및 응용 분야 등 모든 측면에서 더욱 높은 수준으로 발전하고 있습니다.
두
단일 칩 마이크로컴퓨터의 분류 및 응용
마이크로컨트롤러(MCU)는 메모리 종류에 따라 온칩 ROM이 없는 칩과 온칩 ROM이 있는 칩의 두 가지 유형으로 나눌 수 있습니다. 온칩 ROM이 없는 칩은 사용하기 전에 외부 EPROM을 연결해야 합니다(일반적으로 8031). 온칩 ROM이 있는 칩은 온칩 EPROM 타입(대표적인 칩은 87C51), MASK 온칩 마스크 ROM 타입(대표적인 칩은 8051), 온칩 플래시 타입(대표적인 칩은 89C51) 및 기타 타입으로 구분됩니다.
용도에 따라 범용형과 특수용형으로 나눌 수 있으며, 데이터 버스의 폭과 동시에 처리할 수 있는 데이터 바이트 수에 따라 8비트, 16비트, 32비트 MCU로 나눌 수 있다.
현재 국내 MCU 응용 시장이 가장 활발한 분야는 소비자 가전이며, 그 다음으로 산업 분야와 자동차 전자 시장이 뒤를 잇습니다. 소비자 가전에는 가전제품, 텔레비전, 게임 콘솔, 오디오 및 비디오 시스템 등이 포함됩니다. 산업 분야에는 스마트 홈, 자동화, 의료 애플리케이션, 신에너지 생산 및 유통 등이 있습니다. 자동차 분야에는 자동차 파워트레인 및 안전 제어 시스템이 포함됩니다.
세
마이크로컨트롤러의 기본 기능
대부분의 MCU에서 다음과 같은 기능들이 가장 일반적이고 기본적인 기능입니다. MCU마다 설명 방식은 다를 수 있지만, 본질적으로는 동일합니다.
1. 타이머(Timer): 타이머에는 여러 종류가 있지만 크게 두 가지 범주로 나눌 수 있습니다. 첫 번째는 고정 시간 간격 타이머로, 타이밍 시간이 시스템에 의해 설정되며 사용자 프로그램에서 제어할 수 없습니다. 시스템은 사용자 프로그램이 선택할 수 있는 몇 가지 고정 시간 간격(예: 32Hz, 16Hz, 8Hz 등)만 제공합니다. 이러한 유형의 타이머는 4비트 MCU에서 흔히 사용되며, 클록, 타이밍 및 기타 관련 기능을 구현하는 데 사용됩니다.
다른 유형은 프로그래머블 타이머입니다. 이름에서 알 수 있듯이, 이 유형의 타이머는 사용자가 프로그램으로 타이밍을 제어할 수 있습니다. 제어 방법에는 클록 소스 선택, 주파수 분할(프리스케일) 선택, 프리셋 번호 설정 등이 있습니다. 일부 MCU는 이 세 가지 기능을 모두 동시에 지원하는 반면, 다른 MCU는 한두 가지 기능만 지원할 수 있습니다. 이러한 유형의 타이머는 활용도가 매우 높으며, 실제 사용 사례 또한 끊임없이 변화하고 있습니다. 가장 일반적인 응용 분야 중 하나는 PWM 출력을 구현하는 것입니다.
클럭 소스를 자유롭게 선택할 수 있으므로 이러한 유형의 타이머는 일반적으로 이벤트 카운터와 함께 사용됩니다.
2. IO 포트: 모든 MCU는 일정 개수의 IO 포트를 가지고 있습니다. IO 포트가 없으면 MCU는 외부와의 통신 채널을 잃게 됩니다. IO 포트는 구성 가능성에 따라 다음과 같은 유형으로 나눌 수 있습니다.
순수 입력 또는 순수 출력 포트: 이 유형의 IO 포트는 MCU 하드웨어 설계에 따라 결정됩니다. 입력 또는 출력으로만 사용될 수 있으며, 소프트웨어를 통한 실시간 설정은 불가능합니다.
직접 읽기/쓰기 IO 포트: 예를 들어, MCS-51의 IO 포트는 이러한 유형의 IO 포트에 속합니다. IO 포트 읽기 명령이 실행되면 입력 포트가 되고, IO 포트 쓰기 명령이 실행되면 자동으로 출력 포트가 됩니다.
입력 및 출력 방향 설정 프로그래밍: 이 유형의 IO 포트의 입력 또는 출력은 실제 필요에 따라 프로그램에서 설정합니다. 적용 범위가 비교적 넓어 I2C 버스, 다양한 LCD, LED 드라이버 제어 버스 등과 같은 버스 레벨 애플리케이션을 구현할 수 있습니다.
IO 포트를 사용할 때 명심해야 할 중요한 사항은 다음과 같습니다. 입력 포트의 경우, 신호 레벨이 안정적이어야 플로팅 현상이 발생하지 않습니다(풀업 또는 풀다운 저항을 추가하여 이를 확보할 수 있습니다). 출력 포트의 경우, 출력 상태 레벨은 외부 연결 상태를 고려해야 하며, 대기 또는 정적 상태에서 전류 유입이나 유출이 발생하지 않도록 해야 합니다.
3. 외부 인터럽트: 외부 인터럽트 또한 대부분의 MCU에서 기본적으로 제공되는 기능입니다. 일반적으로 신호의 실시간 트리거링, 데이터 샘플링 및 상태 감지에 사용됩니다. 인터럽트 방식에는 상승 에지 트리거, 하강 에지 트리거 및 레벨 트리거가 있습니다. 외부 인터럽트는 일반적으로 입력 포트를 통해 구현됩니다. IO 포트인 경우 입력으로 설정될 때만 인터럽트 기능이 활성화되고, 출력 포트인 경우 외부 인터럽트 기능은 자동으로 비활성화됩니다(ATMEL의 ATiny 시리즈는 출력 포트일 때도 인터럽트 기능을 활성화할 수 있는 예외가 있습니다). 외부 인터럽트의 응용 분야는 다음과 같습니다.
외부 트리거 신호 감지: 하나는 사이리스터 제어, 돌발 신호 감지 등과 같은 실시간 요구 사항에 기반한 것이고, 다른 하나는 전력 절감 필요성에 기반한 것입니다.
신호 주파수 측정: 신호 누락을 방지하기 위해 외부 인터럽트가 이상적인 선택입니다.
데이터 디코딩: 원격 제어 애플리케이션 분야에서는 설계 비용을 절감하기 위해 맨체스터 인코딩 및 PWM 인코딩과 같은 다양한 인코딩된 데이터를 디코딩하는 데 소프트웨어를 사용하는 경우가 많습니다.
키 감지 및 시스템 깨우기: 절전 모드에 들어간 MCU는 일반적으로 외부 인터럽트를 통해 깨워야 합니다. 가장 기본적인 형태는 키 입력으로, 키 입력 동작에 따라 레벨이 변경됩니다.
4. 통신 인터페이스: MCU가 제공하는 통신 인터페이스는 일반적으로 SPI 인터페이스, UART, I2C 인터페이스 등을 포함하며, 각각에 대한 설명은 다음과 같습니다.
SPI 인터페이스: 이 인터페이스는 대부분의 MCU에서 제공하는 가장 기본적인 통신 방식입니다. 데이터 전송은 동기식 클록에 의해 제어됩니다. 신호에는 SDI(직렬 데이터 입력), SDO(직렬 데이터 출력), SCLK(직렬 클록) 및 Ready 신호가 포함됩니다. 경우에 따라 Ready 신호가 없을 수도 있습니다. 이 인터페이스는 마스터 모드 또는 슬레이브 모드로 작동할 수 있습니다. 일반적으로 클록 신호를 제공하는 쪽이 마스터이고, 클록을 제공하지 않는 쪽이 슬레이브입니다.
UART(범용 비동기 수신/송신): 가장 기본적인 비동기 전송 인터페이스입니다. 수신(Rx)과 송신(Tx) 두 개의 신호선만 사용합니다. 기본 데이터 형식은 시작 비트 + 데이터 비트(7비트/8비트) + 패리티 비트(짝수, 홀수 또는 없음) + 정지 비트(1~2비트)입니다. 데이터 1비트를 전송하는 데 걸리는 시간을 보드율이라고 합니다.
대부분의 MCU는 데이터 비트 길이, 데이터 검사 모드(홀수 검사, 짝수 검사 또는 검사 없음), 정지 비트 길이 및 보드율을 프로그램 프로그래밍을 통해 유연하게 설정할 수 있습니다. 이러한 유형의 인터페이스에서 가장 일반적으로 사용되는 방법은 PC의 직렬 포트를 통해 통신하는 것입니다.
I2C 인터페이스: I2C는 필립스에서 개발한 데이터 전송 프로토콜입니다. SDAT(직렬 데이터 입력 및 출력)와 SCLK(직렬 클록)라는 두 개의 신호를 사용하여 구현됩니다. I2C의 가장 큰 장점은 여러 장치를 이 버스에 연결하고 주소를 통해 식별 및 액세스할 수 있다는 점입니다. 또한 I2C 버스의 가장 큰 장점 중 하나는 IO 포트를 통해 소프트웨어로 구현하기가 매우 편리하다는 것입니다. 데이터 전송 속도는 SCLK에 의해 완전히 제어되며, UART 인터페이스처럼 엄격한 속도 요구 사항이 있는 것이 아니라 SCLK를 빠르게 또는 느리게 설정할 수 있습니다.
5. 워치독(Watchdog) 타이머: 워치독은 대부분의 MCU에서 기본적으로 제공되는 기능입니다(일부 4비트 MCU는 이 기능이 없을 수 있습니다). 대부분의 MCU에서 워치독은 프로그램이 리셋만 할 수 있고 끌 수는 없습니다(마이크로칩 PIC 시리즈 MCU처럼 프로그램 등록 시 설정되는 경우도 있고, 삼성 KS57 시리즈처럼 특정 방식을 사용하여 켜짐 여부를 결정하는 경우도 있습니다). 프로그램이 워치독 레지스터에 접근하는 한, 워치독은 자동으로 켜지고 다시 끌 수 없습니다. 일반적으로 워치독 리셋 시간은 프로그래밍 방식으로 설정할 수 있습니다. 워치독의 가장 기본적인 용도는 예기치 않은 오류로 인해 MCU가 다운될 경우 자체 복구 기능을 제공하는 것입니다.
네
글로벌 주류 마이크로컨트롤러 제조업체
마이크로컨트롤러 학습 팁
마이크로컨트롤러 프로그래밍
인터럽트와 메인 프로그램 본문에서 동일한 변수나 데이터에 동시에 접근하거나 값을 설정하는 것을 방지해야 합니다. 효과적인 방지 방법은 이러한 데이터 처리를 모듈로 분리하고, 트리거 플래그를 통해 관련 연산 수행 여부를 결정하는 것입니다. 다른 프로그램 본문(주로 인터럽트)에서는 데이터 처리가 필요한 부분에만 트리거 플래그를 설정합니다. 이렇게 하면 데이터 실행이 예측 가능하고 고유하게 이루어집니다.
마이크로컨트롤러 응용 프로그램 개발에는 코드 사용 효율성, 간섭 방지 성능, 마이크로컨트롤러의 신뢰성 등의 문제가 여전히 해결해야 할 과제로 남아 있습니다. 본 글에서는 마이크로컨트롤러 개발에 있어 반드시 숙달해야 할 몇 가지 기본 기술을 정리했습니다.
여덟
마이크로컨트롤러 개발 기술
1. 프로그램의 버그를 줄이는 방법
프로그램 버그를 줄이는 방법에 관해서는 시스템 운영 중에 고려해야 할 다음과 같은 범위 초과 관리 매개변수를 먼저 살펴보아야 합니다.
- 물리적 매개변수: 이러한 매개변수는 주로 시스템의 입력 매개변수이며, 여기에는 여기 매개변수, 데이터 수집 처리 중 작동 매개변수 및 처리 완료 후 결과 매개변수가 포함됩니다.
- 리소스 매개변수: 이러한 매개변수는 주로 시스템 내 회로, 장치 및 기능 단위의 리소스이며, 메모리 용량, 저장 장치 길이 및 적층 깊이 등이 포함됩니다.
- 응용 프로그램 매개변수: 이러한 응용 프로그램 매개변수는 종종 일부 마이크로컨트롤러 및 기능 장치의 응용 프로그램 조건으로 나타납니다. 프로세스 매개변수: 시스템 작동 중에 순차적으로 변화하는 매개변수를 말합니다.
2. C 언어 프로그래밍 코드의 효율성을 향상시키는 방법
마이크로컨트롤러 개발 및 응용 분야에서 C 언어를 이용한 프로그래밍은 필연적인 추세입니다. C 프로그래밍 효율을 극대화하려면 사용 중인 C 컴파일러에 익숙해지는 것이 중요합니다. 먼저 각 C 언어 컴파일러의 컴파일 효율을 확인하기 위해 어셈블리 언어 명령문의 줄 수를 측정해 보는 것이 좋습니다. 이를 통해 컴파일 효율이 가장 높은 명령문을 선택하여 프로그래밍을 진행하십시오. 각 C 컴파일러마다 컴파일 효율이 다르기 때문에 컴파일 효율 또한 차이가 발생할 수 있습니다. 임베디드 시스템용으로 성능이 우수한 C 컴파일러를 사용했을 때, 동일한 기능을 어셈블리 언어로 작성했을 때보다 코드 길이와 실행 시간이 5~20% 정도만 더 길어지는 것을 확인할 수 있습니다.
개발 시간이 촉박한 복잡한 프로젝트의 경우 C 언어를 사용할 수 있지만, MCU 시스템의 C 언어 및 C 컴파일러에 대한 충분한 이해가 필수적입니다. 특히 C 컴파일 시스템에서 지원하는 데이터 유형과 알고리즘에 주의해야 합니다. C 언어는 가장 널리 사용되는 고급 언어이지만, MCU 제조사마다 C 언어 컴파일 시스템이 다르고, 특히 일부 특수 기능 모듈의 동작 방식이 다를 수 있습니다. 따라서 이러한 특징을 제대로 이해하지 못하면 디버깅 과정에서 많은 문제가 발생하여 어셈블리 언어보다 실행 효율이 떨어질 수 있습니다.
간섭을 방지하는 가장 효과적인 방법은 간섭원을 제거하고 간섭 경로를 차단하는 것이지만, 현실적으로 그렇게 하기가 어려운 경우가 많습니다. 따라서 마이크로컨트롤러의 간섭 방지 능력이 충분한지 여부만 확인할 수밖에 없습니다. 하드웨어 시스템의 간섭 방지 능력을 향상시키는 동시에, 소프트웨어 간섭 방지 기술은 유연한 설계, 하드웨어 자원 절약, 그리고 높은 신뢰성 덕분에 점점 더 주목받고 있습니다.
마이크로컨트롤러 간섭의 가장 흔한 현상은 리셋입니다. 프로그램이 폭주하는 경우, 소프트웨어 트랩과 워치독을 사용하여 프로그램을 리셋 상태로 되돌릴 수 있습니다. 따라서 마이크로컨트롤러 소프트웨어가 간섭에 강하려면 리셋 상태를 제대로 처리하는 것이 가장 중요합니다.
일반적으로 마이크로컨트롤러에는 리셋 원인을 판별하는 데 사용할 수 있는 플래그 레지스터가 있습니다. 또한, 사용자가 직접 RAM에 플래그를 저장할 수도 있습니다. 프로그램이 리셋될 때마다 이러한 플래그를 통해 리셋 원인을 파악하고, 각 원인에 따라 해당 프로그램으로 바로 점프할 수 있습니다. 이를 통해 프로그램은 중단 없이 계속 실행될 수 있으며, 사용자는 프로그램 실행 중에 리셋되었다는 사실을 인지하지 못하게 됩니다.
4. 마이크로컨트롤러 시스템의 신뢰성을 테스트하는 방법
마이크로컨트롤러 시스템 설계가 완료되면, 각 마이크로컨트롤러 시스템 제품마다 다양한 테스트 항목과 방법이 있지만, 반드시 테스트해야 하는 항목들이 있습니다.
- 마이크로컨트롤러 소프트웨어 기능의 완성도를 테스트합니다.
- 전원 켜짐 및 전원 꺼짐 테스트
- 노화 시험
- ESD 및 EFT와 같은 테스트
때로는 사람이 사용하는 동안 발생할 수 있는 손상을 시뮬레이션할 수도 있습니다. 예를 들어, 정전기 방지 능력을 테스트하기 위해 마이크로컨트롤러 시스템의 접촉 포트를 사람의 신체나 옷감에 의도적으로 문지르거나, 전자기 간섭 저항 능력을 테스트하기 위해 고출력 전동 드릴을 마이크로컨트롤러 시스템 가까이에서 사용할 수 있습니다.
또한 개발 및 적용 과정에서 기술을 숙달하고 효율성을 향상시켜 더 넓은 범위에서 활용될 수 있도록 해야 합니다.
아홉
칩 작동 요약
칩에서의 연산은 주로 칩 내 레지스터에 대한 연산으로 이루어집니다. 칩의 레지스터는 메모리에 매핑된 고유한 주소를 가지고 있으며, 해당 주소에 대한 연산이 바로 그 레지스터에 대한 연산입니다. 칩을 살펴볼 때는 먼저 타이밍 다이어그램을 확인하고, 각 레지스터의 작동 방식을 이해한 후, 프로그램에서 식별할 수 있는 필요한 포트를 정의하고, 쓰기 연산 절차와 읽기 연산 절차를 작성해야 합니다.
모니터나 프린터에 한자를 출력하기 위해서는 그래픽 기호에 따라 한자를 도트 매트릭스 형태로 디자인하고, 이에 해당하는 도트 매트릭스 코드(글리프 코드)를 얻어야 합니다.
GB1616.h//------------------ 중국어 문자 글꼴 데이터 구조 정의 ------------------------//structtypFNT_GB16 // 중국어 문자 글꼴 데이터 구조 {unsignedcharIndex[3]; // 중국어 문자 내부 코드 인덱스 unsignedchar Msk[32];// 도트 매트릭스 코드 데이터 }; ////////////////////////////////////////////////////////////////////////////////////// 중국어 문자 폰트 테이블//// 중국어 문자 라이브러리: 송나라 16.dot, 왼쪽 최상위 비트를 기준으로 가로로 정렬, 데이터 배열: 왼쪽에서 오른쪽, 위에서 아래////////////////////////////////////////////////////////////////////////////////////////////////////////////////conststructtypFNT_GB16 codeGB_16[]= //데이터 테이블{/*---------------------------------------------------------------------------------;소스 파일/텍스트 :Xu;width×height (pixels):16×16--------------------------------------------------------------------------------*/"Xu",0x10,0x80,0x10,0x80,0x21 ,0x40,0x42,0x20,0x94,0x10,0x1B,0xEC,0x20,0x80,0x60,0x80,0xAF,0xF8,0x 20,0x80,0x22,0xA0,0x24,0x90,0x2A,0x88,0x21,0x00,0x00,0x00,0x00,0x00,0x00, 이 구조는 매우 간단합니다. 하나는 내부 코드이고, 다른 하나는 도트 매트릭스 시퀀스입니다. 이전의 도트 매트릭스 라이브러리는 내부 코드 순서대로 배치되었기 때문에 내부 코드 인덱스가 필요하지 않았습니다. 만약 한자만 일부 배치하는 경우에는 내부 코드 인덱스가 필요했습니다. (앞의 한자 "Xu"는 "Xu"를 출력할 때 해당 단어의 도트 매트릭스 시퀀스를 찾기 위한 것입니다. 이 도트 매트릭스 시퀀스는 제가 직접 작성한 것입니다. 1602 칩으로 표시할 때는 칩 메모리에 영문 도트 매트릭스 시퀀스가 저장되어 있으므로 따로 작성할 필요가 없습니다.) 일반적으로 내부 코드에는 2바이트면 충분합니다. 1바이트를 더 사용해야 하는 경우에는 뒤에 0을 추가하면 됩니다. 이렇게 하면 한자 문자열을 한자 내부 코드에 직접 배치할 수 있습니다.
13. 12864 LCD:
각 표시점은 이진수에 대응하며, 1은 켜짐, 0은 꺼짐을 의미합니다. 이러한 도트 매트릭스 정보를 저장하는 RAM을 디스플레이 데이터 메모리라고 합니다. 특정 그림이나 한자를 표시하려면 해당 도트 매트릭스 정보를 해당 저장 장치에 기록해야 합니다.
그래픽 RAM의 주소 카운터(AC)는 수평 주소(X축)만 자동으로 1씩 증가시킵니다. 수평 주소가 0FH가 되면 00H로 초기화됩니다. 하지만 수직 주소는 캐리 발생 시 자동으로 증가시키지 않습니다. 따라서 여러 데이터를 연속적으로 기록할 경우, 프로그램은 수직 주소를 초기화해야 하는지 여부를 판단해야 합니다.
도면 표시용 RAM은 128×8바이트의 메모리 공간을 제공합니다. 도면 RAM을 변경할 때는 먼저 가로 및 세로 좌표값을 연속적으로 기록한 다음, 2바이트의 데이터를 도면 RAM에 기록합니다. 주소 카운터(AC)는 가로 주소(X 주소)를 자동으로 1씩 증가시킵니다. 가로 주소가 0XFH가 되면 00H로 재설정됩니다. 세로 주소는 자동으로 1씩 증가하지 않습니다. 도면 RAM에 데이터를 기록하는 동안에는 도면 표시 장치를 꺼야 합니다.
[cpp] 뷰 플레인 복사 // 중국어 문자 표시 voiddispString(uchar X, Y, uchar *msg) // X는 몇 번째 행이고 Y는 몇 번째 열인지 지정합니다. msg는 중국어 문자입니다. {if(X==0) write_data(*msg++); } // 한자 표시 }}/////////////////////////////////// ///////////////// /////////////////// 이미지 표시 voiddisppicture(uchar code *adder){ uint i,j;//*******화면 상단 절반 내용 설정 for(i=0;i<32;i++)//화면 상단 절반의 32개 열 주소 { write_com(0x80 + i);//세로 주소 설정 VERTICALADD write_com(0x80);//가로 주소 설정 HORIZONTAL ADD for(j=0;j<16;j++) { write_data(*adder); adder++; }}//************화면 하단에 콘텐츠 설정 표시 for(i=0;i<32;i++) //{ write_com(0x80 + i); //세로 주소 설정 VERTICALADD write_com(0x88); //가로 주소 설정 HORIZONTAL ADD for(j=0;j<16;j++){write_data(*adder);adder++;} }} C 언어에서는 정의된 변수에 대해 메모리 공간이 자동으로 할당되며, 변수의 주소는 변수 이름 그 자체입니다. 이 이름을 통해 메모리에서 기존 데이터를 불러올 수 있고, 계산을 통해 새로운 데이터를 얻을 수도 있습니다. 그러나 어셈블리 언어에서는 프로그래머가 직접 저장 공간을 지정하고 계산을 위해 데이터를 어큐뮬레이터에 저장해야 합니다. 모든 단계에서 프로그래머의 조작이 필요합니다. C 언어에서는 이러한 모든 과정이 컴파일러에 의해 자동으로 처리됩니다.
① 마이크로컨트롤러 C 언어에서 변수의 메모리 할당은 어떻게 이루어지나요? 컴파일러가 컴파일 과정에서 할당 및 재사용 코드를 지능적으로 추가하는 것인가요? 핵심은 제가 작성한 프로그램에서 메모리 오버플로 오류가 발생하지 않도록 하는 방법입니다. 재귀 연산을 수행하는 경우, 필요한 메모리 양을 직접 계산하기가 어렵습니다.
변수가 너무 많으면 컴파일러는 데이터 세그먼트가 너무 크다는 경고 메시지를 표시합니다. 메모리 오버플로 오류를 방지하려면 스택 오버플로가 발생하는지 여부를 확인해야 하며, 이는 경험에 따라 달라집니다.
마이크로컨트롤러는 비트 변수를 정의할 수 있지만 비트 배열은 정의할 수 없습니다. C 언어로 작성하는 것은 간단해 보이지만 실제로는 가장 많은 양의 코드를 생성합니다. 제어에 사용되는 마이크로컨트롤러는 부동 소수점 연산을 거의 사용하지 않는데, 이는 속도가 느릴 뿐만 아니라 번거롭고 공간도 많이 차지하기 때문입니다. DSP 칩을 사용한다면 적절한 하드웨어 구조를 갖추는 것이 훨씬 효율적일 것입니다.
회사 전화번호: +86-0755-83044319
팩스: +86-0755-83975897
이메일: 1615456225@qq.com
QQ: 3518641314 리 관리자
QQ: 332496225 Qiu 관리자
주소: 중국 선전시 룽화신구 민즈대로 1079번지 전타오테크놀로지빌딩 C동 809호




粤公网安备44030002007346号