[C]嵌入式中变量存储方案

cpp 复制代码
#include<stdio.h>

#define uint8_t   unsigned char
#define uint16_t  unsigned short
#define uint24_t  unsigned int
#define uint32_t  unsigned int
#define uint64_t  unsigned long long


//用户自定义变量名字,用于存储
typedef enum
{
   first_run = 0,//1字节
   hot_level,
   hot_level_end = hot_level+1,//2字节 u16
   water_value,
   water_value_end = water_value+2, //3字节 u24 
   coffee_value,
   coffee_value_end = coffee_value+3,//4字节 u32
  
   MAX_VAR_LEN,//Keep it last
}TagEnumVar;

uint8_t g_var[MAX_VAR_LEN];

void get_var_u8(TagEnumVar id,uint8_t* value_out )
{
    *value_out = g_var[id];
}

void get_var_u16(TagEnumVar id,uint16_t* value_out )
{
    *value_out = g_var[id] | (g_var[id+1]<<8);
}

void get_var_u24(TagEnumVar id,uint32_t* value_out )
{
    *value_out = g_var[id] | (g_var[id+1]<<8) | (g_var[id+2]<<16);
}

void get_var_u32(TagEnumVar id,uint32_t* value_out )
{
    *value_out = g_var[id] | (g_var[id+1]<<8) | (g_var[id+2]<<16) | (g_var[id+3]<<24);
}

void set_var_u8(TagEnumVar id,uint8_t value_out )
{
     g_var[id]=value_out;
}

void set_var_u16(TagEnumVar id,uint16_t value_out )
{
     g_var[id]=(value_out)&0xFF;
     g_var[id+1]=(value_out>>8)&0xFF;
}

void set_var_u24(TagEnumVar id,uint32_t value_out )
{
     g_var[id]=(value_out)&0xFF;
     g_var[id+1]=(value_out>>8)&0xFF;
     g_var[id+2]=(value_out>>16)&0xFF;
}

void set_var_u32(TagEnumVar id,uint32_t value_out )
{
     g_var[id]=(value_out)&0xFF;
     g_var[id+1]=(value_out>>8)&0xFF;
     g_var[id+2]=(value_out>>16)&0xFF;
     g_var[id+3]=(value_out>>24)&0xFF;     
}

int main()
{
    printf("=======C_BuildTime=[%s_%s]==============\r\n\r\n",__DATE__ ,__TIME__ );
   

    uint32_t value_in = 0x12345678;
    uint32_t value_out = 0x00;
   //先将数据写入,然后读出来看看是否一致

    set_var_u8(first_run,(uint8_t)value_in);
    get_var_u8(first_run,(uint8_t*)&value_out);
    printf("get u8,first_run=0x%x.\n",value_out);//测试8位数据的读和写

    set_var_u16(hot_level,(uint16_t)value_in);
    get_var_u16(hot_level,(uint16_t*)&value_out);
    printf("get u16,hot_level=0x%x.\n",value_out);//测试16位数据的读和写
    
    set_var_u24(water_value,(uint32_t)value_in);
    get_var_u24(water_value,(uint32_t*)&value_out);
    printf("get u24,water_value=0x%x.\n",value_out);//测试24位数据的读和写

    set_var_u32(coffee_value,(uint32_t)value_in);
    get_var_u32(coffee_value,(uint32_t*)&value_out);
    printf("get u32,coffee_value=0x%x.\n",value_out);//测试32位数据的读和写

   return 0;
}

运行效果:注意变量的位数

相关推荐
尾善爱看海5 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
驳是6 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
GreenTea6 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
星云API技术支持6 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者7 小时前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn7 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
xiangyun618 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun618 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
计算机魔术师9 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端
计算机魔术师9 小时前
OpenAI的AI代理偷偷给RubyGems下毒,我们却毫无察觉
前端