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


    1. #include
    2. #define ENUM_VAR_U8(v) v
    3. #define ENUM_VAR_U16(v) v,v##__end=v+1
    4. #define ENUM_VAR_U24(v) v,v##__end=v+2
    5. #define ENUM_VAR_U32(v) v,v##__end=v+3
    6. #define ENUM_VAR_U8e(v,e) v=e
    7. #define ENUM_VAR_U16e(v,e) v=e,v##__end=v+1
    8. #define ENUM_VAR_U24e(v,e) v=e,v##__end=v+2
    9. #define ENUM_VAR_U32e(v,e) v=e,v##__end=v+3
    10. //用户自定义变量名字,用于存储
    11. typedef enum
    12. {
    13. ENUM_VAR_U8e(first_member,0),//first_member = 0,//首元素
    14. ENUM_VAR_U16(my_varA),
    15. ENUM_VAR_U24(my_varB),
    16. ENUM_VAR_U32(my_varC),
    17. MAX_VAR_LEN,//===Keep this enum last===
    18. }TagEnumVar;
    19. uint8_t g_var[MAX_VAR_LEN];//此数组作为全局变量,用于file/flash读写。
    20. void get_var(TagEnumVar id,void* value_out,uint8_t var_bytes )
    21. {
    22. if(var_bytes==1)
    23. {
    24. uint8_t *value_ex =(uint8_t*)value_out;
    25. *value_ex = g_var[id];
    26. }
    27. else if(var_bytes==2)
    28. {
    29. uint16_t *value_ex =(uint16_t*)value_out;
    30. *value_ex = g_var[id] | (g_var[id+1]<<8);
    31. }
    32. else if(var_bytes==3)
    33. {
    34. uint32_t *value_ex =(uint32_t*)value_out;
    35. *value_ex = g_var[id] | (g_var[id+1]<<8) | (g_var[id+2]<<16);
    36. }
    37. else if(var_bytes==4)
    38. {
    39. uint32_t *value_ex =(uint32_t*)value_out;
    40. *value_ex = g_var[id] | (g_var[id+1]<<8) | (g_var[id+2]<<16)| (g_var[id+3]<<24);
    41. }
    42. }
    43. void set_var(TagEnumVar id,uint32_t value_in,uint8_t var_bytes )
    44. {
    45. if(var_bytes==0)
    46. return;
    47. if(var_bytes>=1)
    48. g_var[id]=(value_in)&0xFF;
    49. if(var_bytes>=2)
    50. g_var[id+1]=(value_in>>8)&0xFF;
    51. if(var_bytes>=3)
    52. g_var[id+2]=(value_in>>16)&0xFF;
    53. if(var_bytes>=4)
    54. g_var[id+3]=(value_in>>24)&0xFF;
    55. }
    56. int main()
    57. {
    58. printf("=======C_BuildTime=[%s_%s]==============\r\n\r\n",__DATE__ ,__TIME__ );
    59. //note:可以追加上电后,从file/flash加载数据到g_var里作为初始值
    60. uint8_t u8_in = 0x11;
    61. uint8_t u8_ot = 0x00;
    62. uint16_t u16_in = 0x1234;
    63. uint16_t u16_ot = 0x00;
    64. uint32_t u24_in = 0x123456;
    65. uint32_t u24_ot = 0x00;
    66. uint32_t u32_in = 0x12345678;
    67. uint32_t u32_ot = 0x00;
    68. //先将数据写入,然后读出来看看是否一致
    69. set_var(first_member,(uint32_t)u8_in,1);
    70. get_var(first_member,&u8_ot,1);
    71. printf("get u8,first_member=0x%x.\n",u8_ot);//测试1字节变量的读和写
    72. set_var(my_varA,(uint32_t)u16_in,2);
    73. get_var(my_varA,&u16_ot,2);
    74. printf("get u16,my_varA=0x%x.\n",u16_ot);//测试2字节变量的读和写
    75. set_var(my_varB,(uint32_t)u24_in,3);
    76. get_var(my_varB,&u24_ot,3);
    77. printf("get u24,my_varB=0x%x.\n",u24_ot);//测试3字节变量的读和写
    78. set_var(my_varC,(uint32_t)u32_in,4);
    79. get_var(my_varC,&u32_ot,4);
    80. printf("get u32,my_varC=0x%x.\n",u32_ot);//测试4字节变量的读和写
    81. //note:可以追加,关闭程序前,保存g_var数据到对应的file/flash里
    82. return 0;
    83. }

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

    注:C语言的文件读写可以参考:

    C 读写文件内容_c读取当前文件夹内文件-CSDN博客 

  • 相关阅读:
    电脑重装系统后Word表格自动换行的方法
    Nginx的安全控制
    JAVA反编译工具:JADX-GUI、
    一种表达了1/4的差值结构
    Spring Cloud Gateway的使用总结
    day068:字符流读、写数据,及其注意事项、flush和close方法、字符缓冲流
    学习记忆——图像篇——记忆古诗词
    如何创建Maven项目
    R 语言patchwork包拼图间隙
    MMDetection(四):在自己的数据集上训练模型
  • 原文地址:https://blog.csdn.net/wabil/article/details/133590475