Алгоритм поиска следующих данных в eeprom [закрыт]

У меня есть 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 при втором вызове.

Я был бы признателен за ваш вклад, который исправит мою ошибку.

Я не понимаю... Что если 0x02to 0x05имеет '1', а 0x06 имеет '0'... В этом случае вы хотите остановить сканирование и вернуться 0x02или продолжить сканирование до 0xFFи вернуть последнее появление такого условия?
.@Swanand Большое спасибо. В этом случае я хотел бы вернуть 0x02, и в следующий раз он должен сканировать с 0x06-0xff.
Этот вопрос кажется не по теме, потому что он касается программирования
@m.Alin Электронно стираемое программирование ПЗУ не связано с электроникой? Оооооооооооо... где ему тогда спросить? Как вы думаете, сколько программистов на SO вообще знают, что такое EEPROM? Я думаю, что этот вопрос совершенно по теме.
@Lundin Тот факт, что OP упомянул EEPROM, не имеет значения. Вопрос на самом деле об алгоритме программирования. Этот вопрос закрыт по уважительной причине.
@m.Alin Прежде всего, программирование микроконтроллеров встроенных систем всегда должно быть в теме на этом сайте. В сети SE нет более подходящего для этого сайта. Таким образом, закрывая такие вопросы, вы, по сути, говорите людям: «Убирайтесь, нам не нужны программисты прошивки в нашем сообществе».
@m.Alin Кроме того, когда дело доходит до конкретного случая EEPROM, я не думаю, что существует такая вещь, как чистый высокоуровневый алгоритм, полностью отдельный от аппаратного обеспечения. Вы всегда должны учитывать метод/время доступа, безопасность, сохранение данных, контрольные суммы и т. д. Кроме того, все переменные, связанные с чтением из EEPROM, должны быть энергозависимыми, что, вероятно, пропустит программист ПК.
Встроенное программирование @Lundin действительно здесь в теме, но, помимо чтения из EEPROM (что не является предметом вопроса), это чисто проблема кодирования. Таким образом, он лучше подходит для переполнения стека.
@clabacchio Значит, эту страницу нужно обновить? В нем конкретно говорится, что «написание прошивки для приложений с открытым исходным кодом или RTOS» относится к теме. В нем конкретно указано, что «Программное обеспечение для ПК» не по теме.
@Lundin оба утверждения верны, но это попадает в серую зону, поскольку речь идет о приложении, которое работает во встроенной системе. Просто для ответа на этот вопрос не требуется особых навыков ЭЭ, и, закрывая его, мы пытаемся показать пример того, что соответствует теме, а что нет.
@Lundin Просто замените слово «EEPROM» в этом вопросе, например, на «вектор». Сейчас это не имеет никакого отношения к электронике и прошивке, но это не меняет сути вопроса.

Ответы (2)

Вам нужно найти последовательные 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, имеет статическую продолжительность хранения. Его время жизни равно всему выполнению программы, а его сохраненное значение инициализируется только один раз перед запуском программы.

Убедитесь, что вы объявили эту переменную как «Unsigned Char», чтобы она не увеличивалась более чем на 0xFF и не менялась.
@Swanand Обычно это сработает, но это не гарантируется - гарантируется только то, что это не менее 8 бит. Иногда unsigned char > 8 бит (например, SHARC в AD). аналог.com/static/imported-files/software_manuals/…