PROGMEM в нужный адрес flash

wasq
Offline
Зарегистрирован: 26.05.2018

PROGMEM в нужный адрес flash

Прошу, кто знает, подсказать.

Как при использовании макроса PROGMEM дать указание ( компилятору, компоновщику или еще кому надо ) указание по какому адресу FLASH все это расположить.

Пример

const byte data[] PROGMEM = {} ; // И расположить с адреса типа = 0x2000

За последние две недели Инет перерыл, ничего не нашел. Хотя в других языках для AVR это без проблем.

 

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну на это можно только написать русский ответ : А нафига!!!

b707
Онлайн
Зарегистрирован: 26.05.2017

wasq пишет:

За последние две недели Инет перерыл, ничего не нашел.

2 минуты поиска в гугле

https://www.avrfreaks.net/forum/how-store-variable-progmem-particular-address

b707
Онлайн
Зарегистрирован: 26.05.2017

qwone пишет:

Ну на это можно только написать русский ответ : А нафига!!!

Да просто он не знает, как правильно, вот и ищет каких-то кривых путей. Сначала вопрос про #include файло .hhh, теперь это...

Обычно такие вопросы характерны для человека, который только вчера начал читать учебник по С... причем сразу с третьей части, пропустив основы, потому что они "скучные" :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Дичь какая-то. Я ведь точно помню, что я выкладывал здесь на форуме готовое решение, но вот найти не могу. Не мог же кто-то удалить - не флуд, нормальный пост. Куда делось?

Вот, решение - у меня на диске осталось:

//
// Размещение массивов с адресов кратных 0х100
//
#define	Align100	__attribute__ ((aligned (0x100)))
const char array1[] PROGMEM Align100 = "String 1";
const char array2[] PROGMEM Align100 = "String 1";


void setup(void) {
	Serial.begin(57600);
	Serial.print("Address of array1: 0x");
	Serial.println((uint16_t) array1, HEX);
	Serial.print("Address of array2: 0x");
	Serial.println((uint16_t) array2, HEX);
	
} 

void loop(void) {}

Но Вам бы лучше внимательно прочитать #1

wasq
Offline
Зарегистрирован: 26.05.2018

ЕвгенийП пишет:

Вот, решение - у меня на диске осталось:

 

Спасибо, есть теперь куда идти !

wasq
Offline
Зарегистрирован: 26.05.2018

b707 пишет:

Обычно такие вопросы характерны для человека, который только вчера начал читать учебник по С... причем сразу с третьей части, пропустив основы, потому что они "скучные" :)

 

Интересно, где тот учебник, где все это написано. Ни про #include, ни про PROGMEM = подобного, что я спрашивал, ничего нет.

Вот простой пример. Обычная прикладная задача.

Программа работает по таблице, таблица более 2 000 байт. В процессе работы содержимое таблицы адаптируется к физическим характеристикам устройства. Обновленные значения таблицы надо пересохранить во FLASH. В разделе боотстропа есть функция, которая это умеет делать. НО надо чтобы и функция перезаписи и основная программа знали где храниться эта таблица, причем КРАТНО страницам записи во FLASH.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

wasq пишет:

Интересно, где тот учебник, где все это написано. Ни про #include, ни про PROGMEM = подобного, что я спрашивал, ничего нет.

похоже что кто-то просто не умеет искать. Про фоеш я вам выше нашел за 2 минуты, идея там по ссылке та же, что у Евгения. Про инклюде вопрос просто, простите, идиотский, поэтому и найти ничего не могли. Любой программист знает, что расщирение файла помогает утилитам компилятора и линкера понимать, что с этими файлами делать. И даже если инклюд может работать с произвольными расширениями - файлы в проекте все равно НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ называть не абы как, а правильно - заголовочные .h. исходники на С -.с, исходники С++ - .срр и так далее.

А что касается вашей задачки - она решается влегкую добавлением внешней микрухи ЕЕПРОМ - любого размера. W25q на 4 мегабита (1 мегабайи емкости !) - стоит 20-25 рублей. А если вы начнете писать во ФЛЕШ во время работы программы - вы ее убьете почти мгновенно, у нее ресурс от 100 до 10К записей всего

wasq
Offline
Зарегистрирован: 26.05.2018

b707 пишет:

А что касается вашей задачки - она решается влегкую добавлением внешней микрухи ЕЕПРОМ - любого размера. 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.

rkit
Offline
Зарегистрирован: 23.11.2016

Флеш может перезаписывать только загрузчик. Этот фокус не прокатит.

b707
Онлайн
Зарегистрирован: 26.05.2017

WASQ

дело не в отсуствии директивы, а в ограничении числа записей флеш-памяти. Она в принципе не предназначена для опетивного сохранения информации. Я повторяюсь - есть контроллеры, у которых ресурс флеш всего 100 записей. Не 100 тысяч - а только сотня

В вашем случае внешняя память - это не снижении надежности, а наоборот.

wasq
Offline
Зарегистрирован: 26.05.2018

rkit пишет:

Флеш может перезаписывать только загрузчик. Этот фокус не прокатит.

 

Ну .. Ну..

У Вас может быть в загрузчике ( загрузчик СВОЙ, не для и не от avrdude ) = а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы. И это делается очень просто и она пишет во ФЛЭШ и обратно передается управление основной программе.

rkit
Offline
Зарегистрирован: 23.11.2016

wasq пишет:

а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы.

Нельзя.

wasq
Offline
Зарегистрирован: 26.05.2018

b707 пишет:

WASQ

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

Ок Спасибо !

Все таки, ФЛЭШ не ОЗУ и это понятно, 100 записей - было такое да ...давно, работал еще с однократными... Работа на ресурс 10 лет круглосуточно, в год на более 100 раз перезаписывать, всего 1000 раз. Современной ФЛЭШе по плечу. А иметь прозрачность/однозначность в написании = это приятно.

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

rkit пишет:

Флеш может перезаписывать только загрузчик. Этот фокус не прокатит.

чО???  делаш в области RWW махонькую працедурку типа:

asm spm

asm ret

и фсё, буит работать.

b707
Онлайн
Зарегистрирован: 26.05.2017

rkit пишет:

Нельзя.

в авр спорить не стану, но в СТМ точно можно, там ЕЕПРОМ эмулируется путем записи во флеш из пользовательского кода.

RG22EM
Offline
Зарегистрирован: 27.08.2016

b707 пишет:

rkit пишет:

Нельзя.

в авр спорить не стану, но в СТМ точно можно, там ЕЕПРОМ эмулируется путем записи во флеш из пользовательского кода.

ПАТАМУШТА там EEPROM нету

wasq
Offline
Зарегистрирован: 26.05.2018

AVR105: эффективное сохранение параметров в памяти FLASH

В даташите AVR105 рассматриваются вопросы хранения параметров в памяти FLASH:

Быстрое сохранение параметров
• Износостойкое хранение – до 350 тысяч циклов записи
• Эффективность хранения с точки зрения энергопотребления
• Хранение параметров произвольного размера
• Надежность хранения параметров
• Опциональная верификация записанных параметров
• Опциональное восстановление после сбоя питания

Встраиваемые системы (embedded) полагаются на использование параметров, которые могут сохранять свое значение между сбросами (RESET) и пропаданиями питания. В некоторых системах эта статическая информация используется для инициализации системы в корректное состояние в момент запуска (start-up), в других системах это используется для лога истории системы или для накопления данных. С этой целью можно использовать память EEPROM, однако её скорость не может сравниться со скоростью памяти FLASH, когда нужно в одно и то же время сохранить несколько байт.

Причина повышенной эффективности памяти FLASH для большого набора параметров в том, что может использоваться страничное программирование, которое сокращает время записи. Таким образом, время в пересчете на 1 байт получается меньше, чем для EEPROM, когда сохраняется набор параметров. В результате получается ускоренный метод сохранения, энергопотребление может быть уменьшено, так как больше времени микроконтроллер может провести в режиме сна (sleep mode). ………….

и много другихз хороших ПЛЮЩЕК

 

rkit
Offline
Зарегистрирован: 23.11.2016

rkit пишет:

wasq пишет:

а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы.

Нельзя.

Хотя нет, оказывается можно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rkit пишет:

rkit пишет:

wasq пишет:

а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы.

Нельзя.

Хотя нет, оказывается можно.

И даже совсем несложно.

void stupidFunction(void) __attribute__ ((section (".bootloader")));

void stupidFunction(void) {
	// Мы в области загрузчика. Делаем чего "хочим"
}

 

RG22EM
Offline
Зарегистрирован: 27.08.2016

ЕвгенийП пишет:

И даже совсем несложно.

void stupidFunction(void) __attribute__ ((section (".bootloader")));

void stupidFunction(void) {
	// Мы в области загрузчика. Делаем чего "хочим"
}

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

rkit пишет:

rkit пишет:

wasq пишет:

а в нем ФУНКЦИЯ ( код ) который можно вызывать из основной программы.

Нельзя.

Хотя нет, оказывается можно.

Ну надо же, как быстро переобулся пафос :))) Можно, всё можно. И год назад было можно, и два, и пять. 

Green
Offline
Зарегистрирован: 01.10.2015

...и всю жизнь можно было - офигенно сложно додуматься. Сейчас вон оптибут есть с этими фишками - пиши куда хош.