Strict Standards: Declaration of action_plugin_importoldchangelog::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/aqq20189/public_html/embedders.org/kurt/wiki/lib/plugins/importoldchangelog/action.php on line 8
Deprecated: Assigning the return value of new by reference is deprecated in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/parserutils.php on line 202
Deprecated: Assigning the return value of new by reference is deprecated in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/parserutils.php on line 205
Deprecated: Assigning the return value of new by reference is deprecated in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/parserutils.php on line 314
Deprecated: Assigning the return value of new by reference is deprecated in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/parserutils.php on line 454
Strict Standards: Declaration of cache_instructions::retrieveCache() should be compatible with cache::retrieveCache($clean = true) in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/cache.php on line 291
Deprecated: Function split() is deprecated in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 146
Warning: Cannot modify header information - headers already sent by (output started at /home/aqq20189/public_html/embedders.org/kurt/wiki/lib/plugins/importoldchangelog/action.php:8) in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 236
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 390
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 390
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 387
Strict Standards: Only variables should be passed by reference in /home/aqq20189/public_html/embedders.org/kurt/wiki/doku.php on line 69
Warning: Cannot modify header information - headers already sent by (output started at /home/aqq20189/public_html/embedders.org/kurt/wiki/lib/plugins/importoldchangelog/action.php:8) in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/actions.php on line 350
===== Сохранение настроек во флеш память INFO =====
Простой в реализации вариант.
Принцип следующий:
При запуске программы настройки из флеш-памяти считываются в ОЗУ. Все операции производятся над этой копией,
при модификации настроек, они блоком пишутся обратно в память программ. Для размещения используется специальный сектор памяти INFOA его размер 128 байт.
В некоторых МК с большим объемом памяти два сектора - INFOA и INFOB.
*[[flash#h-file]]
*[[flash#c-file]]
*[[flash#Пример использования]]
=== Пример использования ===
Необходимо в h-файле объявить структуру в которой будут хранится настройки.
#define DEFAULT_SETTINGS { 5, 1.0 }
};
typedef struct {
unsigned int address;
float clb_a;
unsigned short crc; // должен быть всегда в конце
} stru_config;
extern stru_config cfg_main;
в main.c объявить глобальную переменную cfg_main
//! Default application settings
const stru_config cfg_default = DEFAULT_SETTINGS;
//! Current application settings
stru_config cfg_main;
__task void main( void )
{
cfg_load_settings();
printf("Addr: %d", cfg_main.address );
if( new_addr != cfg_main.address ) {
cfg_main.address = new_addr;
cfg_save_settings();
}
if( user_want_reset_to_default() ) cfg_load_default();
}
=== h-file ===
#ifndef KR_FLASH_INCLUDED
#define KR_FLASH_INCLUDED
void cfg_save_settings(void);
void cfg_load_settings(void);
void cfg_load_default (void);
#endif
=== c-file ===
/**
* @file flash.c
* @brief MSP430 Flash memory
*
* Read and write built-in flash memory
*
* @author Rustem Kalimullin
* @par E-mail:
* hellos@mail.ru
* @par Copyright:
* (c) Kurt, 2005
*/
#include "common.h"
#include "cmn_util.h"
#pragma memory=constseg(INFOA)
const stru_config cfg_store = DEFAULT_SETTINGS;
#pragma memory=default
//---------------------------------------------------------
//! Save settings
void cfg_save_settings( void )
{
istate_t int_state = __get_interrupt_state();
__disable_interrupt();
cfg_main.crc = Calc_CRC16( (unsigned char *) &cfg_main, sizeof(cfg_main)-sizeof(cfg_main.crc));
FCTL2 = FWKEY + FSSEL_1 + FN3+FN1+FN0; // MCLK/12 = 4608000 / 12 = 384kHz
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*(unsigned int *)&cfg_store.crc = 0xFFFF; // write dummy to erase
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
memcpy( (char *) &cfg_store, (char *) &cfg_main, sizeof(cfg_main));
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
__set_interrupt_state(int_state);
}
//---------------------------------------------------------
//! Load default settings
void cfg_load_default( void )
{
memcpy( (char *)&cfg_main, (char *)&cfg_default, sizeof(cfg_main));
cfg_save_settings();
}
//---------------------------------------------------------
//! Load settings. If failed load default values.
void cfg_load_settings( void )
{
memcpy( (char *)&cfg_main, (char *)&cfg_store, sizeof(cfg_main) );
if (Calc_CRC16( (unsigned char *) &cfg_main, sizeof(cfg_main)) != 0) {
cfg_load_default();
}
}