1、【优化】Flash环境变量代码,提高写入缓存的效率。

Signed-off-by: armink <armink.ztl@gmail.com>
pull/1/head
armink 11 years ago
parent e268dcfa18
commit 31cf0cce1d

File diff suppressed because it is too large Load Diff

@ -34,12 +34,12 @@
<PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ShowCodeCoverage>1</ShowCodeCoverage><ShowInstrProfiling>1</ShowInstrProfiling></Disassembly>
<Find-All-Declarations><ColumnWidth0>580</ColumnWidth0><ColumnWidth1>82</ColumnWidth1><ColumnWidth2>994</ColumnWidth2></Find-All-Declarations><WATCH_1><expressions><item>eMasterRcvState</item><item>eMasterSndState</item><item>CpuUsageMinor</item><item/></expressions><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>138</item><item>150</item><item>100</item><item>221</item></col-widths><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>StaticWatch</Factory></Window></Windows></PreferedWindows></WATCH_1><Auto><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>WATCH_1</Factory></Window><Window><Factory>StaticWatch</Factory></Window></Windows></PreferedWindows><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>100</item><item>150</item><item>100</item><item>100</item></col-widths></Auto><StaticWatch><expressions><item></item></expressions><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>140</item><item>150</item><item>100</item><item>139</item></col-widths></StaticWatch></Static>
<Find-All-Declarations><ColumnWidth0>580</ColumnWidth0><ColumnWidth1>82</ColumnWidth1><ColumnWidth2>994</ColumnWidth2></Find-All-Declarations><WATCH_1><expressions><item>eMasterRcvState</item><item>eMasterSndState</item><item>CpuUsageMinor</item><item/></expressions><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>138</item><item>150</item><item>100</item><item>221</item></col-widths><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>StaticWatch</Factory></Window></Windows></PreferedWindows></WATCH_1><Auto><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>WATCH_1</Factory></Window><Window><Factory>StaticWatch</Factory></Window></Windows></PreferedWindows><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>100</item><item>150</item><item>100</item><item>100</item></col-widths></Auto><StaticWatch><expressions><item/></expressions><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>140</item><item>150</item><item>100</item><item>139</item></col-widths></StaticWatch></Static>
<Windows>
<Wnd0>
<Wnd2>
<Tabs>
<Tab>
<Identity>TabID-27820-6871</Identity>
@ -55,7 +55,7 @@
</Tab>
<Tab><Identity>TabID-23458-14555</Identity><TabName>Find All Declarations</TabName><Factory>Find-All-Declarations</Factory><Session/></Tab></Tabs>
<SelectedTab>0</SelectedTab></Wnd0><Wnd1>
<SelectedTab>0</SelectedTab></Wnd2><Wnd4>
<Tabs>
<Tab>
<Identity>TabID-5800-6874</Identity>
@ -67,20 +67,20 @@
</Tab>
</Tabs>
<SelectedTab>0</SelectedTab></Wnd1><Wnd3><Tabs><Tab><Identity>TabID-15165-9557</Identity><TabName>Live Watch</TabName><Factory>StaticWatch</Factory></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows>
<SelectedTab>0</SelectedTab></Wnd4><Wnd5><Tabs><Tab><Identity>TabID-15165-9557</Identity><TabName>Live Watch</TabName><Factory>StaticWatch</Factory></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd5></Windows>
<Editor>
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\app\src\app_task.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>0</YPos2><SelStart2>285</SelStart2><SelEnd2>285</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\app\src\app.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>0</YPos2><SelStart2>25</SelStart2><SelEnd2>25</SelEnd2></Tab><ActiveTab>1</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\app\src\app_task.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>0</YPos2><SelStart2>62</SelStart2><SelEnd2>62</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\app\src\app.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>0</YPos2><SelStart2>25</SelStart2><SelEnd2>25</SelEnd2></Tab><ActiveTab>1</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Positions>
<Top><Row0><Sizes><Toolbar-012b8f08><key>iaridepm.enu1</key></Toolbar-012b8f08><Toolbar-030e0e60><key>armjlink.enu1</key></Toolbar-030e0e60><Toolbar-030e01e0><key>debuggergui.enu1</key></Toolbar-030e01e0></Sizes></Row0></Top><Left><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>727</Bottom><Right>241</Right><x>-2</x><y>-2</y><xscreen>100</xscreen><yscreen>197</yscreen><sizeHorzCX>59524</sizeHorzCX><sizeHorzCY>203723</sizeHorzCY><sizeVertCX>144643</sizeVertCX><sizeVertCY>753878</sizeVertCY></Rect></Wnd1></Sizes></Row0></Left><Right><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>727</Bottom><Right>477</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>119048</sizeHorzCX><sizeHorzCY>206825</sizeHorzCY><sizeVertCX>285119</sizeVertCX><sizeVertCY>753878</sizeVertCY></Rect></Wnd3></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>195</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>197</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>203723</sizeHorzCY><sizeVertCX>59524</sizeVertCX><sizeVertCY>203723</sizeVertCY></Rect></Wnd0></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
<Top><Row0><Sizes><Toolbar-03458f08><key>iaridepm.enu1</key></Toolbar-03458f08><Toolbar-030b33e0><key>armjlink.enu1</key></Toolbar-030b33e0><Toolbar-030b2ff8><key>debuggergui.enu1</key></Toolbar-030b2ff8></Sizes></Row0></Top><Left><Row0><Sizes><Wnd4><Rect><Top>-2</Top><Left>-2</Left><Bottom>727</Bottom><Right>241</Right><x>-2</x><y>-2</y><xscreen>100</xscreen><yscreen>197</yscreen><sizeHorzCX>59524</sizeHorzCX><sizeHorzCY>203723</sizeHorzCY><sizeVertCX>144643</sizeVertCX><sizeVertCY>753878</sizeVertCY></Rect></Wnd4></Sizes></Row0></Left><Right><Row0><Sizes><Wnd5><Rect><Top>-2</Top><Left>-2</Left><Bottom>727</Bottom><Right>477</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>119048</sizeHorzCX><sizeHorzCY>206825</sizeHorzCY><sizeVertCX>285119</sizeVertCX><sizeVertCY>753878</sizeVertCY></Rect></Wnd5></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>195</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>197</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>203723</sizeHorzCY><sizeVertCX>59524</sizeVertCX><sizeVertCY>203723</sizeVertCY></Rect></Wnd2></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
</Desktop>
</Project>

@ -9,7 +9,7 @@ TriggerName=main
LimitSize=0
ByteLimit=50
[DebugChecksum]
Checksum=-1462069303
Checksum=398265316
[Exceptions]
StopOnUncaught=_ 0
StopOnThrow=_ 0

@ -17,7 +17,7 @@
<Build><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Find-All-Declarations</Factory></Window><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows><ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1215</ColumnWidth1><ColumnWidth2>324</ColumnWidth2><ColumnWidth3>81</ColumnWidth3></Build><TerminalIO/><Debug-Log><ColumnWidth0>19</ColumnWidth0><ColumnWidth1>1622</ColumnWidth1></Debug-Log><Find-All-Declarations><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows><ColumnWidth0>580</ColumnWidth0><ColumnWidth1>82</ColumnWidth1><ColumnWidth2>994</ColumnWidth2></Find-All-Declarations><DRIVER_CUSTOM_SFR><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><col-names><item>Access</item><item>Address</item><item>Name</item><item>Size</item><item>Zone</item><item>_I0</item></col-names><col-widths><item>120</item><item>150</item><item>150</item><item>50</item><item>120</item><item>20</item></col-widths></DRIVER_CUSTOM_SFR></Static>
<Windows>
<Wnd0>
<Wnd2>
<Tabs>
<Tab>
<Identity>TabID-30370-1297</Identity>
@ -29,20 +29,20 @@
</Tab>
</Tabs>
<SelectedTab>0</SelectedTab></Wnd0><Wnd1><Tabs><Tab><Identity>TabID-28122-19222</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab><Tab><Identity>TabID-16453-20055</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab></Tabs><SelectedTab>1</SelectedTab></Wnd1></Windows>
<SelectedTab>0</SelectedTab></Wnd2><Wnd3><Tabs><Tab><Identity>TabID-28122-19222</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab><Tab><Identity>TabID-16453-20055</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab></Tabs><SelectedTab>1</SelectedTab></Wnd3></Windows>
<Editor>
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\app\src\app_task.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>0</YPos2><SelStart2>62</SelStart2><SelEnd2>62</SelEnd2></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\app\src\app_task.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>0</YPos2><SelStart2>140</SelStart2><SelEnd2>140</SelEnd2></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Positions>
<Top><Row0><Sizes><Toolbar-012b8f08><key>iaridepm.enu1</key></Toolbar-012b8f08></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>744</Bottom><Right>314</Right><x>-2</x><y>-2</y><xscreen>510</xscreen><yscreen>51</yscreen><sizeHorzCX>303571</sizeHorzCX><sizeHorzCY>52740</sizeHorzCY><sizeVertCX>188095</sizeVertCX><sizeVertCY>771458</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>178</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>180</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>186143</sizeHorzCY><sizeVertCX>303571</sizeVertCX><sizeVertCY>52740</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
<Top><Row0><Sizes><Toolbar-037a8f08><key>iaridepm.enu1</key></Toolbar-037a8f08></Sizes></Row0></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>744</Bottom><Right>314</Right><x>-2</x><y>-2</y><xscreen>510</xscreen><yscreen>51</yscreen><sizeHorzCX>303571</sizeHorzCX><sizeHorzCY>52740</sizeHorzCY><sizeVertCX>188095</sizeVertCX><sizeVertCY>771458</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>178</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>180</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>186143</sizeHorzCY><sizeVertCX>303571</sizeVertCX><sizeVertCY>52740</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
</Desktop>
</Workspace>

@ -44,7 +44,7 @@ if (!(EXPR)) \
while (1); \
}
/* EasyFlash software version number */
#define FLASH_SW_VERSION "1.04.17"
#define FLASH_SW_VERSION "1.04.20"
typedef struct _flash_env{
char *key;

@ -37,20 +37,20 @@
* @note Word = 4 Bytes in this file
*/
/* flash ENV system section index and size */
/* flash ENV parameters index and size in system section */
enum {
/* data section ENV end address index in system section */
FLASH_ENV_SYSTEM_INDEX_END_ADDR = 0,
ENV_PARAM_INDEX_END_ADDR = 0,
#ifdef FLASH_ENV_USING_CRC_CHECK
/* data section CRC32 code index in system section */
FLASH_ENV_SYSTEM_INDEX_DATA_CRC,
ENV_PARAM_INDEX_DATA_CRC,
#endif
/* flash ENV system section word size */
FLASH_ENV_SYSTEM_WORD_SIZE,
/* flash ENV system section byte size */
FLASH_ENV_SYSTEM_BYTE_SIZE = FLASH_ENV_SYSTEM_WORD_SIZE * 4,
/* flash ENV parameters word size */
ENV_PARAM_WORD_SIZE,
/* flash ENV parameters byte size */
ENV_PARAM_BYTE_SIZE = ENV_PARAM_WORD_SIZE * 4,
};
/* default ENV set, must be initialized by user */
@ -167,7 +167,7 @@ static uint32_t get_env_system_addr(void) {
*/
static uint32_t get_env_data_addr(void) {
FLASH_ASSERT(env_start_addr);
return env_start_addr + FLASH_ENV_SYSTEM_BYTE_SIZE;
return env_start_addr + ENV_PARAM_BYTE_SIZE;
}
/**
@ -178,7 +178,7 @@ static uint32_t get_env_data_addr(void) {
*/
static uint32_t get_env_end_addr(void) {
/* it is the first word */
return env_cache[FLASH_ENV_SYSTEM_INDEX_END_ADDR];
return env_cache[ENV_PARAM_INDEX_END_ADDR];
}
/**
@ -188,7 +188,7 @@ static uint32_t get_env_end_addr(void) {
* @param end_addr ENV end address
*/
static void set_env_end_addr(uint32_t end_addr) {
env_cache[FLASH_ENV_SYSTEM_INDEX_END_ADDR] = end_addr;
env_cache[ENV_PARAM_INDEX_END_ADDR] = end_addr;
}
/**
@ -231,42 +231,35 @@ uint32_t flash_get_env_write_bytes(void) {
*/
static FlashErrCode write_env(const char *key, const char *value) {
FlashErrCode result = FLASH_NO_ERR;
uint16_t env_str_index = 0, env_str_length, i;
char *env_str;
size_t ker_len = strlen(key), value_len = strlen(value), env_str_len;
char *env_cache_bak = (char *)env_cache;
/* calculate ENV storage length, contain '=' and '\0'. */
env_str_length = strlen(key) + strlen(value) + 2;
if (env_str_length % 4 != 0) {
env_str_length = (env_str_length / 4 + 1) * 4;
env_str_len = ker_len + value_len + 2;
if (env_str_len % 4 != 0) {
env_str_len = (env_str_len / 4 + 1) * 4;
}
/* check capacity of ENV */
if (env_str_length + get_env_data_size() >= flash_get_env_total_size()) {
if (env_str_len + get_env_data_size() >= flash_get_env_total_size()) {
return FLASH_ENV_FULL;
}
/* use ram to process string key=value\0 */
env_str = flash_malloc(env_str_length * sizeof(char));
FLASH_ASSERT(env_str);
memset(env_str, 0, env_str_length * sizeof(char));
/* calculate current ENV ram cache end address */
env_cache_bak += flash_get_env_write_bytes();
/* copy key name */
for (env_str_index = 0; env_str_index < strlen(key); env_str_index++) {
env_str[env_str_index] = key[env_str_index];
}
memcpy(env_cache_bak, key, ker_len);
env_cache_bak += ker_len;
/* copy equal sign */
env_str[env_str_index] = '=';
env_str_index++;
*env_cache_bak = '=';
env_cache_bak++;
/* copy value */
for (i = 0; i < strlen(value); env_str_index++, i++) {
env_str[env_str_index] = value[i];
}
//TODO ¿¼ÂǿɷñÓÅ»¯
memcpy((char *) env_cache + flash_get_env_write_bytes(), (uint32_t *) env_str,
env_str_length);
set_env_end_addr(get_env_end_addr() + env_str_length);
/* free ram */
flash_free(env_str);
env_str = NULL;
memcpy(env_cache_bak, value, value_len);
env_cache_bak += value_len;
/* fill '\0' for string end sign */
*env_cache_bak = '\0';
env_cache_bak ++;
/* fill '\0' for word alignment */
memset(env_cache_bak, 0, env_str_len - (ker_len + value_len + 2));
set_env_end_addr(get_env_end_addr() + env_str_len);
return result;
}
@ -290,7 +283,7 @@ static uint32_t *find_env(const char *key) {
}
/* from data section start to data section end */
env_start = (char *) ((char *) env_cache + FLASH_ENV_SYSTEM_BYTE_SIZE);
env_start = (char *) ((char *) env_cache + ENV_PARAM_BYTE_SIZE);
env_end = (char *) ((char *) env_cache + flash_get_env_write_bytes());
/* ENV is null */
@ -304,11 +297,15 @@ static uint32_t *find_env(const char *key) {
env_bak = strstr(env, key);
/* the key name length must be equal */
if (env_bak && (env_bak[strlen(key)] == '=')) {
env_cache_addr = (uint32_t *) env;
env_cache_addr = (uint32_t *) env_bak;
break;
} else {
/* next ENV */
/* next ENV and word alignment */
if ((strlen(env) + 1) % 4 == 0) {
env += strlen(env) + 1;
} else {
env += ((strlen(env) + 1) / 4 + 1) * 4;
}
}
}
return env_cache_addr;
@ -360,7 +357,7 @@ static FlashErrCode create_env(const char *key, const char *value) {
FlashErrCode flash_del_env(const char *key){
FlashErrCode result = FLASH_NO_ERR;
char *del_env_str = NULL;
uint32_t del_env_length, remain_env_length;
size_t del_env_length, remain_env_length;
FLASH_ASSERT(key);
FLASH_ASSERT(env_cache);
@ -389,8 +386,8 @@ FlashErrCode flash_del_env(const char *key){
del_env_length = (del_env_length / 4 + 1) * 4;
}
/* calculate remain ENV length */
remain_env_length =
get_env_data_size() - ((uint32_t) del_env_str - (uint32_t) env_cache);
remain_env_length = get_env_data_size()
- (((uint32_t) del_env_str + del_env_length) - ((uint32_t) env_cache + ENV_PARAM_BYTE_SIZE));
/* remain ENV move forward */
memcpy(del_env_str, del_env_str + del_env_length, remain_env_length);
/* reset ENV end address */
@ -458,9 +455,9 @@ char *flash_get_env(const char *key) {
* Print ENV.
*/
void flash_print_env(void) {
uint32_t *env_cache_data_addr = env_cache + FLASH_ENV_SYSTEM_WORD_SIZE,
uint32_t *env_cache_data_addr = env_cache + ENV_PARAM_WORD_SIZE,
*env_cache_end_addr =
(uint32_t *) (env_cache + FLASH_ENV_SYSTEM_WORD_SIZE + get_env_data_size() / 4);
(uint32_t *) (env_cache + ENV_PARAM_WORD_SIZE + get_env_data_size() / 4);
uint8_t j;
char c;
@ -489,7 +486,7 @@ void flash_load_env(void) {
FLASH_ASSERT(env_cache);
/* read ENV end address from flash */
flash_read(get_env_system_addr() + FLASH_ENV_SYSTEM_INDEX_END_ADDR * 4, &env_end_addr, 4);
flash_read(get_env_system_addr() + ENV_PARAM_INDEX_END_ADDR * 4, &env_end_addr, 4);
/* if ENV is not initialize or flash has dirty data, set default for it */
if ((env_end_addr == 0xFFFFFFFF) || (env_end_addr > env_start_addr + env_total_size)) {
flash_env_set_default();
@ -497,14 +494,14 @@ void flash_load_env(void) {
/* set ENV end address */
set_env_end_addr(env_end_addr);
env_cache_bak = env_cache + FLASH_ENV_SYSTEM_WORD_SIZE;
env_cache_bak = env_cache + ENV_PARAM_WORD_SIZE;
/* read all ENV from flash */
flash_read(get_env_data_addr(), env_cache_bak, get_env_data_size());
#ifdef FLASH_ENV_USING_CRC_CHECK
/* read ENV CRC code from flash */
flash_read(get_env_system_addr() + FLASH_ENV_SYSTEM_INDEX_DATA_CRC * 4,
&env_cache[FLASH_ENV_SYSTEM_INDEX_DATA_CRC] , 4);
flash_read(get_env_system_addr() + ENV_PARAM_INDEX_DATA_CRC * 4,
&env_cache[ENV_PARAM_INDEX_DATA_CRC] , 4);
/* if ENV CRC32 check is fault, set default for it */
if (!env_crc_is_ok()) {
@ -526,7 +523,7 @@ FlashErrCode flash_save_env(void) {
#ifdef FLASH_ENV_USING_CRC_CHECK
/* calculate and cache CRC32 code */
env_cache[FLASH_ENV_SYSTEM_INDEX_DATA_CRC] = calc_env_crc();
env_cache[ENV_PARAM_INDEX_DATA_CRC] = calc_env_crc();
#endif
/* erase ENV */
@ -571,8 +568,8 @@ static uint32_t calc_env_crc(void) {
extern uint32_t calc_crc32(uint32_t crc, const void *buf, size_t size);
/* Calculate the ENV end address and all ENV data CRC32.
* The 4 is ENV end address bytes size. */
crc32 = calc_crc32(crc32, &env_cache[FLASH_ENV_SYSTEM_INDEX_END_ADDR], 4);
crc32 = calc_crc32(crc32, &env_cache[FLASH_ENV_SYSTEM_WORD_SIZE], get_env_data_size());
crc32 = calc_crc32(crc32, &env_cache[ENV_PARAM_INDEX_END_ADDR], 4);
crc32 = calc_crc32(crc32, &env_cache[ENV_PARAM_WORD_SIZE], get_env_data_size());
FLASH_DEBUG("Calculate Env CRC32 number is 0x%08X.\n", crc32);
return crc32;
@ -586,7 +583,7 @@ static uint32_t calc_env_crc(void) {
* @return true is ok
*/
static bool_t env_crc_is_ok(void) {
if (calc_env_crc() == env_cache[FLASH_ENV_SYSTEM_INDEX_DATA_CRC]) {
if (calc_env_crc() == env_cache[ENV_PARAM_INDEX_DATA_CRC]) {
FLASH_DEBUG("Verify Env CRC32 result is OK.\n");
return TRUE;
} else {

@ -295,42 +295,35 @@ size_t flash_get_env_total_size(void) {
*/
static FlashErrCode write_env(const char *key, const char *value) {
FlashErrCode result = FLASH_NO_ERR;
uint16_t env_str_index = 0, env_str_length, i;
char *env_str;
size_t ker_len = strlen(key), value_len = strlen(value), env_str_len;
char *env_cache_bak = (char *)env_cache;
/* calculate ENV storage length, contain '=' and '\0'. */
env_str_length = strlen(key) + strlen(value) + 2;
if (env_str_length % 4 != 0) {
env_str_length = (env_str_length / 4 + 1) * 4;
env_str_len = ker_len + value_len + 2;
if (env_str_len % 4 != 0) {
env_str_len = (env_str_len / 4 + 1) * 4;
}
/* check capacity of ENV */
if (env_str_length + get_env_detail_size() >= get_env_user_size()) {
if (env_str_len + get_env_detail_size() >= get_env_user_size()) {
return FLASH_ENV_FULL;
}
/* use ram to process string key=value\0 */
env_str = flash_malloc(env_str_length * sizeof(char));
FLASH_ASSERT(env_str);
memset(env_str, 0, env_str_length * sizeof(char));
/* calculate current ENV ram cache end address */
env_cache_bak += ENV_PARAM_PART_BYTE_SIZE + get_env_detail_size();
/* copy key name */
for (env_str_index = 0; env_str_index < strlen(key); env_str_index++) {
env_str[env_str_index] = key[env_str_index];
}
memcpy(env_cache_bak, key, ker_len);
env_cache_bak += ker_len;
/* copy equal sign */
env_str[env_str_index] = '=';
env_str_index++;
*env_cache_bak = '=';
env_cache_bak++;
/* copy value */
for (i = 0; i < strlen(value); env_str_index++, i++) {
env_str[env_str_index] = value[i];
}
//TODO ¿¼ÂǿɷñÓÅ»¯
memcpy((char *) env_cache + ENV_PARAM_PART_BYTE_SIZE + get_env_detail_size(),
(uint32_t *) env_str, env_str_length);
set_env_detail_end_addr(get_env_detail_end_addr() + env_str_length);
/* free ram */
flash_free(env_str);
env_str = NULL;
memcpy(env_cache_bak, value, value_len);
env_cache_bak += value_len;
/* fill '\0' for string end sign */
*env_cache_bak = '\0';
env_cache_bak ++;
/* fill '\0' for word alignment */
memset(env_cache_bak, 0, env_str_len - (ker_len + value_len + 2));
set_env_detail_end_addr(get_env_detail_end_addr() + env_str_len);
return result;
}
@ -368,11 +361,15 @@ static uint32_t *find_env(const char *key) {
env_bak = strstr(env, key);
/* the key name length must be equal */
if (env_bak && (env_bak[strlen(key)] == '=')) {
env_cache_addr = (uint32_t *) env;
env_cache_addr = (uint32_t *) env_bak;
break;
} else {
/* next ENV */
/* next ENV and word alignment */
if ((strlen(env) + 1) % 4 == 0) {
env += strlen(env) + 1;
} else {
env += ((strlen(env) + 1) / 4 + 1) * 4;
}
}
}
return env_cache_addr;
@ -424,7 +421,7 @@ static FlashErrCode create_env(const char *key, const char *value) {
FlashErrCode flash_del_env(const char *key){
FlashErrCode result = FLASH_NO_ERR;
char *del_env_str = NULL;
uint32_t del_env_length, remain_env_length;
size_t del_env_length, remain_env_length;
FLASH_ASSERT(key);
FLASH_ASSERT(env_cache);
@ -453,10 +450,11 @@ FlashErrCode flash_del_env(const char *key){
del_env_length = (del_env_length / 4 + 1) * 4;
}
/* calculate remain ENV length */
remain_env_length = get_env_detail_size() - ((uint32_t) del_env_str - (uint32_t) env_cache);
remain_env_length = get_env_detail_size()
- (((uint32_t) del_env_str + del_env_length) - ((uint32_t) env_cache + ENV_PARAM_PART_BYTE_SIZE));
/* remain ENV move forward */
memcpy(del_env_str, del_env_str + del_env_length, remain_env_length);
/* reset ENV detail part end address */
/* reset ENV end address */
set_env_detail_end_addr(get_env_detail_end_addr() - del_env_length);
return result;

Loading…
Cancel
Save