Как сделать так, чтобы фрагмент кода запускался только один раз за время существования программы? Его можно выключить и включить много раз. Единственная возможность снова запустить фрагмент кода - это снова мигать.
Код - это раздел калибровки, который я не хочу запускать снова. Если я использую EEPROM или Flash, мы установим для флага значение true или false. Итак, когда мы впервые прочитаем эту область памяти, что будет случайным значением в этой области памяти?
Каков наилучший способ реализовать это во встроенном Си?
microcontroller
c
embedded
ganeshredcobra
источник
источник
Ответы:
Ваш микроконтроллер может иметь EEPROM, память OTP, биты пользовательских предохранителей, где вы можете установить флаг.
Не существует «лучшего метода во встроенном C», запись энергонезависимой памяти различна в каждом микроконтроллере.
редактировать:
ВСПЫШКА
Содержимое флэш-памяти стирается при программировании устройства. После программирования все не записанные байты содержат 0xFF. Обратитесь к таблице данных, чтобы найти область, которая может быть безопасно запрограммирована из запущенной прошивки.
EEPROM
Хотя это не гарантируется в таблицах данных, все EEPROM, которые я видел до сих пор, содержали 0xFF: s при поставке с завода (кроме тех, которые запрограммированы с уникальным MAC-адресом, но это явно задокументировано). Некоторые устройства программирования / программы также могут стирать или программировать содержимое EEPROM. Некоторые могут быть защищены от записи, постоянно или обратимо.
OTP
Программируемая однократная память всегда содержит четко определенные начальные значения, документированные в таблице данных.
Всегда полезно включать в записанные данные хорошую контрольную сумму, такую как CRC32, для защиты от повреждения данных, вызванного неисправными деталями, ошибками передачи, космическими лучами и т. Д.
источник
Вы сказали:
Другие говорят, что используют EEPROM для хранения флага, чтобы указать, когда была запущена функция run_once (). Однако у этого есть недостаток, заключающийся в том, что если вы перепрошиваете микроконтроллер, флаг ran_it_once в EEPROM уже установлен, и функция run_once () не будет выполнена. Если ваш микроконтроллер имеет встроенную ЭСППЗУ, возможно, можно сбросить флаг ran_it_once при перепрошивке микроконтроллера, если программист поддерживает это.
Лучший способ - иметь номера версий как в EEPROM, так и в коде. Когда код запускается при включении питания, он должен прочитать номер версии из EEPROM и сравнить его с номером версии, хранящимся в коде. Если они не совпадают, то вызывается функция run_once (), и последним действием кода run_once () является запись номера версии прошивки в EEPROM. Каждый раз, когда вы изменяете исходный код прошивки, вы должны увеличивать номер версии, встроенный в него.
источник
Выберите микроконтроллер, который может записывать / стирать собственную память программы. После выполнения рассматриваемого кода попросите последнюю часть указанного кода заменить первую инструкцию переходом, который ее обходит. При желании вы также можете стереть оставшуюся часть (возможно, заменить на nop), так что вероятность того, что она когда-либо снова будет выполнена, абсолютно отсутствует.
Это сообщение самоуничтожится в 5..4 ...
источник
Поскольку вы используете этот код для калибровки, я бы предложил создать процесс взрыва, который запускает код калибровки в качестве первого этапа и даже не помещать его в готовую рабочую версию платы. Это похоже на ответ от apalopohapa, за исключением того, что у вас будет две отдельные загрузки программы: начните процесс загрузки, который мигает при первой загрузке программы, которая выполняет все калибровки и выплевывает данные из этого. Затем возьмите эти данные и включите их в данные второй загрузки программы.
Одним из преимуществ этого подхода является то, что вы абсолютно минимизируете необходимый объем дискового пространства - вам не нужно хранить только один код, а только данные, которые он генерирует. Имея процесс взрыва, который загружает две отдельные программы, вы также немного изолируете себя от ошибок в коде инициализации, которые в противном случае могут остаться. У вас также есть некоторая дополнительная гибкость, если вы хотите перезапустить свой калибровочный код: вместо того, чтобы писать дополнительный код, чтобы очистить любой бит, обозначающий, что ваш код был запущен (который может быть случайно уже очищен), вы просто перезапускаете свой код. процесс взрыва.
источник