структуры и PROGMEM
- Войдите на сайт для отправки комментариев
Чт, 19/04/2012 - 08:31
Здравствуйте.
Заранее извиняюсь за вопрос на который уже возможно были ответы.Но я ,к сожалению,не нашел.
Есть ли возможность записывать во флэш и работать со структурами в ардуино при помощи PROGMEM например?
arduino.cc/en/Reference/PROGMEM
http://playground.arduino.cc/Learning/Memory
Я читал этот референс.Там сказано не очень понятно про пользовательцкие типы переменных.Можно ли их закатывать во флэш
Напрямую - нет. Нельзя даже обычные типы использовать. И там довольно четко написанно:
it is important to use the datatypes outlined in pgmspace.h. Some cryptic bugs are generated by using ordinary datatypes for program memory calls
Что в вольном переводе "важно использовать только типы, описанные в pgmspace.h. Некоторые критические ошибки происходят именно из-за использования обычных типов". И ниже даны типы которые "можно".
То есть "в итоге", думаю можно. Но нужно будет приводить типы, и писать-читать их самому побайтово. Используя типы из pgmspace.
Возможно поможет в этом чтение http://easyelectronics.ru/avr-uchebnyj-kurs-programmirovanie-na-si-rabota-s-pamyatyu-adresa-i-ukazateli.html
Там пол статьи объяснения "указателей", а потом и про PROGMEM есть рассказ и как с ним обращатся.
Спасибо.Прояснилось немного :)
Для практики хочу написать свое меню для LCD. И сталкнулся с небольшой непоняткой.
По идее должен вывод начаться с MANUAL, но он выводит AUTOMATIC. Почему так происходит, я же указал адрес &Menu[0], а он начинает выводить с Menu[1], если после 29 строки указать curr-- то работает как надо! Почему так происходит?
Доброго времени суток. Имею скетч, пока занимает 774 (37%) оперативы и 16 794 байт (52%) флэш. Но скетч постоянно дополняется и улучшается и предстоит еще немало доработать. Поэтому если не составит труда подскажите как элементы структуры ниже с помощью PROGMЕM перенести во флэш чтобы потом не возникало желания перейти на другую плату помощнее, uno вполне устраивает
Полный листинг кода
А зачем вам рассказывать, если вы не слушаете.
А зачем вам рассказывать, если вы не слушаете.
qwone в чем вы со мной не согласны. В том что хочу строки во флэш записать или вы о другом?
Где это Вы указали адрес &Menu[0]?
В 29-ой строке Вы прочитали то, что находится по адресу &Menu[0]. А там как раз находится адрес &Menu[1]. Вот он и попал в Ваш curr.
BuonanotteMasha, как Вы себе это видите? У Вас вторым элементом структуры идёт адрес некоего плавающего числа. Если Вы загоните адрес в progmem, то он будет константой - его нельзя будет менять в процессе работы. Это нормально? А на что он будет указывать? Где будет находиться само это число?
ЕвгенийП, признал ошибку. Спасибо
Вас и других не затруднит указать мне (знаю что не по теме, но не хочется сразу покидать эту ветку) как возможно сделать вместо многочисленных вызовов в ветках case функции установки курсора тольк один ее вызов. Под рукой нет платы, поэтому буду думать
Думаю либо завести отдельный буфер под строки, либо через указатели на эти строки
А что такое doA? doB и doC? Есть ограничения на их значения или можно любые задать?
и ты это, инвариантные строки, типа
lcd.setCursor(1, 1);
за switch вынеси, не раздувай код.
и ты это, инвариантные строки, типа
lcd.setCursor(1, 1);
за switch вынеси, не раздувай код.
Это не всегда возможно. Часто бывает, что эта строка нужна только в том случае, если хоть что-нибудь из свитча совпало, а если ничего не совпало, то она не нужна. Если же вынести, то она будет выполняться всегда.
Здесь, наверное, можно вообще убрать к чертям свитч, но для этого я жду ответа от ТС.
Полный листинг кода #7
Тут привел фрагмент для лучшего понимания сути моего вопроса.
А что такое doA? doB и doC? Есть ограничения на их значения или можно любые задать?
Про это забудьте, это я как мог хотел упростить ТЗ. Видимо не донес никакой информации
Про это забудьте, это я как мог хотел упростить ТЗ. Видимо не донес никакой информации
Блин, ну тогда, что такое EDIT_PARAM, HEAT_ZONE и т.п.?
Вопрос-то простой. Я могу все эти выборы свести к 0, 1, 2, и т.п.?
Если могу, то задача элементарно решается.
Замените на здоровье, тип byte. Насчет элементарности до меня не дошло решение
Да и функция blinking. Используется для вывода мигающего текста
Вот в этом фрагменте допустим
Тогда делаете так. Заводите функции для каждой ветви. Скорее всего столько функций, сколько ветвей, Вам не понадобится, т.к. часть действий одинаковая с точностью до параметров.
Все функции должны иметь одинаковый прототип (т.е. возвращаемое значение и параметры). Даже, если какой-то функции параметры не нужны, они должны быть, что у всех функций было одинаково.
Сейчас я сделаю пример, только Вы тут уже столько разных кодов наплодили, что давайте я сделаю абстрактный пример, чтобы Вы идею поняли а Вы уж для своего кода по образу и подобию там сделаете что надо.
Вот, смотрите, допустим, есть у Вас вот такой switch
Что мы здесь видим? Ветви 0-3 - одинаковые с точностью до параметра - строки. Но реально достаточно передавать целое число. А ветки 4-5 одинаковые с точностью до параметра - логического выражение (0 или не 0).
Значит, чтобы заменить всё, нам достаточно двух функций. У обеих параметр будет int. Для веток 0-3 - пердавать будем собственно индекс. А для веток 4-5 - тоже индекс, но внутри вычтем из него 4, чтобы получить 0 или 1.
Пишем эти две функции.
Теперь запишем массив функций, которые надо вызывать при том или ином значении kaka. очевидно, что при 0-3 надо вызывать f_0_3, а при 4-5 надо вызывать f_4_5. Так и напишем.
Ну, собственно, теперь вместо того длинного switch можно использовать вот такую строку
Соберём всё вместе.
Ну, вот, как-то так, если нигде не ляпнул чего-нибудь.
Спасибо, освобожусь, обязательно попробую вашу идею
Пока сделал так, еще доработаю
Строки 13 и 14 ... зачем? print и сам умеет из прогмема брать.
Всмысле
Serial
.println(
string_table[n]) верно?Ну, вроде работало так. Работает?
Нет Serial.println(string_table[n]); не работает
Евгений спасибо вам за активную помощь, но возможно ли вызывать функцию blinking #23 из f1. Или лучше сделать ее отдельный вызов. Все строки string_0 ... string_5 у меня наэкране занимают одинаковые знакоместа. С первыми тремя я разобрался, но две другие понадобилось чтобы мигали как бы сигнализировали, поэтому и спрашиваю
А почему нельзя-то? Неужели Он уж и это запретил? :)
Тогда буду пробывать, если разрешено :)