PROGMEM в нужный адрес flash
- Войдите на сайт для отправки комментариев
Вс, 16/02/2020 - 14:17
PROGMEM в нужный адрес flash
Прошу, кто знает, подсказать.
Как при использовании макроса PROGMEM дать указание ( компилятору, компоновщику или еще кому надо ) указание по какому адресу FLASH все это расположить.
Пример
const byte data[] PROGMEM = {} ; // И расположить с адреса типа = 0x2000
За последние две недели Инет перерыл, ничего не нашел. Хотя в других языках для AVR это без проблем.
Ну на это можно только написать русский ответ : А нафига!!!
За последние две недели Инет перерыл, ничего не нашел.
2 минуты поиска в гугле
https://www.avrfreaks.net/forum/how-store-variable-progmem-particular-address
Ну на это можно только написать русский ответ : А нафига!!!
Да просто он не знает, как правильно, вот и ищет каких-то кривых путей. Сначала вопрос про #include файло .hhh, теперь это...
Обычно такие вопросы характерны для человека, который только вчера начал читать учебник по С... причем сразу с третьей части, пропустив основы, потому что они "скучные" :)
Дичь какая-то. Я ведь точно помню, что я выкладывал здесь на форуме готовое решение, но вот найти не могу. Не мог же кто-то удалить - не флуд, нормальный пост. Куда делось?
Вот, решение - у меня на диске осталось:
Но Вам бы лучше внимательно прочитать #1
Вот, решение - у меня на диске осталось:
Спасибо, есть теперь куда идти !
Обычно такие вопросы характерны для человека, который только вчера начал читать учебник по С... причем сразу с третьей части, пропустив основы, потому что они "скучные" :)
Интересно, где тот учебник, где все это написано. Ни про #include, ни про PROGMEM = подобного, что я спрашивал, ничего нет.
Вот простой пример. Обычная прикладная задача.
Программа работает по таблице, таблица более 2 000 байт. В процессе работы содержимое таблицы адаптируется к физическим характеристикам устройства. Обновленные значения таблицы надо пересохранить во FLASH. В разделе боотстропа есть функция, которая это умеет делать. НО надо чтобы и функция перезаписи и основная программа знали где храниться эта таблица, причем КРАТНО страницам записи во FLASH.
Интересно, где тот учебник, где все это написано. Ни про #include, ни про PROGMEM = подобного, что я спрашивал, ничего нет.
похоже что кто-то просто не умеет искать. Про фоеш я вам выше нашел за 2 минуты, идея там по ссылке та же, что у Евгения. Про инклюде вопрос просто, простите, идиотский, поэтому и найти ничего не могли. Любой программист знает, что расщирение файла помогает утилитам компилятора и линкера понимать, что с этими файлами делать. И даже если инклюд может работать с произвольными расширениями - файлы в проекте все равно НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ называть не абы как, а правильно - заголовочные .h. исходники на С -.с, исходники С++ - .срр и так далее.
А что касается вашей задачки - она решается влегкую добавлением внешней микрухи ЕЕПРОМ - любого размера. W25q на 4 мегабита (1 мегабайи емкости !) - стоит 20-25 рублей. А если вы начнете писать во ФЛЕШ во время работы программы - вы ее убьете почти мгновенно, у нее ресурс от 100 до 10К записей всего
А что касается вашей задачки - она решается влегкую добавлением внешней микрухи ЕЕПРОМ - любого размера. W25q на 4 мегабита (1 мегабайи емкости !) - стоит 20-25 рублей. А если вы начнете писать во ФЛЕШ во время работы программы - вы ее убьете почти мгновенно, у нее ресурс от 100 до 10К записей всего
За вашу ссылку Спасибо !
А про добавочную микруху - дело не в деньгах, могу сам подарить. Не понимаю, зачем еще что- то ставить, если ФЛЭШа завались. Итак работа на природе - 40 + 85 гр. + влажность и иней, питание скачет, электромагнитные помехи и т.п. = надежность и так падает, а тут еще лишнею микруху ставь только потому, что нет нужной директивы типа =
const MONTHS : array[1..12] of byte = (31,28,31,30,31,30,31,31,30,31,30,31); org 0x800;
// Средство от фирмы mikroe.com
Пишу на их продуктах, а тут вот пришлось писать на gcc сделанном для больших машин с другой архитектурой и как то привязанной к AVR.
Флеш может перезаписывать только загрузчик. Этот фокус не прокатит.
WASQ
дело не в отсуствии директивы, а в ограничении числа записей флеш-памяти. Она в принципе не предназначена для опетивного сохранения информации. Я повторяюсь - есть контроллеры, у которых ресурс флеш всего 100 записей. Не 100 тысяч - а только сотня
В вашем случае внешняя память - это не снижении надежности, а наоборот.
Флеш может перезаписывать только загрузчик. Этот фокус не прокатит.
Ну .. Ну..
У Вас может быть в загрузчике ( загрузчик СВОЙ, не для и не от avrdude ) = а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы. И это делается очень просто и она пишет во ФЛЭШ и обратно передается управление основной программе.
а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы.
Нельзя.
WASQ
а в ограничении числа записей флеш-памяти. Не 100 тысяч - а только сотня. В вашем случае внешняя память - это не снижении надежности, а наоборот.
Ок Спасибо !
Все таки, ФЛЭШ не ОЗУ и это понятно, 100 записей - было такое да ...давно, работал еще с однократными... Работа на ресурс 10 лет круглосуточно, в год на более 100 раз перезаписывать, всего 1000 раз. Современной ФЛЭШе по плечу. А иметь прозрачность/однозначность в написании = это приятно.
Флеш может перезаписывать только загрузчик. Этот фокус не прокатит.
чО??? делаш в области RWW махонькую працедурку типа:
asm spm
asm ret
и фсё, буит работать.
Нельзя.
в авр спорить не стану, но в СТМ точно можно, там ЕЕПРОМ эмулируется путем записи во флеш из пользовательского кода.
Нельзя.
в авр спорить не стану, но в СТМ точно можно, там ЕЕПРОМ эмулируется путем записи во флеш из пользовательского кода.
ПАТАМУШТА там EEPROM нету
AVR105: эффективное сохранение параметров в памяти FLASH
В даташите AVR105 рассматриваются вопросы хранения параметров в памяти FLASH:
Быстрое сохранение параметров
• Износостойкое хранение – до 350 тысяч циклов записи
• Эффективность хранения с точки зрения энергопотребления
• Хранение параметров произвольного размера
• Надежность хранения параметров
• Опциональная верификация записанных параметров
• Опциональное восстановление после сбоя питания
Встраиваемые системы (embedded) полагаются на использование параметров, которые могут сохранять свое значение между сбросами (RESET) и пропаданиями питания. В некоторых системах эта статическая информация используется для инициализации системы в корректное состояние в момент запуска (start-up), в других системах это используется для лога истории системы или для накопления данных. С этой целью можно использовать память EEPROM, однако её скорость не может сравниться со скоростью памяти FLASH, когда нужно в одно и то же время сохранить несколько байт.
Причина повышенной эффективности памяти FLASH для большого набора параметров в том, что может использоваться страничное программирование, которое сокращает время записи. Таким образом, время в пересчете на 1 байт получается меньше, чем для EEPROM, когда сохраняется набор параметров. В результате получается ускоренный метод сохранения, энергопотребление может быть уменьшено, так как больше времени микроконтроллер может провести в режиме сна (sleep mode). ………….
и много другихз хороших ПЛЮЩЕК
а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы.
Нельзя.
Хотя нет, оказывается можно.
а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы.
Нельзя.
Хотя нет, оказывается можно.
И даже совсем несложно.
И даже совсем несложно.
теперь бы разобрать, где там что и, как этим можно воспользоваться
а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы.
Нельзя.
Хотя нет, оказывается можно.
Ну надо же, как быстро переобулся пафос :))) Можно, всё можно. И год назад было можно, и два, и пять.
...и всю жизнь можно было - офигенно сложно додуматься. Сейчас вон оптибут есть с этими фишками - пиши куда хош.