【原创】一个简单的(key:value(string))消息缓冲结构
本帖最后由 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_COUNT10
//////////////////////////// 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;
char *msg2 = "123456789123456789";
switch (event) {
case EV_TIMEOUT:
printf("ev_timeout\n");
if(flag){
ret = CommGetMsg(11,ms,&len);
ms=0;
printf("get ret:%dlen:%dm:%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;
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:%dsave ret:%d\n",strlen(msg1),CommSaveMsg(10,msg1,strlen(msg1)));
sleep(5);
ret = CommGetMsg(10,ms,&len);
ms=0;
printf("get ret:%dlen:%dms:%s\n",ret,len,ms);
}
}
void *thread_run2(void* arg)
{
char ms;
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:%dlen:%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 @海中水
互联网的套路,嵌入式没os的不敢用 icecut 发表于 2020-4-10 16:10
互联网的套路,嵌入式没os的不敢用
这个不要os的,很简单,资源占用也很少。 我一般都是用链表、数组来存储数,复杂点的会考虑sqlite dirtwillfly 发表于 2020-4-11 12:55
我一般都是用链表、数组来存储数,复杂点的会考虑sqlite
sqlite好像不支持并发吧,之前发现很慢就用mysql了,mcu上还是没有可以选用的数据库 keer_zu 发表于 2020-4-11 22:44
sqlite好像不支持并发吧,之前发现很慢就用mysql了,mcu上还是没有可以选用的数据库 ...
mcu上基本不需要并发的。
只有fpga或者dsp才会考虑并发 dirtwillfly 发表于 2020-4-14 19:46
mcu上基本不需要并发的。
只有fpga或者dsp才会考虑并发
这个也考虑到在linux下也能使用,所以并发一定要考虑到的。
mcu的中断函数也可以看做并发的。 keer_zu 发表于 2020-4-15 08:52
这个也考虑到在linux下也能使用,所以并发一定要考虑到的。
mcu的中断函数也可以看做并发的。 ...
嗯。如果中断中和主程序中涉及到相同的资源使用,也可以看做是并发。
我个人喜欢在中断中时间尽量的短,处理的事情尽量的少。把大部分事情都安排在主程序中。 dirtwillfly 发表于 2020-4-15 20:30
嗯。如果中断中和主程序中涉及到相同的资源使用,也可以看做是并发。
我个人喜欢在中断中时间尽量的短, ...
是的,中断尽可能小时应该的,它主要是能保证及时响应事件。 学习
页:
[1]