I는 즉, data
16 비트 변수를 가지고엔디안 방식으로 하위 바이트에 대한 포인터를 가져올 수 있습니까?
volatile uint16_t data;
내가 외부 센서에 2 개 개의 8 비트 레지스터의 내용에 따라이 값을 채울 필요가있다. 이들은 I2C/TWI를 통해 액세스됩니다.
내 TWI 루틴은 비동기 *이며, 서명이있다 : 이것은 *data
에 sla
에 reg
의 값을 읽어
bool twi_read_register(uint8_t sla, uint8_t reg, uint8_t *data, void (*callback)(void));
, 다음 callback()
를 호출합니다.
twi_read_register(SLA, REG_MSB, (uint8_t *)&data, NULL);
twi_read_register(SLA, REG_LSB, (uint8_t *)&data + 1, NULL);
그러나, 나는 내 코드에 엔디안 의존도를 베이킹 좋아하지 않는다 :
나는 그때 내가 할 수의uint16_t
가
MSB LSB
, 말, 같은 메모리에 배열 된 알았다면. 엔디안 독립적 인 방식으로이를 달성 할 수있는 방법이 있습니까?
(보조 노트 : 순간에 내 실제 해결 방법은 구조체를 사용하는 것, 즉 :
typedef struct {
uint8_t msb;
uint8_t lsb;
} SensorReading;
하지만 간단한 uint16_t
와 함께 할 수 있는지 궁금 해요)
편집
(* async는 split phase를 의미합니다 (즉, *data
이 나중에 설정 될 예정이며, 요청시 callback
함수를 통해 호출 수신자에게 알립니다)
는 왜 16 비트 값에 액세스 포인터 자신을 제한 하시겠습니까? 대부분 shift, add 또는 or 연산자를 사용하면됩니다. 그러나 포인터로 처리하고 싶다면 endian-ness를 감지하고 보정하는 매크로를 사용할 수 있습니다. –
안심해도 안돼. 안정적이고 이식 가능한 코드를 원한다면 마스크와 교대를 사용하십시오. –
실제로 마스크와 시프트가 작동하지 않습니까? –