Tôi có một 16 bit biến data
, ví dụ:Bạn có thể lấy con trỏ tới byte dưới theo cách độc lập không?
volatile uint16_t data;
tôi cần phải cư giá trị này dựa trên nội dung của hai thanh ghi 8 bit trên một bộ cảm biến bên ngoài. Chúng được truy cập qua I2C/TWI.
My TWI thói quen là async *, và có chữ ký:
bool twi_read_register(uint8_t sla, uint8_t reg, uint8_t *data, void (*callback)(void));
này đọc giá trị của reg
trên sla
vào *data
, sau đó gọi callback()
.
Nếu tôi biết uint16_t
được sắp xếp trong bộ nhớ như, nói, MSB LSB
, sau đó tôi có thể làm:
twi_read_register(SLA, REG_MSB, (uint8_t *)&data, NULL);
twi_read_register(SLA, REG_LSB, (uint8_t *)&data + 1, NULL);
Tuy nhiên, tôi không thích nướng phụ thuộc endian vào mã của tôi. Có cách nào để đạt được điều này theo cách độc lập không?
(mặt lưu ý: Cách giải quyết thực tế của tôi vào lúc này liên quan đến việc sử dụng một cấu trúc, ví dụ:
typedef struct {
uint8_t msb;
uint8_t lsb;
} SensorReading;
nhưng tôi tò mò nếu tôi có thể làm điều đó với một đơn giản uint16_t
)
EDIT
(* bởi async tôi có nghĩa là giai đoạn tách, tức là *data
sẽ được đặt tại một số điểm trong tương lai, tại thời điểm đó, số điện thoại sẽ được thông báo qua chức năng callback
nếu được yêu cầu)
Tại sao bạn muốn để hạn chế bản thân để con trỏ truy cập vào các giá trị 16 bit? Hầu hết sẽ làm điều này với sự thay đổi và thêm hoặc vận hành. Tuy nhiên nếu bạn thực sự muốn làm điều đó với con trỏ, bạn có thể sử dụng các macro phát hiện và bù đắp cho endian-ness. –
Không, bạn không thể ... đáng tin cậy. Sử dụng mặt nạ và thay đổi nếu bạn muốn mã đáng tin cậy và di động. –
thực sự là mặt nạ và thay đổi không hoạt động, hoặc không? –