首页 > 解决方案 > ESP8266 在覆盖现有数据库时被重置

问题描述

如果测试程序在每次运行时通过删除(重置)数据库文件来启动,则程序正在运行。

/*
    This creates two empty databases, populates values, and retrieves them back
    from the SPIFFS file system.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <vfs.h>
#include <SPI.h>
#include <FS.h>
extern "C" {
#include "user_interface.h"
}
#include <ESP8266WiFi.h>

sqlite3* db1;

void WiFiOff() {
    wifi_station_disconnect();
    wifi_set_opmode(NULL_MODE);
    wifi_set_sleep_type(MODEM_SLEEP_T);
    wifi_fpm_open();
    wifi_fpm_do_sleep(0xFFFFFFF);
}

const char* data = "Callback function called";
static int callback(void* data, int argc, char** argv, char** azColName) {
    int i;
    Serial.printf("%s: ", (const char*)data);
    for (i = 0; i < argc; i++) {
        Serial.printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    Serial.printf("\n");
    return 0;
}

int db_open(const char* filename, sqlite3** db) {
    int rc = sqlite3_open(filename, db);
    if (rc) {
        Serial.printf("Can't open database: %s\n", sqlite3_errmsg(*db));
        return rc;
    }
    else {
        Serial.printf("Opened database successfully\n");
    }
    return rc;
}

char* zErrMsg = 0;
int db_exec(sqlite3* db, const char* sql) {
    Serial.println(sql);
    long start = micros();
    int rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
    if (rc != SQLITE_OK) {
        Serial.printf("SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    else {
        Serial.printf("Operation done successfully\n");
    }
    Serial.print(F("Time taken:"));
    Serial.println(micros() - start);
    return rc;
}


void OpenDatabase();
void CreateTable();
void InsertValues();
void SelectValues();

void setup() {

    Serial.begin(74880);    

    system_update_cpu_freq(SYS_CPU_160MHZ);
    WiFiOff();

    if (!SPIFFS.begin()) {
        Serial.println("Failed to mount file system");
        return;
    }

    // list SPIFFS contents
    Dir dir = SPIFFS.openDir("/");
    while (dir.next()) {
        String fileName = dir.fileName();
        size_t fileSize = dir.fileSize();
        Serial.printf("FS File: %s, size: %ld\n", fileName.c_str(), (long)fileSize);
    }
    Serial.printf("\n");

    // remove existing file
    SPIFFS.remove("/test1.db");

    sqlite3_initialize();

    OpenDatabase();
    CreateTable();
    InsertValues();
    SelectValues();    */

    // list SPIFFS contents
    dir = SPIFFS.openDir("/");
    while (dir.next()) {
        String fileName = dir.fileName();
        size_t fileSize = dir.fileSize();
        Serial.printf("FS File: %s, size: %ld\n", fileName.c_str(), (long)fileSize);
    }
    Serial.printf("\n");
    
}

void loop() {
}

void OpenDatabase() {    
    int rc;
    // Open databases
    File db_file_obj_1;
    vfs_set_spiffs_file_obj(&db_file_obj_1);
    if (db_open("/test1.db", &db1)) return;    
}

void CreateTable() {    
    int rc;
    // Create Table
    rc = db_exec(db1, "CREATE TABLE IF NOT EXISTS test1 (id INTEGER, content);");
    if (rc != SQLITE_OK) {
        sqlite3_close(db1);        
        return;    
    }    
}

void InsertValues() {    
    int rc;
    // Insert Values
    rc = db_exec(db1, "INSERT INTO test1 VALUES (1, 'Hello, Hurol from test1');");
    if (rc != SQLITE_OK) {
        sqlite3_close(db1);        
        return;    
    }    
}

void SelectValues() {    
    int rc;
    // Select Values
    rc = db_exec(db1, "SELECT * FROM test1");
    if (rc != SQLITE_OK) {
        sqlite3_close(db1);
        return;
    }
}
} 

删除现有的数据库文件...


// 删除现有文件 SPIFFS.remove("/test1.db");


但是当在创建的表上执行 INSERT 或 SELECT 过程而不删除现有数据库时,ESP8266 会重置。


// 删除现有文件 // SPIFFS.remove("/test1.db");


(如果取消现有数据库文件的删除)

使用 ESP8266 和 SQLite 时如何获得有关重置问题的最佳文档?

你能帮忙解决这个问题吗?从现在开始谢谢你。

标签: resetesp8266

解决方案


看起来它已经改善了。非常感谢。

hw_wdt_disable(); 

void hw_wdt_disable() { 
     ((volatile uint32_t)0x60000900) &= ~(1); // Hardware WDT OFF 
    }

推荐阅读