union联合体应用举例

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                  5camera_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);
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值