여러 공급업체의 칩에서 동일한 C 코드를 실행하는 방법

mike_golioth Verified Supplier Rep

Golioth는 마이크로컨트롤러에 기반한 IoT 장치들을 쉽게 클라우드에 연결시켜서, 클라우드에서 데이터를 사용할 수 있게 만들고, 원격 장치 관리를 더욱 쉽게 만듭니다. 이 프로젝트에서의 연구는 하드웨어에 구애 받지 않으면서 Zephyr 실시간 운영 체제 애플리케이션 코드에 접근하는 방법에 중점을 두고 있습니다. 우리가 어떻게 그렇게 했는지 자세하게 설명하겠지만, 지금 당장 코드를 보고 싶다면, 우리가 공개한 오픈 소스 IoT Weather Fleet 리포지토리를 확인해 보십시오.

동일한 하드웨어의 매우 다른 세 가지 버전

데모 용이기 때문에 센서 데이터는 매우 단순합니다: 원격으로 설정 가능한 간격으로 온도 판독값을 보고합니다. 물론 일단 가동을 하면 해당 센서 데이터를 완전히 다른 유형의 데이터로 교체하는 것은 사소한 일입니다.

최근 몇 년 동안 칩 부족에 시달렸던 저는 하나의 칩 제품군 내에서뿐만 아니라 완전히 다른 공급업체로 이전할 수 있는 능력을 보여주고 싶었습니다. Nordic nRF9160 (여기에서는 SparkFun Thing Plus - nRF9160), NXP i.MX RT1062 (여기에서는 i.MX RT1060 평가 키트) 그리고 Espressif ESP32 (여기에서는 페더 폼 팩터를 사용하는 Adafruit HUZZAH32)를 선택했습니다.

이 서로 다른 하드웨어에서 동일한 코드를 어떻게 실행하시나요? Zephyr는 Kconfig와 Devicetree를 사용하여 빌드를 부풀리지 않고 하드웨어 추상화를 합니다. 핀 먹싱(muxing)과 똑똑한 센서 모델을 포함하고 있어서 각각의 다른 기판용으로 두 개의 파일을 만들기만 하면 됩니다. NXP 기판의 센서와 핀 할당은 다음과 같습니다:

/ {
    aliases {
        weather = &bme280;
    };
};

&lpi2c1 {
	status = "okay";

	bme280: bme280@76 {
		status = "okay";
		compatible = "bosch,bme280";
		reg = <0x76>;
	};
};

보쉬 BME280 센서 연결에 i2c 버스를 선택한 것을 볼 수 있습니다. 구문(syntax)이 당장은 완전 명확하지 않더라도 걱정하지 말고, 센서에 별칭(alias)을 할당한 윗 부분을 보십시오. 이를 통해 C 코드에서 weather라는 이름의 센서를 참조할 수 있습니다. 코드는 해당 센서가 어떤 종류인지 알 지 못하며, 알 필요도 없습니다. Zephyr가 이 모든 것을 처리하고 센서를 읽는 데 제네릭(generic) "채널"을 사용할 수 있도록 합니다:

// Create a pointer to our sensor
const struct device *weather_dev = DEVICE_DT_GET(DT_ALIAS(weather));

// Perform a sensor reading and access the temperature data
sensor_sample_fetch(weather_dev);
sensor_channel_get(weather_dev, SENSOR_CHAN_AMBIENT_TEMP, &tem);

놀라운 점은, 서로 다른 마이크로컨트롤러를 사용했지만 센서도 서로 다르게 사용했습니다!

센서는 다르지만 동일한 C 코드

칩 부족의 시대에, 펌웨어를 다시 작성하지 않고도 완전히 다른 센서로 교체할 수 있는 능력은 놀라울 정도로 속 시원합니다. 인피니언의 DPS310 온도 센서(여기에서는 Adafruit의 DPS310 브레이크아웃 기판)가 보쉬의 BME280 센서(이미지에 보여지는 것은 MikroElektronika의 WEATHER CLICK)를 대신합니다.

변경된 것은 빌드에 사용 중인 센서(와 i2c 버스에 사용할 핀)를 알려주는 Devicetree 오버레이 파일뿐입니다.

/ {
    aliases {
        weather = &dps310;
    };
};

&i2c1 {
	status = "okay";
	clock-frequency = <I2C_BITRATE_STANDARD>;
	pinctrl-0 = <&i2c1_default>;

	dps310: dps310@77 {
		status = "okay";
		compatible = "infineon,dps310";
		reg = <0x77>;
	};
};

&pinctrl {
	i2c1_default: i2c1_default {
		group1 {
			psels = <NRF_PSEL(TWIM_SDA, 0, 26)>,
				<NRF_PSEL(TWIM_SCL, 0, 27)>;
		};
	};
};

weather라는 동일한 별칭이 생성되지만 다른 센서가 할당되어 있습니다. 다시 말씀드리지만, Zephyr가 BME280 대신 DPS310에 적합한 드라이버 라이브러리의 추상화, 활성화 및 빌드를 처리할 것입니다.

들어오는 데이터 확인

빌드하고 플래시하면 데이터는 동일합니다. 유일한 실질적 차이는 인피니언 센서의 정밀도는 여섯 자리인 반면 보쉬 센서는 두 자리라는 것입니다. 그 외에도, 여러분의 센서 부대로부터 수집된 데이터는 Golioth 서버에 기록되어 원하는 어떠한 클라우드 플랫폼에서든 쿼리(query), 시각화 및 사용할 준비가 됩니다.

데모에는 판독 빈도와 같이 센서 부대 전체의 설정을 변경할 수 있는 기능도 포함하고 있습니다. 물론, 펌웨어의 동작 방식을 수정해야 한다면 모든 장치에서 OTA(Over-the-Air, 무선) 펌웨어 업데이트를 할 수 있습니다. 한번 경험해 보십시오, Golioth의 Dev 티어(Tier)는 처음 50개의 장치는 무료입니다.

데이터가 서버로 전송되면 즉시 시각화할 수 있습니다. 위에서 우리는 세 개의 다른 기판으로부터 수신된 온도 판독값의 그래프를 그리기 위해 그라파나(Grafana)를 사용하고 있습니다.

센서스 컨버지에서 데모를 확인해 보십시오

센서스 컨버지 컨퍼런스는 현재 산타클라라에서 열리고 있습니다. 이번 행사에서 디지키 부스 한 켠에 당사의 하드웨어를 데모할 수 있어 Golioth 팀 전체는 매우 들떠 있습니다. 지금 가서 IoT 날씨 센서 부대가 실시간으로 판독값을 보내는 것을 확인해 보십시오!

출처



영문 원본: How to run the same C code on chips from multiple vendors