Работа с картой microSD

Обана… Вот для меня новость. Век живи…
Я считал что все строковые сообщения в serial и на карту пишу всю диагнстику начальной проверки датчика которые я вставил по ходу “для наглядности” - это константы и они хранятся в статической памяти, где и сам код программы (т.е. в теле программы)
(их, этих сообщений, полно! и они достаточно “полнобуквенные”)
Это не так?!!? это занимает динамическую память??
Счас все повычищу, оставив только короткие символы для идентификации “о чем речь”!!
Э… вернее не счас а вечером. Надо бы и поработать немного…

1 лайк

С англйским я даже не на “вы”, но Гугл-переводчик всегда под рукой.
Очень интересно. Первая мысль была о чем-то подобном (делал нечто подобное при программировании на ПК - хранение всяких сообщений в БД на диске и вызов их на экран по номеру). Не очень понял что такое F(), но это вопрос не критичный - было бы понятно ЧТО искать…
Спасибо, вечером продолжу экскременты…

Я Вам больше скажу, если они ещё и типа String (код-то секретен, так что только на ромашке гадаем), то они в любом случае оказываются в динамической памяти, даже если Вы сами текстовые константы загоните в progmem

Ну, да, Вы видите только необходимость заставлять всех на кофейной гуще гадать

Да нет же… я хотел как лучше: не загромождать форум и Ваш мозг длинным кодом, который в принципе работает, а говорить только о конкретных вопросах.
Т.е. понял что такой оператор:
Serial.println(“Карта битая или отсутствует”);
уже убийца памяти, даже если по логике программы он в конкретном сеансе и не выполняется (обходится логикой)?

Просто нужно знать, что чудес не бывает. С F экономишь в одном месте, но теряешь в другом…
Я как-то однажды, когда узнал про F, загнал все строки “туда”, так у меня под скеч места не осталось))) Баланс и оптимизация, и понимание дела помогут.

Так одну память занимает, а так:
Serial.println(F(“Карта битая или отсутствует”));
-другую…

Во flash есть в обоих вариантах !!!
В первом на старте еще и копируется в RAM …

Вот его и надо заменять на Serial.println(F(“Карта битая или отсутствует”));

Отнюдь.
Текстовые константы в любом случае попадают во flash память, иначе МК просто неоткуда будет их взять. А потом они по умолчанию еще и копируются в оперативную. Чтобы избежать этого копирования и служит макрос F().
Впрочем, это справедливо только для AVR, где два разных адресных пространства. В Arduino Due и STM32 константы, как им и положено, размещаются только в flash и в RAM не копируются.

Нет.
В первом случае помещается одновременно в оба вида памяти, а во втором - только в одну.

1 лайк

Ну, да, это пока не хватило ума их использовать как String :slight_smile:

Как они там используются мы не знаем, т.к. ТС же в показе нам кода

А потому, могу недорого предложить желающим кофейную гущу и ромашку (как вырастет) :slight_smile:

Всем добрый вечер.
Большое спасибо всем за советы и науку.
После перераспределения памяти в пользу оперативки (занято стало 59%) все заработало как надо. Вот ведь… А почему же нет никаких сообщений о проблемах? с другой стороны - а куда их выдавать…
Что касается кода: я могу выложить для посмотреть если есть у кого интерес. И даже пояснить потом “зачем” если таковые вопросы возникнут… Ну он простой как валенок… и еще раз: не выкладывал только для того что бы никого не грузить лишней инфой.

Действительно, почему?
Наверное, программист не написал…
Кто у нас программист?

Воооот!!! всегда есть виноватый. В данном случае не могу понять кто… :slight_smile:

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

Я это взял на заметку но пока еще не настолько освоил систему… Но я же расту!

В ширь? :smiley:

Не! я худой (относительно). В глубь!

Ну, значит есть куда расти в ширь!
Кушайте “Растишку” и всё будет замечательно!

и как ты колесо на авто меняешь-то без домкрата?

У меня было вот что. 75% памяти - красное предупреждение: программа может работать некорректно. Сократил до 74%. Вроде бы заработала, но стала зависать. Попытался найти места зависания с помощью светодиодов. Оказалось, что программа зависала, но НЕ ВСЕГДА, ПРОИЗВОЛЬНО при обращении к BMP180 и при формировании строки для вывода в Serial. Похоже - память там и расходуется.