void app_sqlite3_thread(void *argument)
{
sqlite3_initialize();
sqlite3 *db;
char *zErrMsg = 0;
int res;
int start = 0;
int index = 0;
char cmd[128] = {0};
time_t now;
rt_thread_mdelay(2000);
res = sqlite3_open("/mnt/sd1/test.db", &db);
if (res != 0)
{
LOG_E("open db fail");
rt_thread_mdelay(1000);
return;
}
res = sqlite3_exec(db, "create table if not exists mydb(time vchar(30),fs1_1 float,fs1_2 float,fs2_1 float,fs2_2 float,fs3_1 float,fs3_2 float,temp1 char,temp2 char,temp3 char,current1 char,current2 char,current3 char,freq1 char,freq2 char,freq3 char)", 0, 0, &zErrMsg);
if (res != 0)
{
LOG_E("create table fail");
sqlite3_free(zErrMsg);
rt_thread_mdelay(1000);
return;
}
res = sqlite3_exec(db, "PRAGMA synchronous=FULL", 0, 0, &zErrMsg);
if (res != 0)
{
printf("set pragma fail\r\n");
sqlite3_free(zErrMsg);
}
while (1)
{
// printf("start: %d\r\n", rt_tick_get());
start = rt_tick_get();
rt_memset(cmd, 0, sizeof(cmd));
now = time(RT_NULL);
rt_sprintf(cmd, "insert into mydb values('%s',1.2,2.6,3.1,4.7,0.9,4.2,10,25,28,12,36,28,30,19,24)", ctime(&now));
res = sqlite3_exec(db, cmd, 0, 0, &zErrMsg);
if (res != 0)
{
LOG_E("insert data fail");
sqlite3_free(zErrMsg);
}
if (rt_tick_get() - start > 100)
{
// LOG_W("write time too long: %d",rt_tick_get() - start);
}
rt_thread_mdelay(20);
}
sqlite3_close(db);
}
int app_sqlite(void)
{
rt_thread_t tid = 0;
tid = rt_thread_create("app_sqlite", app_sqlite3_thread, RT_NULL, 500 * 1024, 10, 300);
if (tid != RT_NULL)
{
rt_thread_startup(tid);
}
else
rt_kprintf("create sqlite app fail\r\n");
}
INIT_APP_EXPORT(app_sqlite);
屏蔽sqlite3_exec后占用内存无变化,没有内存泄漏现象
@老鸟kkk 哈哈,好,那就确认是它的问题咯。我下午得空的时候也继续翻翻代码。
@老鸟kkk
查了一些关于SQLLite的资料,如下方一个相对有价值的链接提到:
https://blog.csdn.net/hexf9632/article/details/123546404
猜测,大概率不是因为内存泄漏引起的,而是因为你在持续写入,SQLLite内部内存管理机制造成的内存增大。
不知道定期打开/关闭数据库是否能够解决这个问题。
@lchnu 感谢!这篇文章我也看到过,上面也猜测是不是sqlite缓存问题,所以打算挂几天看内存会不会持续增大导致崩溃还是到一定程度后不再增加。定期打开关闭倒是没有试过,先观察几天再试一下
@老鸟kkk 哈哈,好,等你的结果更新。我也正在评估用sqlite,持续关注下。
@lchnu 连续挂了三四天的样子,从第一天开始的几个小时后内存增长到一定程度后不再增长(RTT系统+sqlite+at组件+lwip+fatfs大概占用了8MB左右的内存),用sqlite来存数据问题应该不大,用的fatfs文件系统,据说用其他文件系统会有问题。一直想把官方的yaffs和lwext4用起来,但是没成功,资料都好少
@老鸟kkk 学习了!
那应该就是内存算法导致的平衡性问题。感谢您的前期工作,我敢放心大胆用sqlite了,哈哈哈。