У меня есть EEPROM, и я храню в нем данные, от адреса 0x00
до 0xff
. Мне приходится регулярно сканировать EEPROM на наличие ненулевых значений.
например:
address 0x00 0x01 0x02 0x03 0x04......0x0A 0x0B 0x0C.........0xFF
values 0 0 1 1 0 0 1 0 0
Если я выполняю функцию сканирования, чтобы найти первый адрес значения, я могу это сделать. Но как мне обойти первый обнаруженный адрес ( 0x02
) и найти следующий адрес во втором вызове функции?
Примечание . Если мы встретили более одной последовательной единицы, то берется первый адрес ( 0x02
).
Я буду очень рад, если вы предоставите какую-то технику для решения этой проблемы.
int scaneeprom(void)
{ static unsigned int x,
static unsigned int counter;
for(i=0+counter; i<255;i++)
{
while((eepromread(i++)!)==0)
{
x=i;
counter++;
}
return(i);
}
Это предполагает сканирование с 0x04-0xff при втором вызове.
Я был бы признателен за ваш вклад, который исправит мою ошибку.
Вам нужно найти последовательные 1 и остановиться, как только вы его найдете. В вашем текущем коде вы читаете всю EEPROM, даже если вы найдете требуемое условие.
Основной алгоритм будет:
1.Начать с последнего адреса.
2.Чтение ЭСППЗУ. Увеличьте счетчик, если вы найдете 1, и сбросьте его, если найдете 0.
3. Во время этого чтения, если ваш счетчик когда-либо превысит 2, сохраните это местоположение как «последний адрес» и остановите поиск.
Неоптимизированный код будет:
unsigned char Eepromscan(void)
{
unsigned char loopcnt = 0;
unsigned char onecount = 0;
unsigned char addr = 0; //We will store start address of 1's here
static unsigned char lastAddr = 0;
//If lastAddr is already overflowing, reset it
if(lastAddr >= 0xFF)
{
lastAddr = 0;
}
for(loopcnt = lastAddr; loopcnt < 0xFF; loopcnt++)
{
addr = loopcnt; //This is start location of our scanning
while(eepromread(loopcnt++) != 0)
{
onecount++; //Count the 1's we got!
}
if(onecount > 1)
{
//There are multiple 1s... WooHoo!
// And These 1s start at "addr" and end at current location "loopcnt"
lastAddr = loopcnt; //Next time,We will start scanning from here.
break;
}
}
return addr;
}
Это грубый код. Есть много мест для улучшения, плюс вы должны обрабатывать такие условия, как если бы во всей EEPROM не было последовательных единиц. или Что делать, если вы хотите начать сканирование с самого начала, когда вы достигнете 0xFF, не найдя последовательных единиц.
PS В этом коде есть ошибки, и мы ожидаем, что вы найдете эти условия и устраните их.
В C вы можете использовать переменную, объявленную как « статическая », которая будет инициализирована до «0» кодом запуска. Ниже приведены цитаты из стандарта ISO/IEC 9899:1999 (E).
Все объекты со статической продолжительностью хранения должны быть инициализированы (установлены их начальные значения) перед запуском программы.
Также гарантируется сохранение своего значения между вызовами.
3 Объект, идентификатор которого объявлен с внешней или внутренней связью или со спецификатором класса хранения static, имеет статическую продолжительность хранения. Его время жизни равно всему выполнению программы, а его сохраненное значение инициализируется только один раз перед запуском программы.
Свананд
0x02
to0x05
имеет '1', а 0x06 имеет '0'... В этом случае вы хотите остановить сканирование и вернуться0x02
или продолжить сканирование до0xFF
и вернуть последнее появление такого условия?Новичок91
м.Алинь
Лундин
м.Алинь
Лундин
Лундин
клабаккио
Лундин
клабаккио
м.Алинь