Перейти к содержанию

093

Участник
  • Публикаций

    13
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. k155la3, раз размер массива равен размеру страницы - получится такое же кол-во циклов стирания, как и в случае отсутствия массива и записи байт за байтом. Мы же не можем не стирать
  2. k155la3, если ресурс рассчитывается в количестве циклов стирания - то алгоритм из первого поста никак не поможет продлить ресурс. Точно также можно и записывать по одному байту, а не целой страницей, при этом стирать страницами.
  3. jcxz, ага, понятно. Значит суть того алгоритма записи, что в первом посте только в экономии энергии. Спасибо всем!
  4. k155la3, что есть цикл записи/стирания flash памяти? Стёрли всю страницу и записали всю страницу? Или стёрли всю страницу и записали 1 байт тоже считается за цикл?
  5. Привет! Нашел в одном проекте любопытную организацию записи во flash: держим в ram массив размеров FLASH_PAGE_SIZE и как только он заполнится - записываем одним большим куском во flash. Абсолютно не понимаю зачем так сделано, можно же по несколько байт записывать - и программа будет более равномерно выполняться, да и так проще гораздо. Единственная версия - это чтобы изменять несколько байт во flash и не затрагивать все остальные, но в коде такое нигде не используется. Может быть автор хотел так сэкономить ресурс? Но разве это повлияет на ресурс памяти? PS: Начинаю догадываться, что такая хитрая запись сделана для экономии электроэнергии, но в данном случае о ней речи не идет, видимо из другого проекта перенесена. Ммм! А можно ли объявить массив вот так: Код__root const unsigned char place_for_archive[2048] @ 0x20000; //20000 - в начало страницы И далее читать/записывать flash память, взяв указатель от place_for_archive? Только как бы его в начало страницы поместить? Это же поможет избежать ситуацию, когда код программы разрастется и наедет на ту область flash памяти, в которую пишем некий архив событий По идеи линкер нас об этом предупредит.
  6. Интересно, как правильно выбрать значения маркеров конца/начала прошивки так, чтобы эти маркеры с наименьшей вероятностью встретились в самой прошивке?
  7. Ну что же, с маркерами разобрались, осталось разобраться с расчетом CRC: Возможно ли как-то не вручную узнать адреса сегментов, чтобы указать в параметре range откуда начать расчет CRC и где закончить? Что-то вроде: считаем от START_MARKER до END_MARKER. Можно конечно объявлять адреса явно, но это не удобно. Добавил: Впрочем, вот с такими настройками CRC считается там где надо Код-J2,crc16={CODE}
  8. jcxz, Ларчик просто открывался! Компилятор игнорил и переменную и сегмент - т.к. переменная нигде в коде не использовалась. Спасибо! Я так и не вспомнил про это.
  9. Obam, проц MSP430F5418A и MSP430F5438A Цитата(k155la3 @ Sep 15 2017, 02:00) В файле линкера определите свой сегмент, расположенный за сегментом CODE (CONST идет в начале флеш) и пользуйте его через Если разберетесь - поделитесь Вот с определение сегмента как раз и проблема: линкер игнорирует этот сегмент. Код//В main.c const int MyVar[] @ "MYSEGMENTA" = {0x55AA, 0xAA55}; Код// --------------------------- // Constant data // -Z(CONST)DATA20_C,DATA20_ID,CODE_ID=5C08-FF7F,10040-25BEF //Объявляю сегмент: -Z(CONST)MYSEGMENTA=25BF0-25BFF В map файле нет этого сегмента и никаких ошибок тоже нет: КодSEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN =======              =====    =============   ===========     ====  ====  ===== DATA16_AN                              0102 - 0103               2   rel    0 .... .... CODE_I                                    1C00                       rel    1 DATA20_I                               1C00 - 1C40              41   rel    1 DATA20_Z                               1C42 - 22B5             674   rel    1 DATA20_N                                  22B6                       rel    1 DATA20_HEAP                            22B6 - 2305              50   rel    1 CSTACK                                 5B60 - 5BFF              A0   rel    1 CSTART                                 5C08 - 5C37              30   rel    1 ISR_CODE                               5C38 - 5E0B             1D4   rel    1 <CODE> 1                               5E0C - EFF9            91EE   rel    1 INTVEC                                 FF80 - FFF3              74   com    1 RESET                                  FFFE - FFFF               2   rel    1 DATA20_C                           00010040 - 00012337        22F8   rel    1 DATA20_ID                          00012338 - 00012378          41   rel    1 CODE_ID                                 0001237A                     rel    1
  10. Программный рестарт MSP430F5438A

    Вот такой способ работает на MSP430F5438A: КодPMMCTL0 |= PMMSWBOR; Вход в BSL при этом не будет происходить, регистры обнулятся.
  11. Цитатачто будет если попытаться записать (с предварительным стиранием) что-либо сразу после последнего байта программы без учёта границ секторов Кто вам это сказал? Не надо додумывать. Цитатана вкладке опций проекта посвящённой расчёту CRC указать границы этой области Нет на той вкладке такой опции. Можно только через командную строку задать. Вообще такой способ довольно плох тем, что будем ограничены парой секторов, а если прошивка больше занимает? Как задать специальный маркер из нескольких байт сразу после CODE и CONST memory? Это бы решило сразу пару проблем.
  12. ЦитатаКто-ж пишет в тот-же сектор, в котором лежит прошивка??? И как собственно Вы это умудряетесь делать, ведь для этого его надо предварительно стереть? Легко - прошивка занимает лишь 10% свободной памяти. Остальной flash - под запись архивов. Почитал доку на линкер и так и не понял как задать расчет CRC только по блоку CODE. С параметрами: -HFF -J2,crc16={CODE} Получаю: Error[e171]: The segment "CODE" that is used in a checksum command is a packed segment. Хотя не ясно - что ему мешает так рассчитать CRC. "Промежутки" в секции где вектора прерываний заполнили, бери да считай, тем более размер блока известен. Возникают даже мысли написать свой велосипед на сях, который будет рассчитывать и вставлять CRC, а также размер блока по которому его считают.
  13. Приветствую! Подскажите пожалуйста: 1) Есть ли возможность в IAR настроить расчет CRC не для всей области памяти, как это делается по умолчанию путем предварительного заполнения неиспользуемой памяти значениями 0xFF, а только для той, где лежит программа? Ведь в процессе работы содержимое flash может изменяться (например, записали туда какие-то настройки) и CRC уже не совпадет. 2) Допустим генерацию CRC настроили как надо, но как определить по какому объему данных рассчитывать CRC? Может быть можно настроить линкер так, чтобы перед кодом программы он вставил размер прошивки (4 байта) или в конец программы специальный маркер из 4...8 байт, который нигде больше не встречается? Какие для этого используются директивы?