union联合体一个重要的作用:(成员函数占用同一块内存)
用一个成员把值存储在联合体中,然后用另一个成员查看内容
如下例子:想将获取的camera温度的值由整型改为float型
但是原子队列函数_atomic_store_n的第二个参数只能是int型,不能为float型,如果还想用原子队列,则可以定义一个union,
用int进行存储,在最后需要得到camera温度返回值的时候,返回float类型
1 int输出
//获得camera温度并存储到原子队列
void camera_temp_update(void)
{
for (int i = 0; i < CAMERA_NUM_SENSORS; ++i) {
int16_t t = read_temp_sensor(i); //获取第i个camera温度数据
__atomic_store_n(&m_cached_temps[i], t, __ATOMIC_RELAXED);
}
}
//从原子队列中读取camera温度
int16_t camera_temp_get(uint8_t camera_id)
{
UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");
return __atomic_load_n(&m_cached_temps[camera_id], __ATOMIC_RELAXED);
int16_t t = read_temp_sensor(i); //获取第i个camera温度数据
__atomic_store_n(&m_cached_temps[i], t, __ATOMIC_RELAXED);
}
}
//从原子队列中读取camera温度
int16_t camera_temp_get(uint8_t camera_id)
{
UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");
return __atomic_load_n(&m_cached_temps[camera_id], __ATOMIC_RELAXED);
其中,读取camera温度函数为int型
static int16_t read_temp_sensor(uint8_t camera_id)
{
UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");
uint32_t value_mv = 0;
UHAL_ASSERT(adc_read_mv(TEMP_ADCS[camera_id], &value_mv) == 0, "Could not read cam temp ADC input");
return temp_mv_to_deg_c(value_mv);
}
int16_t read_temp_sensor(uint8_t camera_id)
{
UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");
uint32_t value_mv = 0;
UHAL_ASSERT(adc_read_mv(TEMP_ADCS[camera_id], &value_mv) == 0, "Could not read cam temp ADC input");
return temp_mv_to_deg_c(value_mv);
}
static int16_t m_cached_temps[CAMERA_NUM_SENSORS] = {0};
int16_t m_cached_temps[CAMERA_NUM_SENSORS] = {0};
2 float输出
//获得camera温度并存储到原子队列
void camera_temp_update(void)
{
camera_temp_t camera_temp;
for (int i = 0; i < CAMERA_NUM_SENSORS; ++i) {
camera_temp.f= read_temp_sensor(i); //获取第i个camera温度数据
__atomic_store_n(&m_cached_temps[i].u32, camera_temp.u32, __ATOMIC_RELAXED);
}
}
//从原子队列取camera温度值
float camera_temp_get(uint8_t camera_id)
{
camera_temp_t camera_temp;
UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");
camera_temp.u32 = __atomic_load_n(&m_cached_temps[camera_id].u32, __ATOMIC_RELAXED);
return camera_temp.f;
}
camera_temp_t camera_temp;
for (int i = 0; i < CAMERA_NUM_SENSORS; ++i) {
camera_temp.f= read_temp_sensor(i); //获取第i个camera温度数据
__atomic_store_n(&m_cached_temps[i].u32, camera_temp.u32, __ATOMIC_RELAXED);
}
}
//从原子队列取camera温度值
float camera_temp_get(uint8_t camera_id)
{
camera_temp_t camera_temp;
UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");
camera_temp.u32 = __atomic_load_n(&m_cached_temps[camera_id].u32, __ATOMIC_RELAXED);
return camera_temp.f;
}
其中camera_temp为联合体,m_cached_temps[i]为联合结构体,其定义分别如下:
typedef union {
float f;
uint32_t u32;
} camera_temp_t;
camera_temp_t;
static camera_temp_t m_cached_temps[CAMERA_NUM_SENSORS] = {0};
//! How many sensors the camera library is controlling
#define CAMERA_NUM_SENSORS 5
camera_temp_t m_cached_temps[CAMERA_NUM_SENSORS] = {0};
//! How many sensors the camera library is controlling
#define CAMERA_NUM_SENSORS 5
camera温度读取函数要改为float型
static float read_temp_sensor(uint8_t camera_id)
{
UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");
uint32_t value_mv = 0;
UHAL_ASSERT(adc_read_mv(TEMP_ADCS[camera_id], &value_mv) == 0, "Could not read cam temp ADC input");
return temp_mv_to_deg_c(value_mv);
}
float read_temp_sensor(uint8_t camera_id)
{
UHAL_ASSERT(camera_id < CAMERA_NUM_SENSORS, "Invalid camera index");
uint32_t value_mv = 0;
UHAL_ASSERT(adc_read_mv(TEMP_ADCS[camera_id], &value_mv) == 0, "Could not read cam temp ADC input");
return temp_mv_to_deg_c(value_mv);
}