打印

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

[复制链接]
6295|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

接口定义如下

头文件:
#ifndef __UCOMLIB_H__
#define __UCOMLIB_H__


/////////////////////////// error code ///////////////////////////////
#define ERR_TARGET_NULL    -10
#define ERR_DATA_EXCESSIVE -11
#define ERR_ID_EXIST       -12
#define ERR_MSG_TOO_LONG   -13
#define ERR_MSG_BUF_FULL   -14
#define ERR_MSG_NOT_EXIST  -15


/////////////////////////////// TIMER ////////////////////////////////
#define MAX_TIMEER_COUNT  10
//////////////////////////// event type //////////////////////////////
#define EV_TIMEOUT          1

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

int CRITICAL_INIT();
void ENTER_CRITICAL();
void EXIT_CRITICAL();
int CRITICAL_DEINIT();



/////////////////////////////////// debug ////////////////////////////
//#define __DEBUG__
#ifdef __DEBUG__
#define DEBUG(format,...) printf("File: "__FILE__", Line: %05d: "format"/n", __LINE__, ##__VA_ARGS__)
#else
#define DEBUG(format,...)
#endif
/*example*/
// char str[]="Hello World";  
// DEBUG("A ha, check me: %s",str);
//
//////////////////////////////////////////////////////////////////////
#define MAX_ASYNC_MSG_NUM   10

///////////////////////////// API ////////////////////////////////////
int CommuInit(void);
int CommSetEventHandler(EVENT_HANDLER ev);
int CommSaveMsg(const int msgId,const char *msgData,unsigned int dataLen);
int CommGetMsg(const int msgId,char *msgData,unsigned int* pDataLen);
int OnTimer();


#endif

使用实例(linux):
//#include "Communication.h"
//#include "Timer.h"
#include <stdio.h>
//#include "list.h"
#define __DEBUG__
#include "ucomlib.h"
#include <pthread.h>
#include <string.h>

pthread_mutex_t g_mutex;

int flag = 1;
int handler(const int event,const int msgId)
{
        int ret,len;
        char ms[100];
        char *msg2 = "123456789123456789";
        switch (event) {
                case EV_TIMEOUT:
                        printf("ev_timeout\n");
                        if(flag){
                                ret = CommGetMsg(11,ms,&len);
                                ms[len+1]=0;
                                printf("get ret:%d  len:%d  m:%s\n",ret,len,ms);
                        } else {
                                printf("save ret:%d\n",CommSaveMsg(11,msg2,strlen(msg2)));
                        }
                        flag = !flag;
                        break;
                default:
                        DEBUG("undefine event");
                        break;       
        }
}

void ENTER_CRITICAL()
{
        pthread_mutex_lock(&g_mutex);
}


void EXIT_CRITICAL()
{
        pthread_mutex_unlock(&g_mutex);
}

int CRITICAL_INIT()
{
        pthread_mutex_init(&g_mutex, NULL);
}

int CRITICAL_DEINIT()
{
        pthread_mutex_destroy(&g_mutex);
}


void *thread_timer(void* arg)
{
        printf("new thread,thread is :%u,pid:%d\n",pthread_self(),getpid());
        while(1) {
                sleep(2);
                OnTimer();
                //pthread_exit(NULL);
        }
}

char *msg1 = "12345678901234567";
char *msg2 = "Time out,-edit!";
void *thread_run1(void* arg)
{
        char ms[100];
        int ret,len;
        printf("new thread,thread is :%u,pid:%d\n",pthread_self(),getpid());
        CommSaveMsg(11,msg2,strlen(msg2));
        while(1) {
                sleep(5);
                printf("len:%d  save ret:%d\n",strlen(msg1),CommSaveMsg(10,msg1,strlen(msg1)));
                sleep(5);
                ret = CommGetMsg(10,ms,&len);
                ms[len+1]=0;
                printf("get ret:%d  len:%d  ms:%s\n",ret,len,ms);
        }
}

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

                ret = CommGetMsg(10,ms,&len);
               
                printf("get ret:%d  len:%d\n",ret,len);
        }
}





int main()
{
        CommuInit();
        CommSetEventHandler(handler);

        pthread_t tid_timer,tid_run1,tid_run2;
        pthread_create(&tid_timer,NULL,thread_timer,NULL);
        pthread_create(&tid_run1,NULL,thread_run1,NULL);
        //pthread_create(&tid_run2,NULL,thread_run2,NULL);

        while(1){
                sleep(10);
        }

        return 0;
}



在mcu下,可以在定时器里面调用:OnTimer(),来实现超时机制。
超时后的处理在类似:
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

使用特权

评论回复
5
keer_zu|  楼主 | 2020-4-11 22:44 | 只看该作者
dirtwillfly 发表于 2020-4-11 12:55
我一般都是用链表、数组来存储数,复杂点的会考虑sqlite

sqlite好像不支持并发吧,之前发现很慢就用mysql了,mcu上还是没有可以选用的数据库

使用特权

评论回复
6
dirtwillfly| | 2020-4-14 19:46 | 只看该作者
keer_zu 发表于 2020-4-11 22:44
sqlite好像不支持并发吧,之前发现很慢就用mysql了,mcu上还是没有可以选用的数据库 ...

mcu上基本不需要并发的。
只有fpga或者dsp才会考虑并发

使用特权

评论回复
7
keer_zu|  楼主 | 2020-4-15 08:52 | 只看该作者
dirtwillfly 发表于 2020-4-14 19:46
mcu上基本不需要并发的。
只有fpga或者dsp才会考虑并发

这个也考虑到在linux下也能使用,所以并发一定要考虑到的。
mcu的中断函数也可以看做并发的。

使用特权

评论回复
8
dirtwillfly| | 2020-4-15 20:30 | 只看该作者
keer_zu 发表于 2020-4-15 08:52
这个也考虑到在linux下也能使用,所以并发一定要考虑到的。
mcu的中断函数也可以看做并发的。 ...

嗯。如果中断中和主程序中涉及到相同的资源使用,也可以看做是并发。
我个人喜欢在中断中时间尽量的短,处理的事情尽量的少。把大部分事情都安排在主程序中。

使用特权

评论回复
9
keer_zu|  楼主 | 2020-4-16 09:18 | 只看该作者
dirtwillfly 发表于 2020-4-15 20:30
嗯。如果中断中和主程序中涉及到相同的资源使用,也可以看做是并发。
我个人喜欢在中断中时间尽量的短, ...

是的,中断尽可能小时应该的,它主要是能保证及时响应事件。

使用特权

评论回复
10
dsyq| | 2021-3-12 15:39 | 只看该作者
学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1350

主题

12427

帖子

53

粉丝