【原创】一个简单的(key:value(string))消息缓冲结构

[复制链接]
 楼主| keer_zu 发表于 2020-4-10 13:57 | 显示全部楼层 |阅读模式
本帖最后由 keer_zu 于 2020-4-10 15:43 编辑

你可以认为是一个非常简单的内存数据库,存储string的,可以存储和获取。
1. 可以跑在单片机上。
2.接口非常简单。


该项目完整代码:

ucomlib

https://github.com/smtp-http/ucomlib.git

接口定义如下

头文件:
  1. #ifndef __UCOMLIB_H__
  2. #define __UCOMLIB_H__


  3. /////////////////////////// error code ///////////////////////////////
  4. #define ERR_TARGET_NULL    -10
  5. #define ERR_DATA_EXCESSIVE -11
  6. #define ERR_ID_EXIST       -12
  7. #define ERR_MSG_TOO_LONG   -13
  8. #define ERR_MSG_BUF_FULL   -14
  9. #define ERR_MSG_NOT_EXIST  -15


  10. /////////////////////////////// TIMER ////////////////////////////////
  11. #define MAX_TIMEER_COUNT  10
  12. //////////////////////////// event type //////////////////////////////
  13. #define EV_TIMEOUT          1

  14. /////////////////////////// user implementation //////////////////////
  15. typedef int (*EVENT_HANDLER)(const int event,const int msgId);

  16. int CRITICAL_INIT();
  17. void ENTER_CRITICAL();
  18. void EXIT_CRITICAL();
  19. int CRITICAL_DEINIT();



  20. /////////////////////////////////// debug ////////////////////////////
  21. //#define __DEBUG__
  22. #ifdef __DEBUG__
  23. #define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"/n", __LINE__, ##__VA_ARGS__)
  24. #else
  25. #define DEBUG(format,...)
  26. #endif
  27. /*example*/
  28. // char str[]="Hello World";  
  29. // DEBUG("A ha, check me: %s",str);
  30. //
  31. //////////////////////////////////////////////////////////////////////
  32. #define MAX_ASYNC_MSG_NUM   10

  33. ///////////////////////////// API ////////////////////////////////////
  34. int CommuInit(void);
  35. int CommSetEventHandler(EVENT_HANDLER ev);
  36. int CommSaveMsg(const int msgId,const char *msgData,unsigned int dataLen);
  37. int CommGetMsg(const int msgId,char *msgData,unsigned int* pDataLen);
  38. int OnTimer();


  39. #endif

使用实例(linux):
  1. //#include "Communication.h"
  2. //#include "Timer.h"
  3. #include <stdio.h>
  4. //#include "list.h"
  5. #define __DEBUG__
  6. #include "ucomlib.h"
  7. #include <pthread.h>
  8. #include <string.h>

  9. pthread_mutex_t g_mutex;

  10. int flag = 1;
  11. int handler(const int event,const int msgId)
  12. {
  13.         int ret,len;
  14.         char ms[100];
  15.         char *msg2 = "123456789123456789";
  16.         switch (event) {
  17.                 case EV_TIMEOUT:
  18.                         printf("ev_timeout\n");
  19.                         if(flag){
  20.                                 ret = CommGetMsg(11,ms,&len);
  21.                                 ms[len+1]=0;
  22.                                 printf("get ret:%d  len:%d  m:%s\n",ret,len,ms);
  23.                         } else {
  24.                                 printf("save ret:%d\n",CommSaveMsg(11,msg2,strlen(msg2)));
  25.                         }
  26.                         flag = !flag;
  27.                         break;
  28.                 default:
  29.                         DEBUG("undefine event");
  30.                         break;       
  31.         }
  32. }

  33. void ENTER_CRITICAL()
  34. {
  35.         pthread_mutex_lock(&g_mutex);
  36. }


  37. void EXIT_CRITICAL()
  38. {
  39.         pthread_mutex_unlock(&g_mutex);
  40. }

  41. int CRITICAL_INIT()
  42. {
  43.         pthread_mutex_init(&g_mutex, NULL);
  44. }

  45. int CRITICAL_DEINIT()
  46. {
  47.         pthread_mutex_destroy(&g_mutex);
  48. }


  49. void *thread_timer(void* arg)
  50. {
  51.         printf("new thread,thread is :%u,pid:%d\n",pthread_self(),getpid());
  52.         while(1) {
  53.                 sleep(2);
  54.                 OnTimer();
  55.                 //pthread_exit(NULL);
  56.         }
  57. }

  58. char *msg1 = "12345678901234567";
  59. char *msg2 = "Time out,-edit!";
  60. void *thread_run1(void* arg)
  61. {
  62.         char ms[100];
  63.         int ret,len;
  64.         printf("new thread,thread is :%u,pid:%d\n",pthread_self(),getpid());
  65.         CommSaveMsg(11,msg2,strlen(msg2));
  66.         while(1) {
  67.                 sleep(5);
  68.                 printf("len:%d  save ret:%d\n",strlen(msg1),CommSaveMsg(10,msg1,strlen(msg1)));
  69.                 sleep(5);
  70.                 ret = CommGetMsg(10,ms,&len);
  71.                 ms[len+1]=0;
  72.                 printf("get ret:%d  len:%d  ms:%s\n",ret,len,ms);
  73.         }
  74. }

  75. void *thread_run2(void* arg)
  76. {
  77.         char ms[100];
  78.         int ret,len;
  79.         printf("new thread,thread is :%u,pid:%d\n",pthread_self(),getpid());
  80.         while(1) {
  81.                 sleep(3);

  82.                 ret = CommGetMsg(10,ms,&len);
  83.                
  84.                 printf("get ret:%d  len:%d\n",ret,len);
  85.         }
  86. }





  87. int main()
  88. {
  89.         CommuInit();
  90.         CommSetEventHandler(handler);

  91.         pthread_t tid_timer,tid_run1,tid_run2;
  92.         pthread_create(&tid_timer,NULL,thread_timer,NULL);
  93.         pthread_create(&tid_run1,NULL,thread_run1,NULL);
  94.         //pthread_create(&tid_run2,NULL,thread_run2,NULL);

  95.         while(1){
  96.                 sleep(10);
  97.         }

  98.         return 0;
  99. }



在mcu下,可以在定时器里面调用:OnTimer(),来实现超时机制。
超时后的处理在类似:
  1. int handler(const int event,const int msgId)
这样的函数中实现,比如读出超时消息等等。




@dirtwillfly @gaoyang9992006 @icecut @sherwin @tyw @21ic小喇叭 @yyy71cj @海中水


icecut 发表于 2020-4-10 16:10 | 显示全部楼层
互联网的套路,嵌入式没os的不敢用
 楼主| keer_zu 发表于 2020-4-10 16:15 | 显示全部楼层
icecut 发表于 2020-4-10 16:10
互联网的套路,嵌入式没os的不敢用

这个不要os的,很简单,资源占用也很少。
dirtwillfly 发表于 2020-4-11 12:55 | 显示全部楼层
我一般都是用链表、数组来存储数,复杂点的会考虑sqlite
 楼主| keer_zu 发表于 2020-4-11 22:44 | 显示全部楼层
dirtwillfly 发表于 2020-4-11 12:55
我一般都是用链表、数组来存储数,复杂点的会考虑sqlite

sqlite好像不支持并发吧,之前发现很慢就用mysql了,mcu上还是没有可以选用的数据库
dirtwillfly 发表于 2020-4-14 19:46 | 显示全部楼层
keer_zu 发表于 2020-4-11 22:44
sqlite好像不支持并发吧,之前发现很慢就用mysql了,mcu上还是没有可以选用的数据库 ...

mcu上基本不需要并发的。
只有fpga或者dsp才会考虑并发
 楼主| keer_zu 发表于 2020-4-15 08:52 | 显示全部楼层
dirtwillfly 发表于 2020-4-14 19:46
mcu上基本不需要并发的。
只有fpga或者dsp才会考虑并发

这个也考虑到在linux下也能使用,所以并发一定要考虑到的。
mcu的中断函数也可以看做并发的。
dirtwillfly 发表于 2020-4-15 20:30 | 显示全部楼层
keer_zu 发表于 2020-4-15 08:52
这个也考虑到在linux下也能使用,所以并发一定要考虑到的。
mcu的中断函数也可以看做并发的。 ...

嗯。如果中断中和主程序中涉及到相同的资源使用,也可以看做是并发。
我个人喜欢在中断中时间尽量的短,处理的事情尽量的少。把大部分事情都安排在主程序中。
 楼主| keer_zu 发表于 2020-4-16 09:18 | 显示全部楼层
dirtwillfly 发表于 2020-4-15 20:30
嗯。如果中断中和主程序中涉及到相同的资源使用,也可以看做是并发。
我个人喜欢在中断中时间尽量的短, ...

是的,中断尽可能小时应该的,它主要是能保证及时响应事件。
dsyq 发表于 2021-3-12 15:39 | 显示全部楼层
学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1478

主题

12912

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1478

主题

12912

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部