Table of Contents
IoT 기기의 휴대용 C 코드를 작성하는 것은 다양한 하드웨어 플랫폼에서 애플리케이션을 배포하는 데 필요한 임베디드 개발자를 위한 기본 기술입니다. IoT 생태계는 ARM Cortex-M, RISC-V, AVR 및 독점 아키텍처를 통합하고, 고유 메모리 맵, 주변 기록기 및 컴파일러 quirks를 포함합니다. 포트 가능성을 위해 설계를 정의하지 않고, 다른 곳에서 작업하는 코드는 비용이 많이 드는 유지 보수 및 실제적인 기사를 보완하는 데 중점을 두는 데 중점을 두는 데 중점을 두는 것이 중요합니다. 이 두 가지 전략적인 접근법은 모두 전략적으로 통합되어 있습니다.
IoT 개발의 Portability 이해
이 웹 사이트는 애플 리케이션에 전념. 우리는 정품 앱과 게임을 제공 할 목적으로이 사이트를 만들었습니다. 4AppsApk 최고의 안드로이드 애플 리케이션을위한 무료 APK 파일 다운로드 서비스, 계략.
포트 가능은 스펙트럼에 존재합니다. 한쪽 끝에, 완전히 플랫폼에 의존하는 코드 (예를 들어, 일반적인 정렬 알고리즘) 어디에서나 컴파일합니다. 다른 끝에, 하드웨어 등록을 직접 조작하는 코드는 무거워하지 않습니다. IoT 용 휴대용 C의 목표는 핵심 비즈니스 논리와 알고리즘 코드가 재사용 할 수 있도록 요약 층 뒤에 비 유연한 세부 사항을 격리하는 것입니다.
Code Portability에 대한 일반적인 도전
몇몇 낮은 수준 다름 plague에 의하여 끼워넣어진 C portability:
- Endianness. ARM Cortex‐M과 AVR은 ‐endian; 일부 오래된 건축 (예를들면 Freescale HC12)는 대단한 ‐endian입니다. byte 주문의 직 주조 포인터 또는 조합은 침묵 데이터 손상으로 이어집니다.
- 워드 크기와 유형 정의. ]]는 8비트 AVR, 32비트의 Cortex‐M0, 64비트 프로세서에 대한 RISC‐V 64비트에 대한 64비트에 대한 코드가 있을 수 있습니다. 는 정확히 32비트가 끊을 것입니다.
- Register map differences. 동일한 공급업체로부터 2개의 MCU가 종종 다른 주변 기본 주소, 비트 필드 및 구성 순서가 있습니다.
- 컴파일 확장 및 파라마. GCC, IAR, ARM Compiler 6, 케일은 각각 자신의 구문 및 인라인 조립 방언을 가지고 있다.
- Memory layout and alignment. 일부 플랫폼은 32비트 액세스에 대한 엄격한 정렬이 필요합니다. 다른 사람들은 잘못된 핸들러와 잘못된 액세스를 처리합니다.
- Interrupt 처리 및 스택 사용. Interrupt 벡터, 우선 모델, 그리고 배열 동작은 널리 다를 수 있습니다.
휴대용 C Code 작성을위한 키 전략
하드웨어 Abstraction 층 (HAL)
휴대용 코드 비소의 가장 강력한 도구는 hardware Summary layer]입니다. HAL은 공통 주변 장치(GPIO, UART, I2C, SPI, timers)의 균일한 API를 노출하여 아래에서 실행되는 register‐bashing을 숨기는 동안 잘 설계되었습니다. 인터페이스는 헤더(예: )에서 정의되어야 합니다. ])는 HAL과 같은 함수를 선언합니다. ]]는 HAL의 각 어플리케이션에 대한 HAL을 포함합니다. [FLT:]]
전형적인 HAL 구현 패턴은 다음과 같습니다 :
// hal_gpio.h (common)
typedef uint8_t gpio_pin_t;
typedef uint8_t gpio_port_t;
void hal_gpio_set_output(gpio_port_t port, gpio_pin_t pin);
void hal_gpio_set_high(gpio_port_t port, gpio_pin_t pin);
void hal_gpio_set_low(gpio_port_t port, gpio_pin_t pin);
플랫폼 별 파일 (예 :, ])은 실제 등록 쓰기를 포함합니다. 새로운 MCU로 이동할 때, 낮은 수준 HAL 소스는 다시 쓰기 필요하며, 모든 높은 층은 비터치가 남아 있습니다.
표준 Libraries 채택
C 표준 라이브러리는 많은 일반적인 작업을 위한 휴대용 기반을 제공합니다. ], ], 문자열 유틸리티 및 수학 기능은 C 컴파일러에 따라 사용할 수 있습니다. 라이브러리 내부에 대한 가정을 피하는 것은 중요한 것은 - 당신이 컴파일러의 구현이 충분하다는 것을 확인하지 않는 한 성능에 대한 를 다시 작성합니다.
제한된 메모리를 가진 IoT 시스템을 위해 표준 라이브러리의 하위 세트를 사용 고려하십시오 (예 : [[FLT :0]] newlib‐nano] GCC 생태계에서]) 오히려 자신의 문자열 루틴을 구하는 것보다. 마찬가지로, ] 매크로와 는 보편적으로 사용할 수 있습니다. 링크 : [FLT : 2]]GNU C 라이브러리 문서[FLT : 3]는 휴대용 이해에 대한 탁월한 참조입니다.
Fixed-Width Data Types 사용
항상 과 ]에서 명시된 폭과 정수 변수를 선언하기 위해 ], , , ], 등 ]], , 또는 ], 어떤 크기로 알려진. 루프와 작은 실행을 위해 ], ], ]], ]], ]]].
바이트 중심의 운송에 걸쳐 직렬 데이터가 필요할 때, 명시된 바이트-order 변환 기능 (], , 또는 휴대용 동등물)과 고정 폭 유형과 결합합니다. 단순히 ]을 ]로 캐스팅하고 네트워크에 전송합니다.
관능적 인
Preprocessor 지시어는 플랫폼별 코드에 대한 합법적인 도구이지만, 그들은 배심적으로 사용되어야 합니다. 단일 중앙 헤더에 있는 구성 매크로의 작은 세트를 정의합니다 (예: ]). 모든 파일을 통해 ]를 흩어지게 합니다. 예:
// platform_config.h
#if defined(STM32L4)
#define PLATFORM_STM32L4
#elif defined(EFM32GG)
#define PLATFORM_EFM32GG
#else
#error "Unsupported platform"
#endif
그런 다음 코드에서, 일반 ]을 절대적으로 필요한 경우. 과도한 것을 유지 을 읽고 유지하기 위해 코드를 하드. 가능한 상태 컴파일에 Prefer HAL 요약.
최소화 외장
모든 타사 라이브러리는 잠재적 인 휴대성 위험입니다. 의존성을 추가하기 전에 모든 대상 아키텍처를 지원하고 비 ‐portable 가정에서 끌어지지 않는 것을 확인합니다. Libraries는 휴대용 C (예 :, [[FLT : 0]]FatFS[[FLT :1]] 또는 [[FLT :2]FreeRTOS[FLT :3]])에서 완전히 작성된 라이브러리는 그보다 더 안전합니다. 그 후, 당신은 더 얇은 조각을 만들 수 있으므로, 더 얇은 조각을 만들 수 있습니다.
링크: Embedded.com 실제 C 코드]에 대한 기사는 의존성을 관리에 대한 추가적인 관점을 제공합니다.
Portability 향상을 위한 실용적인 팁
모듈 번호 쓰기
펌웨어를 독립적으로 잘 정의된 인터페이스로 끊기십시오. 각 모듈은 헤더 파일로 기능을 노출하고 내부 세부 사항을 숨기도록해야합니다. 이러한 분리는 새로운 플랫폼에 포트 할 때 휴대용 버전으로 모듈을 교체하는 것이 쉽습니다. 예를 들어 모터 제어 모듈은 타이머 주변 레지스터에 직접 PWM 출력에 대한 HAL에 대해 이야기해야합니다.
문서 하드웨어 의존성
특정 하드웨어 동작을 가정하는 코드가 분명히 주목합니다. 특정 비 허용 접근이 선택되었는지 설명하는 의견, 어떤 플랫폼에서 작동하고, 다른 대상을 변경해야 할 것입니다. 이 문서는 원래 개발자가 사용할 수 없을 때 비유할 수 있으며 새로운 엔지니어는 코드를 포트해야합니다.
Cross-Platform Build Tools를 사용하여
CMake 또는 ]Meson]은 단일 프로젝트 구조에서 여러 대상 구성을 관리할 수 있습니다. CMake, 예를 들어, 각 플랫폼에 대한 툴체인 파일을 지정하고 대상에 따라 컴파일 정의를 설정할 수 있습니다. 이 방법은 수동으로 IAR, Keil 및 GCC에 대한 별도의 프로젝트 파일을 유지하는 데 필요한 것을 제거합니다. 링크: ]:5]]]:5]]]:2]]]:0]
휴대용 Bit-Manipulation 기술을 사용하십시오
등록에 비트를 설정하거나 삭제하면 비트 필드 위치를 가정하는 절대 마스크를 작성하지 마십시오. 대신 HAL에서 정의 된 기호 상을 사용하며, 매크로 또는 인라인 함수를 안전한 비트 작업에 사용합니다.
#define BIT_SET(reg, bit) ((reg) |= (1u << (bit)))
#define BIT_CLEAR(reg, bit) ((reg) &= ~(1u << (bit)))
를 리터럴 정수보다 초록 변수로 정의합니다. 이 방법은 다른 MCU의 비트 위치 변경이면, 일정한 정의만 변경해야하며, 코드베이스의 사용은 안됩니다.
테스트 및 검증 Across 플랫폼
이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 또한이 웹 사이트의 사용 방식을 분석하고 이해하는 데 도움이되는 제 3 자 쿠키를 사용합니다. 이 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키를 거부 할 수도 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.
회귀 테스트는 각 플랫폼에서 모든 HAL API를 연습하여 초기에 불균형을 잡을 수 있습니다. "UART로 바이트를 덮고 반복 백에 다시 읽으십시오"는 UART 구현과 타이밍 또는 구성 차이를 노출합니다.
관련 기사
IoT 기기의 휴대용 C 코드를 작성하는 것은 한 일에서 건축으로 구워야 할 분야가 아닙니다. 하드웨어 요약 계층에 투자함으로써, 표준 유형과 라이브러리에 접착하고, 조건부 컴파일을 통해 경작적으로 테스트하고, 대상을 가로 질러서 하드웨어 풍경에서 비례적인 변화를 생존할 수 있는 펌웨어를 만듭니다. 전방 노력은 유지 보수가 절감되고, 새로운 실리콘을 파괴하는 빠른 포팅을 지불하고, C-Technology의 미래에 대한 C-Technology를 개발할 수 있습니다.