union用法

文章目录


union

union有很多成员,在使用时只对其中的一个成员生效。

这样可以省空间。

联合体总大小 = 最大成员大小 = 8

关于字节对齐,可以填充无用字节或者用汇编#pragma pack来指定下来的声明用几字节对齐。

c 复制代码
#pragma pack(push, 1)      // 把当前对齐值压栈,并设为 1 字节对齐
typedef struct __attribute__((packed)) {
    uint8_t  a;
    uint16_t b;  
    uint32_t c;
} Msg_t;
#pragma pack(pop)          // 恢复成 push 之前的对齐值(通常是 4/8)

比如下列的就是union的省空间用法,这样这一个8字节的union可以用来表示非常多不同的结构体。

c 复制代码
union dev_dev_io_cmd_resp
{
    uint8_t rev[8];
    struct dev_dev_dido_cmd0_resp0
    {
        // bit 0 - 6: tsdev_dev_dido_set_glb_par
        // bit 7: op_valid_ok (cmd: cmd valid;  resp: op ok)
        uint8_t cmd;
        uint8_t is_12v;
        uint16_t report_cycle_ms; // tsdev_dev_dido_io_report report cycle
    } cmd0_resp0;
    struct dev_dev_dido_cmd1_resp1
    {
        // bit 0 - 6: tsdev_dev_dido_set_bridge
        // bit 7: op_valid_ok (cmd: cmd valid;  resp: op ok)
        uint8_t cmd;
        uint8_t dido_1_2; // dido1 bridge dido2,0: reset; 1: set; 2: not change,
        uint8_t dido_3_4; // dido3 bridge dido4,0: reset; 1: set; 2: not change,
    } cmd1_resp1;
    struct dev_dev_dido_cmd2_resp2
    {
        // bit 0 - 6: tsdev_dev_dido_mode
        // bit 7: op_valid_ok (cmd: cmd valid;  resp: op ok)
        uint8_t cmd;
        uint8_t dido_idx;
        uint16_t dido_input_thread;   // 0-5000, unit is 1mV
        uint8_t dido_mode0;           // bit0: io type: 0: io; 1: pwm
        uint8_t dido_mode1;           // bit0-1: 0: input; 1: push-pull; 2: pull(p-mos) only; 3: push(n-mos) only /// ? out high/low level
        uint16_t pwm_report_cycle_ms; // tsdev_dev_dido_pwm_report report cycle
    } cmd2_resp2;
    struct dev_dev_aiao_cmd3_resp3
    {
        // bit 0 - 6: tsdev_dev_aiao_mode
        // bit 7: op_valid_ok (cmd: cmd valid;  resp: op ok)
        uint8_t cmd;
        uint8_t aiao_idx;
        uint8_t aiao_mode; // 0: input, 1: output
        uint8_t rev;
        uint16_t report_cycle_ms;
    } cmd3_resp3;

    struct dev_dev_dido_cmd4_resp4
    {
        // bit 0 - 6: tsdev_dev_dido_read/tsdev_dev_dido_write
        // bit 7: op_valid_ok (cmd: cmd valid;  resp: op ok)
        uint8_t cmd;
        uint8_t dido_idx;
        uint8_t io_status;
        uint8_t rev;
    } cmd4_resp4;
    struct dev_dev_dido_cmd5_resp5
    {
        // bit 0 - 6: tsdev_dev_pwm_read/tsdev_dev_pwm_write
        // bit 7: op_valid_ok (cmd: cmd valid;  resp: op ok)
        uint8_t cmd;
        uint8_t pwm_idx;
        uint16_t duty; // uint is 0.01%
        uint32_t freq; // unit is hz
    } cmd5_resp5;
};
相关推荐
2601_949146537 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
知南x9 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
2的n次方_10 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言
凡人叶枫11 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
凡人叶枫13 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
傻乐u兔14 小时前
C语言进阶————指针3
c语言·开发语言
CodeSheep程序羊15 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
I'mChloe15 小时前
PTO-ISA 深度解析:PyPTO 范式生成的底层指令集与 NPU 算子执行的硬件映射
c语言·开发语言
2的n次方_16 小时前
Runtime 内存管理深化:推理批处理下的内存复用与生命周期精细控制
c语言·网络·架构
嵌入小生00716 小时前
标准IO---核心函数接口延续(嵌入式Linux)
c语言·vscode·vim·嵌入式·小白·标准io·函数接口