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

093

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный
  1. k155la3, раз размер массива равен размеру страницы - получится такое же кол-во циклов стирания, как и в случае отсутствия массива и записи байт за байтом. Мы же не можем не стирать :)
  2. k155la3, если ресурс рассчитывается в количестве циклов стирания - то алгоритм из первого поста никак не поможет продлить ресурс. Точно также можно и записывать по одному байту, а не целой страницей, при этом стирать страницами.
  3. jcxz, ага, понятно. Значит суть того алгоритма записи, что в первом посте только в экономии энергии. Спасибо всем!
  4. k155la3, что есть цикл записи/стирания flash памяти? Стёрли всю страницу и записали всю страницу? Или стёрли всю страницу и записали 1 байт тоже считается за цикл?
  5. Привет! Нашел в одном проекте любопытную организацию записи во flash: держим в ram массив размеров FLASH_PAGE_SIZE и как только он заполнится - записываем одним большим куском во flash. Абсолютно не понимаю зачем так сделано, можно же по несколько байт записывать - и программа будет более равномерно выполняться, да и так проще гораздо. Единственная версия - это чтобы изменять несколько байт во flash и не затрагивать все остальные, но в коде такое нигде не используется. Может быть автор хотел так сэкономить ресурс? Но разве это повлияет на ресурс памяти? Ммм! А можно ли объявить массив вот так: __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 Вот с определение сегмента как раз и проблема: линкер игнорирует этот сегмент. //В 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: PMMCTL0 |= PMMSWBOR; Вход в BSL при этом не будет происходить, регистры обнулятся.
  11. Кто вам это сказал? Не надо додумывать. Нет на той вкладке такой опции. Можно только через командную строку задать. Вообще такой способ довольно плох тем, что будем ограничены парой секторов, а если прошивка больше занимает? Как задать специальный маркер из нескольких байт сразу после 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 байт, который нигде больше не встречается? Какие для этого используются директивы?
×
×
  • Создать...