diff --git a/Config.cpp b/Config.cpp index 29875049..43ee0336 100644 --- a/Config.cpp +++ b/Config.cpp @@ -86,9 +86,17 @@ bool ConfigBlock::Write(Storage* storage, uint addr, const ByteArray& bs) //--// +Config::Config(Storage* st, uint addr) +{ + Device = st; + Address = addr; +} + // 循环查找配置块 const void* Config::Find(const char* name, bool fAppend) { + uint c_Version = 0x534F5453; // STOS + assert_param2(name, "配置段名称不能为空"); uint addr = Address; @@ -172,15 +180,43 @@ const void* Config::Get(const char* name) } // Flash最后一块作为配置区 -Config* Config::CreateFlash() +Config& Config::CreateFlash() { // 最后一块作为配置区 static Flash flash; - static Config cfg; - cfg.Device = &flash; - cfg.Address = flash.Start + flash.Size - flash.Block; + static Config cfg(&flash, flash.Start + flash.Size - flash.Block); + //cfg.Device = &flash; + //cfg.Address = flash.Start + flash.Size - flash.Block; - return &cfg; + return cfg; +} + +// RAM最后一小段作为热启动配置区 +Config& Config::CreateRAM() +{ + // 最后一块作为配置区 + static CharStorage cs; + static Config cfg(&cs, Sys.StackTop()); + //cfg.Device = &cs; + //cfg.Address = Sys.StackTop(); + + return cfg; +} + +void* HotConfig::Next() const +{ + return (void*)&this[1]; +} + +HotConfig& HotConfig::Current() +{ + static Config& cfg = Config::CreateRAM(); + + // 查找配置数据,如果不存在,则清空 + const void* dat = cfg.Get("Hot"); + if(!dat) dat = cfg.Set("Hot", ByteArray((byte)0, sizeof(HotConfig))); + + return *(HotConfig*)dat; } // 初始化 diff --git a/Config.h b/Config.h index e6725780..6ba894dc 100644 --- a/Config.h +++ b/Config.h @@ -10,12 +10,13 @@ class Config { private: - static const uint c_Version = 0x534F5453; // STOS public: Storage* Device; uint Address; + Config(Storage* st, uint addr); + // 查找 const void* Find(const char* name, bool fAppend = false); // 废弃。仅清空名称,并不删除数据区 @@ -30,7 +31,9 @@ public: // 当前 static Config* Current; // Flash最后一块作为配置区 - static Config* CreateFlash(); + static Config& CreateFlash(); + // RAM最后一小段作为热启动配置区 + static Config& CreateRAM(); }; // 必须设定为1字节对齐,否则offsetof会得到错误的位置 @@ -38,6 +41,24 @@ public: // 强制结构体紧凑分配空间 #pragma pack(1) +// 系统配置信息 +class HotConfig +{ +public: + ushort Times; // 启动次数 + + void* Next() const; + + static HotConfig& Current(); +}; + +// 系统配置信息 +class SysConfig +{ +public: + +}; + // 配置信息 class TConfig {