Этюды для начинающих: Память 1. Что и как не надо делать

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

b612 пишет:

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

ну, чудес-то не бывает - чтобы использовать ваши данные, что хранятся в EMEM - вы все равно сначала их в оперативку считываете

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

Речь о том, что я не храню предустановки во флэше, как это обычно делают нормальные люди.

А при начале работы переписывают из флэша в еепром.

b707
Offline
Зарегистрирован: 26.05.2017

b612 пишет:

Речь о том, что я не храню предустановки во флэше, как это обычно делают нормальные люди.

флеша - 32к, ЕЕПРОМ - всего 1К. Вы уверены. что экономия 3% флеша стоит этих плясок с ЕЕПРОМ? - 1к флеша обычно бех труда можно выиграть оптимизацией кода и библиотек

b612
Offline
Зарегистрирован: 12.03.2017

b707 пишет:

b612 пишет:

Речь о том, что я не храню предустановки во флэше, как это обычно делают нормальные люди.

флеша - 32к, ЕЕПРОМ - всего 1К. Вы уверены. что экономия 3% флеша стоит этих плясок с ЕЕПРОМ? - 1к флеша обычно бех труда можно выиграть оптимизацией кода и библиотек

Не уверен. Хотя есть соображения я в еепроме храню не только настройки но и музыку. А она пишется отдельно от прошивки.

И да, кто бы мне помог оптимизировать библиотеку про BME280 она целык 2к отъедает. Главно BMP280 не такая жадная почемуто.

И оперативу зараза жрёт

 

 

anarch
Offline
Зарегистрирован: 10.09.2017

Я бы то же был рад увидеть легкую библиотеку BME280.

У меня MBE280 by Tyler Glenn она вообще 10кб хавает :(

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

b612 пишет:

Проще было бы задать адреса железно.

Ни разу не проще. Вы даже не представляете, какой это ящик Пандоры.

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

b612 пишет:

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

Так и задавайте структурой. Все настройки объединить в одну структуру и её использовать в обеих программах, чтобы при лбых изменениях структуры, менялось сразу в обеих.

Понятно, но эти массивы принадлежат совершенно разным частям программы и программы пишут разные люди и в разное время

И что? Создали одну структуру и все её используют одну и ту же.

b612 пишет:
вообщем там трудно договориться.
Если у проекта есть руководитель, то и договариваться нечего - построил всех и сказал как делать.

А если проект делается "демократически", бросайте его немедленно. Один хрен ничего не получится. Вавилонская башня - хрестоматийный пример.

sadman41
Offline
Зарегистрирован: 19.10.2016

2кб на сложный сенсор, который выдает float в Q-формате - это неплохой результат. Наврядли дальнейшая оптимизация будет стоить дёшево. Мне пришлось извернуться и конвертить Q-number прямо в строку, чтобы обойти float. Но я до сих пор не уверен, что это радикально уменьшило расход ресурса.

b612
Offline
Зарегистрирован: 12.03.2017

Что интересно 1.5к это не BMЕ280 жрёт, а это разница между те что жрут BMP и BME.

BMP около 1.5

BME почти 3

sadman41
Offline
Зарегистрирован: 19.10.2016

А что в этом интересного? Любой функционал поглощает ресурс. BMP выдает давление и температуру, BME - дополнительно к этому еще и влажность выкатывает. И эта часть - где-то треть объёма от всех вычислений, да ещё и с конвертацией из необычного формата. Так что - оптимизация возможна только за счёт ограничения функционала. Например - отказ от float. Ну и ещё там можно подсократить кое-что. Но стоит ли овчинка выделки - вопрос на миллион. 

b612
Offline
Зарегистрирован: 12.03.2017

sadman41 пишет:

А что в этом интересного? Любой функционал поглощает ресурс. BMP выдает давление и температуру, BME - дополнительно к этому еще и влажность выкатывает. И эта часть - где-то треть объёма от всех вычислений, да ещё и с конвертацией из необычного формата. Так что - оптимизация возможна только за счёт ограничения функционала. Например - отказ от float. Ну и ещё там можно подсократить кое-что. Но стоит ли овчинка выделки - вопрос на миллион.

полтора К за влажность , не жирно ли ?

Float  по идее жрать ничего не должен ибо он уже присутствует в проекте.

sadman41
Offline
Зарегистрирован: 19.10.2016

Разговор ниочём. Его даже лучше будет снести, как оффтоп.

Жирно, не жирно - это ваши субъективные оценки. Хотите "нежирно" - убейте, например, неделю рабочего времени на оптимизацию. После этого понятно будет - жирно или нет. Лично я, основаясь на опыте, написал, что это - немного. Можно начать вдавливать код в определённый объём, но это будет очень специфическое решение, возможно даже, что под один единственный проект. 

NikShel
Offline
Зарегистрирован: 21.01.2018

 об ОЗУ - мы не касаемся EEPROM и памяти программы (по крайней мере пока).

Итак, если мы посмотрим в Atmel'овскую документацию, то увидим. что общее распределение памяти у

------------------------------------------------------------------------------------------------

Евгений, а можно в Топике вставить картинку. Ссылка не правильно работает!

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

Ну, Вы хоть ссылку на мой пост дайте, тут пять страниц, где мне теперь искать эту ссылку.

anarch
Offline
Зарегистрирован: 10.09.2017

Я думаю про эту картинку был вопрос :)

MarcMurdock
Offline
Зарегистрирован: 29.09.2019

Помоги пожалуйста понять как работает выделение памяти, самостоятельно я осознать это не смог. Возьмём простой код:

void setup() {
}

void log(String message){
}

void loop() {
  log("A");
}

и скомпилируем его в среде Arduino для, скажем, attiny25. Получим:

Sketch uses 1418 bytes (69%) of program storage space. Maximum is 2048 bytes.
Global variables use 21 bytes (16%) of dynamic memory, leaving 107 bytes for local variables. Maximum is 128 bytes.
 
Окей, добавим еще немного логгинга:
void setup() {
}

void log(String message){
  ;
}

void loop() {
  log("A");
  log("B");
}

После компиляции:

Sketch uses 1604 bytes (78%) of program storage space. Maximum is 2048 bytes.
Global variables use 23 bytes (17%) of dynamic memory, leaving 105 bytes for local variables. Maximum is 128 bytes.

Стоп, что? Почему "B" располагается в динамической (HEAP+STACK) памяти?? А если сделать логгинг более детальным?

void setup() {
}

void log(String message){
  ;
}

void loop() {
  log("Condition A is met, executing branch X");
  log("Condition B is met, exiting the loop");
}
Sketch uses 1676 bytes (81%) of program storage space. Maximum is 2048 bytes.
Global variables use 95 bytes (74%) of dynamic memory, leaving 33 bytes for local variables. Maximum is 128 bytes.
 
*забился в угол и заплакал*
Почему, почему все строковые константы (это же константы, правда?) уходят в динамическую память?

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Чти за PROGMEM. И не в этой теме

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

DetSimen пишет:

Чти за PROGMEM. И не в этой теме

И заодно, забыть про String, т.к. евойный конструктор первое, что делает, это копирует строку из еепрома целиком в рам.

MarcMurdock пишет:

Почему, почему все строковые константы (это же константы, правда?) уходят в динамическую память?

А куда им уходить? Ваше предложение?

MarcMurdock
Offline
Зарегистрирован: 29.09.2019

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

А куда им уходить? Ваше предложение?

Я предполагал, что они уходят во flash, где хранится сама программа.

Почитал по совету DetSimen о PROGMEM, нашёл макрос F(), осознал как жить дальше.

Спасибо за разъяснение.

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

MarcMurdock пишет:
осознал как жить дальше.
Только не забудьте про первую часть #217, а то Вас ждёт разочарование.

MarcMurdock
Offline
Зарегистрирован: 29.09.2019

Вы про String()? Да, я уже вернулся к старому доброму

char *message = "that's it";

Спасибо!

sadman41
Offline
Зарегистрирован: 19.10.2016

Добрый - это char message[] = "abcd" ...