Тут наверное имеется в виду что-то типа
Код
//_e_data_ok магическая константа
#define DATA_OK 0x5A
volatile __no_init __eeprom uchar EEMEM;
volatile __no_init __eeprom uchar _e_data_ok;
void main(void)
{
if (_e_data_ok != DATA_OK)
{
EEMEM = 15;
_e_data_ok = DATA_OK;
}
while(1)
{
....
}
}
А вообще, если это ответсвенная переменная, не помешало бы "накрыть" это все какойнить crc и уже по целостности crc судить о валидности данных в EEPROM.
Вот вам идеи для творчества. Удобно использовать объединения, тогда к блоку данных можно обращаться как к масиву байт при, например чтении его из памяти, подсчете crc и т.п. но при этом иметь структурированные данные для нормальной читаемости программы.
CODE
struct sEEPROMSet
{
...
uchar msgAllEnd2DurationSec; // длительность "пииик" x100мс
uint devSetFlags;
//uint crc16; - не участвует в стркуктуре для экономии ОЗУ но есть во флеш
};
union
{
uchar byte[sizeof(sEEPROMSet)];
sEEPROMSet;
} block;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++
uint crc16update(uchar inData, uint inCrc)
{
uchar i;
// считаем crc
inCrc ^= inData;
for (i = 0; i < 8; i++)
{
if (inCrc & 1)
{
inCrc >>= 1;
inCrc ^= 0x1021;
}
else
{
inCrc >>= 1;
}
}
return inCrc;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++
bool GetMemBlock(ulong start, uint dataSize, uchar * data)
{
uchar tmpData;
uint s, memCrc, crc = 0xFFFF;
//Led2On();
// записываем комманду непрерывного чтения
memStart();
SPIRW(0x03); // непрерывное чтение
memSetAdr(start);
for(s = 0; s < dataSize; s++)
{
// читаем байт из флешки
tmpData = SPIRW(0);
// записываем по указателю и увеличиваем указатель
data[s] = tmpData;
// считаем crc
crc = crc16update(tmpData, crc);
}
// читаем значение CRC16
memCrc = SPIRW(0);
memCrc |= (SPIRW(0) << 8);
memStop();
//Led2Off();
// проверяем
if (crc == memCrc)
{
return true;
}
else
{
return false;
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++
bool LoadSettings(uchar modeNum)
{
union
{
uchar byte[sizeof(sWorkModeSetBlock)];
sWorkModeSetBlock;
} block;
// читаем таблицу размещения настроек режимов
if (!GetMemBlock((ulong)WORK_MODE_TABLE_START_ADR, (uint)sizeof(sWorkModeSetBlock), block.byte))
{
// ошибка при чтении блока, аварийный выход
LCD_send(0x0E,'r',0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0,0);
return false;
}
// блок считался без ошибок, выбираем настройки режима
// заполняем рабочую структуру настроек
//копируем тип режима
workData.soundMode = block.modeSet[modeNum].soundMode;
// копируем настройки обязательного звука 1
msgBeep1Adr = block.msgAllEnd1Adr; // адресс начала звука "пик-пик" во флешке
msgBeep1DurationSempl = block.msgAllEnd1DurationSempl; // длительность "пик-пик" в семплах
msgBeep1DurationSec = block.msgAllEnd1DurationSec; // длительность "пик-пик" x100мс
Сообщение отредактировал IgorKossak - May 26 2015, 13:04
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!