Неверная длина файла eeprom или файл не найден

Обновлено: 04.07.2024

Проблема чтения EEPROM при записи скетча через программатор

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Столкнулся с такой проблемой. Есть простая программа (код ниже) для Ардутно Нано, светодиода и кнопки. Кнопкой можнго светодиод включить/выключить, при этом состояние светодиода (включен он или выключен) сохраняется в постоянноьй памяти. То есть, при пуске программы код перваым делом считывает значения ячейки из постояннолй памяти. Если порследний раз светодилж горел, то он при пуске зажжется, если не горел - то, естественно, нет.

Суть проблемы: При записи скетча через USB Нано все работает исправно. При записи через USBASP программатор программа не работает. Светодиод загорается сразу, на кнопку нет реакции.

Перед каждой загрузкой прораммы произвожу очистку EEPROM (для чистоты эксперимента) - поэтому при первом вклюяении (до нажатия кнопки) светодиод гореть не должен.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ДОПОЛНИТЕЛЬНО ВАЖНЫЙ МОМЕНТ

Если строку 25 закомментировать

25 // EEPROM.write(100, led_state);

то программа начинает исправно работать как при записи через порт USB Нано, так и через USBASP программатор. Только не будет происходить чтения записанного состояния светодиода.

Строка чтения EEPROM при записи скетча через программатор рушит программу. В чем может быть проблема?

Буду очень признателен за пормощь.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

andycat аватар

а я вроде вам писал уже . после 24 строки выведете в монитор порта состояние переменной led_state - хоть один раз ноль будет?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ЕвгенийП аватар

Очистка EEPROM делается вовсе не обязательно нулями, может быть 255. Так что напишите строку 24 по-человечески

И должно всё заработать.

И ещё, мужики, не бесите. Если Вам нужна помощь, то выкладывайте полный (от слова совсем полный) (не знаете что означает это слово - смотрите в словаре) код. Задолбали уже через одного - "я удалил то, что несущественно". Вот, блин, мы тут все такие умные - отлично знаем, что существенно, а что - нет, только две строчки отладить не можем :(

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Евгений, большое спасибо за дельный совет.

Я выложил полную программу. Внес изменения, все заработало. Через USBASP программатор пишется исправно. Только при первом после загрузки включении светодиод начинает сразу светиться.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

И ещё, мужики, не бесите. Если Вам нужна помощь, то выкладывайте полный (от слова совсем полный) (не знаете что означает это слово - смотрите в словаре) код. Задолбали уже через одного - "я удалил то, что несущественно". Вот, блин, мы тут все такие умные - отлично знаем, что существенно, а что - нет, только две строчки отладить не можем :(

Мсье знает толк.

Всетаки, кмк , best practice это когда выкладывается минимальный пример который воспроизводит проблему. Если проблема не воспроизводится на другом железе, тогда смотреть остальное.
А то читать простыню где идёт обращение к серверу, когда ошибка в при работе с EEPROM, так себе удовольствие.
Да, этот подход предполагает что код работы с сервером никак не затрагивает исправность работы с EEPROM.и вопрошающий помощи это понимает.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

andycat аватар

Евгений, большое спасибо за дельный совет.

Я выложил полную программу. Внес изменения, все заработало. Через USBASP программатор пишется исправно. Только при первом после загрузки включении светодиод начинает сразу светиться.

эх. нельзя намеками подсказывать - нужно конкретно решение всегда писать.

чтоб при старте всегда не горел светодиод - в setup в eeprom прописываете значение что светодиод не горит, и соотвественно led state 0 делаете

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Поясняю свои слова . Записываем программу в предварительно очищенную память через USB порт и через USBasp программатор.

При записи программы через USB порт светодиод посе заливки программы не загорается. При записи через программатор - всегда загорается.

В остальном все работает идентично

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

andycat аватар

а надо то как. чтоб горел или чтоб не горел при старте :) ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Не важно. Нужно, чтобы было одинаково, и понять, в чем была причина

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

andycat аватар

Не важно. Нужно, чтобы было одинаково, и понять, в чем была причина

"одинаково" с чем ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

при загрузке через USBASP программатор и через USB вход

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

andycat аватар

не, я тупой, нифига не понял. Какая хрен разница через что программировать - светодиод должен гореть или нет при старте? или запоминаться предыдущее состояние?

вот вам кусок из реальной программы включения реле в зависимости от последнего состояния, сделайте аналогично и будет вам счастье

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ЕвгенийП аватар

Я выложил полную программу.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ЕвгенийП аватар

Всетаки, кмк , best practice это когда выкладывается минимальный пример который воспроизводит проблему. Кто бы спорил, но только работающий пример. В данном же случае он даже не компилировался.
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ЕвгенийП аватар

Какая хрен разница через что программировать

Если в одном случае в настройках IDE стоит чистить епром, а в другом - нет (или наоборот), вот и разница. Он туда зафигачиает 255, а потом ТС (считая, что там 0) вычитает эту 255 из 1, считая, что инвертиирует.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ua6em аватар

Какая хрен разница через что программировать

Если в одном случае в настройках IDE стоит чистить епром, а в другом - нет (или наоборот), вот и разница. Он туда зафигачиает 255, а потом ТС (считая, что там 0) вычитает эту 255 из 1, считая, что инвертиирует.

А где это конфигурируется?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Виноват, опростоволосился. Пропустил первую строчку при копировании. Сейчас код полностью.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Прошиваю этот код через USB и через программатор. Через USB - Работает. Через программатор - нет. Совет Евгения П помогает.

Евгений, поясните пожалуйста, что Вы понимаете под настройками IDE (чистка епром)? Это настройки фьюзов? Перед прошивкой Нано через USB я сначала прошиваю загрузчик через прогррамматор (при этом он конфигурирует фьюзы).

Когда я пишу код через программатор загрузчик стирается, но конфигурация фьюзов меняться при этом не должна.

Я не очень силен в программировании, моэтому могу не совсем корпектно ставить вопросы. Прошу не судить строго.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

andycat аватар

Какая хрен разница через что программировать

Если в одном случае в настройках IDE стоит чистить епром, а в другом - нет (или наоборот), вот и разница. Он туда зафигачиает 255, а потом ТС (считая, что там 0) вычитает эту 255 из 1, считая, что инвертиирует.

Это понятно, мне не понятно что ТС хочет увидеть при старте.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ua6em аватар

Какая хрен разница через что программировать

Если в одном случае в настройках IDE стоит чистить епром, а в другом - нет (или наоборот), вот и разница. Он туда зафигачиает 255, а потом ТС (считая, что там 0) вычитает эту 255 из 1, считая, что инвертиирует.

Это понятно, мне не понятно что ТС хочет увидеть при старте.

Одинаковости поведения девайса при любом способе прошивки

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Прошивка МК должна приравниваться к аварийной ситуации в которой содержание EEPROM было утеряно или искажено. При этом приводится в действие план "Б", при котором самой прошивкой в долговременную память записываются корректные дефолтные данные и, при необходимости, об этом сообщается пользователю. Теряете при замене прошивки EEPROM МК - пишите во внешнюю память, которую ни один прошивальщик не достает физически. Не надейтесь на то, что IDE никогда не будет запускать дудку без опций полной зачистки МК - это сэкономит кучу нервов и времени.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Господа, есть пример кода с корректировкой от Евгения П Возьмём его за основу и записываем 2 способами Через USB и через программатор в ардуино Нано. Эксперимент проводим одинаково. Сначала прошиваем загрузчик. Потом в примерах IDE запускаем программу ЕЕPROM clear. Чтобы в еепром были нули. Это подготовка. Далее прошиваем код. При прошивке через USB при старте светодиод не горит. Понятно почему. В ячейках еепром прописан 0

После аналогичной подготовки пишем через программатор. При этом загрузчик старается. После записи и пуска программы светодиод загорается. Почем? В еепром были предварительно прописаны нули.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

andriano аватар

Насколько мне известно, при "стирании" в EEPROM записывается 255, а не 0. Соответственно, если хотите, чтобы работа программы не зависела от способа прошивки, минимум, надо писать 255.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

andycat аватар

Господа, есть пример кода с корректировкой от Евгения П Возьмём его за основу и записываем 2 способами Через USB и через программатор в ардуино Нано. Эксперимент проводим одинаково. Сначала прошиваем загрузчик. Потом в примерах IDE запускаем программу ЕЕPROM clear. Чтобы в еепром были нули. Это подготовка. Далее прошиваем код. При прошивке через USB при старте светодиод не горит. Понятно почему. В ячейках еепром прописан 0

После аналогичной подготовки пишем через программатор. При этом загрузчик старается. После записи и пуска программы светодиод загорается. Почем? В еепром были предварительно прописаны нули.

Я же вам готовый пример привел, если меняется МК или обнуляется eeprom - светодиод никогда при старте не загорится - что ещё не так?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ЕвгенийП аватар

После аналогичной подготовки пишем через программатор. При этом загрузчик старается. После записи и пуска программы светодиод загорается. Почем? В еепром были предварительно прописаны нули.

Ну, напечатайте Вы, наконец, содержимое епрома и убедитесь, что нету там нулей, потому и загорается. Просто напечатайте и посмотрите.

Ваш фраза "пишем через программатор" ни о чём без параметров avrdude

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вводная

"When the -U option with flash memory is specified, avrdude will perform a chip erase before starting any of the programming operations, since it generally is a mistake to program the flash without performing an erase first. . This will reset the contents of the flash ROM and EEPROM to the value `0xff' , and clear all lock bits."

-D Disable auto erase for flash. When the -U option with flash memory is specified, avrdude will perform a chip erase before starting any of the programming operations, since it generally is a mistake to program the flash without performing an erase first. This option disables that. Auto erase is not used for ATxmega devices as these devices can use page erase before writing each page so no explicit chip erase is required. Note however that any page not affected by the current operation will retain its previous contents.

В этом материале мы рассмотрим возможные проблемы при работе с EEPROM. Часть из них связана с аппаратным стороной микроконтроллера, такие как повреждение EEPROM при пониженном напряжении питания и ограниченный ресурс EEPROM, а часть с программным обеспечением, например, при использовании EEPROM в прерываниях. Также рассмотрим способы решения этих проблем и методы повышения надежности хранения данных в EEPROM.

Одна из старых проблем AVR - это повреждение EEPROM данных при пониженном питании микроконтроллера. Это может происходить в двух случаях:

- Если напряжение питания ниже определенной величины, запись в EEPROM будет выполняться некорректно.
- При пониженном напряжении питания микроконтроллер сам может выполнять команды некорректно.

Этих повреждений EEPROM данных можно избежать, соблюдая следующие рекомендации:

- Нужно удерживать микроконтроллер AVR в состоянии сброса, если напряжение питания находится ниже нормы. Для этого можно использовать внешние супервизоры питания или встроенный детектор пониженного питания - Brown-out Detector (BOD). Встроенный детектор управляется с помощью fuse битов микроконтроллера - BODEN и BODLEVEL. BODEN - разрешает/запрещает работу детектора, а BODLEVEL - определяет его уровень срабатывания.
Если сброс микроконтроллера происходит во время процесса записи в EEPROM, то операция записи будет завершена только при достаточном уровне напряжения.

- Также в многие разработчике рекомендуют не использовать 0-ую ячейку EEPROM`a, поскольку именно ее содержимое чаще всего повреждается при снижении питания микроконтроллера.

Операция записи в EEPROM состоит из нескольких шагов. Вспомним эту последовательность:

1. Ожидаем готовности EEPROM, опрашивая бит EEWE регистра EECR.
2. Устанавливаем адрес в регистре EEAR.
3. Записываем байт данных в регистр EEDR.
4. Устанавливаем основной флаг разрешения записи EEMWE регистра EECE
5. Устанавливаем флаг разрешения записи EEWE регистра EECE

Бит EEWE должен быть установлен в течении 4-ех тактов после установки бита EEMWE. Если этого не произойдет по причине прерываний, то запись в EEPROM не будет произведена. Этого легко избежать, если запретить прерывания перед 4-м шагом, а после 5-го снова разрешить их.

Однако есть еще один подводный камень. Если прерывание возникло после 1-го, 2-го или 3-го шага, и в прерывании тоже используются операции с EEPROM (чтение или запись), то запись может не состояться, или запишутся не те данные и не туда, потому что содержимое регистров EEAR (адрес) и EEDR (данные) будет изменено.

Описанное выше касается и процедуры чтения EEPROM.

Лечить это можно следующими способами:

- Не использовать операции чтения и записи EEPROM в прерываниях.
Это особенно касается операции записи, потому что она медленная и выполняется с использованием внутреннего RC генератора. Например, для mega16 в даташите указано, что при записи в EEPROM используется внутренний RC генератор с частотой 1 МГц (независимо от установок fuse битов CKSEL) и время записи составляет 8.5 мс. Для прерывания это очень долго.

- Запрещать прерывания на время всей процедуры записи (чтения) EEPROM, то есть в самом начале.

- Сохранять в начале обработчика прерывания содержимое регистров EEAR (адрес) и EEDR (данные), а перед выходом восстанавливать их.

- Использовать флаги (семафоры) для сигнализации о выполнении работы с EEPROM.
Перед выполнением записи в основном цикле программы (или задаче, если используется ос) устанавливать программный флаг, а в прерывании (или другой задаче) проверять его.

EEPROM имеет ограниченный ресурс. Atmel гарантирует, что количество циклов перезаписи EEPROM составляет не меньше 100000. Цифра довольно большая, однако и она может быть достигнута, если записывать в EEPROM часто и на протяжении долгого времени.
Есть два приема по "увеличению" ресурса EEPROM.
Первый - простой и состоит в том, чтобы записывать в EEPROM данные, только если они изменили свое значение.

Второй- хитрый и состоит в том, чтобы хранить данные не в одной ячейки памяти (или группе ячеек, если речь идет о многобайтных переменных), а в нескольких, и записывать в них по очереди.
Допустим, нам нужно хранить в EEPROM один байт. Выделяем под него 8 байтов и каждый раз записываем в следующую ячейку, когда доходим до последней ячейки, то записываем в первую. И так по кругу, как в кольцевом буфере. Если каждая ячейка EEPROM имеет ресурс 100000, то записывая в 8 ячеек по очереди, мы получаем ресурс перезаписи байта 800000.

Переменные, которые объявлены, но не используются, часто удаляются компилятором в процессе оптимизации. Если такие переменные нужны, перед ними следует добавлять ключевое слово volatile.

Если используются свои функции для работы с EEPROM, то могут возникнуть проблемы при высоких уровнях оптимизации компилятора. Компилятор может объединить одинаковые (с его точки зрения) части кода в одну подпрограмму и нарушить логику работы вашей функции. Чтобы этого не происходило нужно или запрещать оптимизацию данной функции, или отключать перекрестную оптимизацию (cross call optimization) для функции или файла. Как это делается зависит от компилятора. Как правило, для этого существуют определенные ключи и прагмы.

Один из простых способов повышения надежности хранения данных в EEPROM - это метод мажоритарного резервирования. Суть метода заключается в том, что для хранения данных выделяется нечетное количество ячеек памяти - N. При сохранении данных - запись производится во все выделенные ячейки. При чтении - читаются тоже все, но решение относительно содержимого принимается на основе равенства (N+1)/2 ячеек.

Рассмотрим пример тройного мажоритарного резервирования байта данных. Для сохранения байта используются три байта EEPROM, а решение о содержимом принимается на основании равенства 2 байтов. Код приведен для компилятора IAR AVR.

В случае повреждения одной из ячеек или неудачной записи в одну из них, такой метод поможет избежать ошибки. Но если неправильное значение запишется в две ячейки, то прочитанные данные будут неверными.

Другой метод повышения надежности хранимых данных состоит в использовании контрольных сумм, например CRC. Я не использовал этот метод в своей практике, поэтому о нем мало чего могу сказать.

  1. Out of memory (выход за границы памяти) Компилятору не хватает памяти. Имеется ряд возможных решений этой проблемы:

  • Если в опции COMPILE/DESTINATION установлено значение MEMORY, замените эту опцию на DISK.
  • Если в опции OPTIONS/COMPILER/LINK установлено значение MEMORY, замените эту опцию на DISK.
  • Если Вы используете постоянно помещенные в память (резидентные) обслуживающие программы, такие как WINDOWS, SIDEKICK, NORTON
    удалите их из памяти.
  • Если Вы используете интегрированную среду TURBO.EXE, то попробуйте воспользоваться компилятором ТРС.ЕХЕ, он занимает меньше памяти.
  • Если ни одна из рекомендаций не помогает, то, возможно, Ваша программа просто слишком велика, чтобы компилировать ее в таком объеме памяти. В этом случае Вы должны разбить её на два или более модулей.

  • Ваш исходный файл закончился перед последним END основного раздела< операторов. Вероятно, в Вашей программе неодинаковое количество операторов BEGIN и END.
  • Включаемый файл заканчивается в середине раздела операторов. Каждый раздел операторов должен целиком помещаться в одном файле.
  • Вы не закончили комментарий.

  • Несовместимые типы переменной и выражения в операторе присваивания.
  • Несовместимые типы фактического и формального параметров в обращении к процедуре или функции.
  • Тип выражения несовместим с типом индекса при индексировании массива.
  • Несовместимые типы операндов в выражении.

  • Данный идентификатор получил тип PUBLIC, с помощью соответствующей директивы языка ассемблер, но не соответствует описанию EXTERNAL в программе или программном модуле Паскаля.
  • Две или более директивы PUBLIC языка ассемблер определяют один и тот же идентификатор.
  • Файлы .obj определяют символы PUBLIC, не находящиеся в сегменте CODE.

  • Программа на ассемблере ссылается с помощью директивы ETRN на идентификатор, который не описан в программе на Паскале и не был описан в интерфейсных секциях используемых программных модулей.
  • Ассемблерная программа ссылается на идентификатор, обозначающий абсолютную переменную (т.е. определённую словом ABSOLUTE).
  • Ассемблерная программа ссылается на идентификатор процедуры или функции типа INLINE.

  • Были описаны процедура или функция в интерфейсной секции программного модуля, но их определение отсутствует в секции реализации.
  • Процедуры или функции были описаны с помощью опережающего описания, но их определение не найдено.

  • Попытка разместить в памяти, занимаемой некоторой переменной, значение выражения другого типа в случае, когда размер размещаемого значения не равен размеру переменной.
  • Вы пытаетесь осуществить преобразование типа выражения, когда разрешается только ссылка на переменную, процедуру или функцию.

  • Процедуры READ и READLN могут считывать переменные символьного, целого, действительного и строкового типа.
  • Процедуры WRITE и WRITELN могут выводить переменные символьного, целого, действительного, логического и строкового типа.

  • Вы пытаетесь указать индекс массива, выходящий за его границы.
  • Вы пытаетесь присвоить переменной значение, выходящее за границы, допустимые для типа этой переменной.
  • Вы пытаетесь передать в качестве фактического параметра процедуре или функции константу, выходящую за границы, допустимые для типа соответствующего формального параметра.

  • Общий размер глобальных переменных, описанных в программе или программном модуле, не может превышать 64 Кбайт.
  • Размер локальных переменных, описанных в программе или функции, не может превышать 64 Кбайт.

  • Вы пытаетесь индексировать переменную, которая не является массивом.
  • Вы пытаетесь указать поля в переменной, которая не является записью.
  • Вы пытаетесь использовать в качестве указателя переменную, которая не является указателем.

  • Заголовок процедуры или функции, указанный в интерфейсной секции, не соответствует заголовку в исполняемой части.
  • Заголовок процедуры или функции, указанный с помощью опережающего описания (FORWARD), не соответствует заголовку найденной далее одноименной процедуры или функции.

Ошибки ввода-вывода вызывают завершение выполнения программы в случае, если оператор ввода-вывода был скомпилирован в режиме . В режиме продолжается выполнение программы, а ошибка возвращается функцией IORESULT. Коды ошибок 1-99 соответствуют кодам ошибок ДОС. 100-149 - ошибкам ввода вывода, 150-199 - критическим ошибкам, а 200-255 - фатальным ошибкам.

Если один из операторов компилируется с директивой , то ошибка ввода-вывода приводит к прекращению выполнения программы. В состоянии программа продолжает выполняться, а ошибка возвращается функцией IORESULT.

  • Индексное выражение массива находилось вне допустимого диапазона.
  • Была осуществлена попытка присвоить переменной значение, находящееся вне диапазона переменной.
  • Была осуществлена попытка передать значение, находящееся вне допустимого диапазона, в качестве параметра процедуре или функции.

  • Аргумент функции TRUNC или ROUND не может быть преобразован в целое число, находящееся внутри диапазона типа LONGINT (от -2147483648 до +2147483647).
  • Отрицательный аргумент функции SQRT (извлечение квадратного корня).
  • Аргумент функции LN (логарифм) равен нулю или имеет отрицательное значение.
  • Произошло переполнение стека сопроцессора.

Искал информацию по fat8 и нихрена не нашел.
Никаких фрагментаций,каталогов,кластеров,секторов,атрибутов,зугрузоч ных областей,прав доступа и подобной лабуды не нужно. Имя файла может быть его номером, символ начала, контрольной суммы и конца. Но так получается как на ленте а это шляпа.
Может существуют готовые крайне простые реализации на таблице, с файлами переменной длины.

Сделать по стандартному - каждому блоку(8 байт), идущим по порядку с определённого места, соответствует свой байт в начале памяти, который является номером этого блока. Если файл не влазит в блок то в байте, что ему соответствует записан номер следующего блока, занятого файлом. пустой блок 0, последний ff. Имя файла,длина,xor в первом блоке.
По другому, трехбайтовая таблиц, первый - имя, второй и третий - адрес в памяти где начинается файл. Если он состоит из фрагментов, в хвосте указатель на начало следующего. Конец - указатель на первый байт(номер) из таблицы.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Файловая система для SPI FLASH
Ищу файловую систему для SPI FLASH. Набрёл на SPIFFS. Кто нибудь пробовал применить в своих.

Файловая система Смарт карты, как создать?
Есть на форуме кто то кто создавал файловую систему на &quot;пустой&quot; карте? В какой момент она.

STM32. файловая система FatFS для USB и SD
Получится ли в одном проекте для STM32F4 под управлением FriiRTOS заставить работать FatFS для USB.


Журналируемая файловая система для одного сектора встроенного flash
Приветствую! Наступила весна, настало время велосипедов. Имеется STM32F4. Имеется сектор flash в.

Может структура ROM-диска любительского компьютера Орион-128 подойдёт?
Заголовок файла длинной 16 байт, первые 8 байт - имя файла, затем стартовый адрес, длинна и флаги - исполняемый, командный, текстовый, а так-же защита от записи/удаления. Чтение каталога осуществляется простым перескакиванием через длинну файла, так же файлы могут быть сегментированны, путём добавления номера сегмента в область флагов заголовка.

Не, так слишком жирно. avr328 ровно 1к памяти. 896 байт с конца, это 112 блоков по 8 байт. Выше еще 112 однобайтовых указателей, и в самом верху остаётся 16 байт на дополнительное добро.
Тот кусок 16 байт что в самом начале eeprom это 128бит,112 из которых можно пустить на пометку начал файлов. Верхние 2 байта на описание диска и какой нибудь лог вроде последнего доступа и результата. На буниге 32x32 клеток всё выглядит ровно.

Теперь осталось рационально распределить по этим местам имя файла, контрольную сумму и длину.

Читайте также: