Ви не увійшли.
Возможно кто то решит, что здесь будет готовый код. Это не так. Я лишь хочу поделится своими находками в плане оптимизации вывода на не слишком шустрый дисплей.
Пример: вывод величины тока или напряжения на дисплей.
Есть несколько проблем:
1. величина может принимать отрицательные значения
2. количество знаков в значении может меняться как в большую так и в меньшую сторону. Из за чего отображаемое значение может быть некорректным
1я проблема решается использованием функции abs и рисованием или удалением в нужное время текстом знака минус"-".
2я проблема имеет несколько решений:
- перед каждым циклом отображения значения стирать строку пробелами. Не слишком изящное решение, так как дополнительный вывод пробелов отжирает оперативку на количество этих самых пробелов (не критично, если не часто и можно например выводить один пробел в цикле for), но работает медленно и видно как строка стирается и потом заполняется данными.
- перед каждым циклом отображения рисовать прямоугольник с цветом фона, работает более красиво, но все равно медленно, если нужно стереть много.
- самый удачный на мой взгляд вариант, это перед выводом на дисплей посчитать количество символов в значении и стирать любым из первых двух вариантов только лишние символы. Например величина тока была 1999 мА, а стала 888мА, то стереть нужно только место под четвертую цифру.
Нарыл 4 алгоритма как посчитать количество знаков числе. Как говорит автор - метод "сравнения" самый быстрый, а как по мне, так и самый простой для понимания, несмотря на длину кода.
Если у кого то есть еще варианты по оптимизации отображения, прошу поделится
Неактивний
Бред какой-то.
Согласен
Kaka пише:Бред какой-то.
Согласен
Kaka предложил толковую идею, про которую я не знал, а вы могли бы предложить свою или воздержаться.
Покурил я printf - интересная вещица, ща сбацаю все хотелки
Неактивний
г0сть пише:Kaka пише:Бред какой-то.
Согласен
Kaka предложил толковую идею, про которую я не знал, а вы могли бы предложить свою или воздержаться.
Покурил я printf - интересная вещица, ща сбацаю все хотелки
Эта толковая идея - классика языка С, неизвестная разве что заядлым курильшикам, прогуливающим уроки. Я вот тоже хотел воздержаться, но передумал. Хочу также предложть вам свою идею, избавящую вас от позра. Не ленитесь читать учебники и справочники. И тогда на вас никто не станет "Какать"!
Та идея очевидная и без учебников чисто из здравого смысла. Если полное изменение обходится дорого, то надо изменять только то, что нужно.
А зравый смысл окуда? Из учебников, писменных или неписьменных. Есть и другое очевидное. Создать производный (дочерний) класс от Print, переопределив вывод. Что в стиле Ардуино, будет даже красивше.
Что в стиле Ардуино, будет даже красивше.
Не будет, к сожалению. Эти сцуки уже определили глобальную переменную Serial, и ей уже пофиг наши изменения в её родительских классах - ей их не подсунешь (не Питон и Яваскрипт чай. там такое запросто). Так что можно определить своё, но работать будет со всем, акромя предопределённого Serial'а, а это уже не так красиво.
Неактивний
Watchdog пише:Что в стиле Ардуино, будет даже красивше.
Не будет, к сожалению. Эти сцуки уже определили глобальную переменную Serial, и ей уже пофиг наши изменения в её родительских классах - ей их не подсунешь (не Питон и Яваскрипт чай. там такое запросто). Так что можно определить своё, но работать будет со всем, акромя предопределённого Serial'а, а это уже не так красиво.
Serial останется как сериал. Никуда от не денется. Как то так:
class GPrint : public Print
{
//...
public:
GPrint(/*...*/);
//...
virtual size_t write(uint8_t)
{
// your implementation
// ...
}
}
Ну, да. А сериал с этим работать не будет. А как раз об этом. Он же от родного Print, а не от нашего GPrint.
На самом деле, не так красиво (зато дешево и практично), можно присобачить потоки ( << ) ко всему, в том числе и к встроенному сериалу.При помощи переопределения операции << для Print через внешнее переопределение (в сам Print лезть не надо). Тогда можно просто писать Serial << "n=" << n; Причём это как раз будет работать со всем, что от Print произведено.
Также можно присобачить printf к сериалу (или к чему угодно). Тоже удобно.
Остання редакція Kaka (2020-03-25 21:24:08)
Неактивний
Ну, да. А сериал с этим работать не будет. А как раз об этом. Он же от родного Print, а не от нашего GPrint.
На самом деле, не так красиво (зато дешево и практично), можно присобачить потоки ( << ) ко всему, в том числе и к встроенному сериалу.При помощи переопределения операции << для Print через внешнее переопределение (в сам Print лезть не надо). Тогда можно просто писать Serial << "n=" << n; Причём это как раз будет работать со всем, что от Print произведено.
Также можно присобачить printf к сериалу (или к чему угодно). Тоже удобно.
Ну, авторитет printf непререкаем. А зачем Serial-у GPrint? Это же класс вывода на графисческий дисплей, наследник Print, как и Serial. А опреаторный ввод-вывод, да как и printf / scanf собственно, имеет достаточно громоздкий механизм реализации, касательно маленьких микроконтроллеров.
Batu пише:Та идея очевидная и без учебников чисто из здравого смысла. Если полное изменение обходится дорого, то надо изменять только то, что нужно.
А зравый смысл окуда? Из учебников, писменных или неписьменных. Есть и другое очевидное. Создать производный (дочерний) класс от Print, переопределив вывод. Что в стиле Ардуино, будет даже красивше.
Здравый смысл из здравого смысла и касается абсолютно всего нуждающегося в изменении.
Неактивний
Watchdog пише:Batu пише:Та идея очевидная и без учебников чисто из здравого смысла. Если полное изменение обходится дорого, то надо изменять только то, что нужно.
А зравый смысл окуда? Из учебников, писменных или неписьменных. Есть и другое очевидное. Создать производный (дочерний) класс от Print, переопределив вывод. Что в стиле Ардуино, будет даже красивше.
Здравый смысл из здравого смысла и касается абсолютно всего нуждающегося в изменении.
Под здравым смыслом мы понимаем то мировозрение которое усвоили в течении жизни и считаем верным, т.е. здравым, а не больным. Здравый смысл может быть очень разным у различных нездравых умов, самовольно и неправильно мыслящих. Но что из слушать - больных; лечить из надо!
А зачем Serial-у GPrint? Это же класс вывода на графисческий дисплей, наследник Print, как и Serial.
Было использовано слово "красиво". Мои представления о красоте - это когда простое изменение работает для всего, в т.ч. и для Serial.
А опреаторный ввод-вывод, да как и printf / scanf собственно, имеет достаточно громоздкий механизм реализации, касательно маленьких микроконтроллеров.
Сначала про операторный вывод ... кто Вам сказал. что у него какой-то особый, громоздкий механизм реализации? Вас жестоко обманули! Сравните ресурсы (а если хотите, то ассемблерный код) вот этих двух скетчей и знайте, что использование потокового вывода не стоит ровным счётом ничего!
void setup(void) {
Serial.begin(115200);
Serial.print("Quae est ad aliquid");
}
void loop(void) {}
template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }
void setup(void) {
Serial.begin(115200);
Serial << "Quae est ad aliquid";
}
void loop(void) {}
Ну, а про printf. Это общие слова. Любое решение чего-нибудь стоит в плане ресурсов. Потому говорить "вообще" без указания задачи - сотрясание воздуха. Из тех задач для МК, которые я видел и которые делал, в 95% случаев ресурсов за глаза хватает в т.ч. и для printf. А если хватает - чего париться? Используем то, что удобно.
Остання редакція Kaka (2020-03-26 10:28:42)
Неактивний
Watchdog пише:А зачем Serial-у GPrint? Это же класс вывода на графисческий дисплей, наследник Print, как и Serial.
Было использовано слово "красиво". Мои представления о красоте - это когда простое изменение работает для всего, в т.ч. и для Serial.
Watchdog пише:А опреаторный ввод-вывод, да как и printf / scanf собственно, имеет достаточно громоздкий механизм реализации, касательно маленьких микроконтроллеров.
Сначала про операторный вывод ... кто Вам сказал. что у него какой-то особый, громоздкий механизм реализации? Вас жестоко обманули! Сравните ресурсы (а если хотите, то ассемблерный код) вот этих двух скетчей и знайте, что использование потокового вывода не стоит ровным счётом ничего!
void setup(void) { Serial.begin(115200); Serial.print("Quae est ad aliquid"); } void loop(void) {}
template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; } void setup(void) { Serial.begin(115200); Serial << "Quae est ad aliquid"; } void loop(void) {}
Ну, а про printf. Это общие слова. Любое решение чего-нибудь стоит в плане ресурсов. Потому говорить "вообще" без указания задачи - сотрясание воздуха. Из тех задач для МК, которые я видел и которые делал, в 95% случаев ресурсов за глаза хватает в т.ч. и для printf. А если хватает - чего париться? Используем то, что удобно.
Я больше не буду сторясать воздух, Кака. Но на последок скажу. Во первых, речь не о том чем вы блеснули. Во вторых, в микроконтроллерах приходится считать байты, расходуемые на удобства. А в третьих, задача определмима со слов автора; речь идет о выводе форматированных данных на графический дисплей. Не какайте, пожалуйста, всем на голову, для этого существуют специальные места.
Понятно, то, что приведённые коды идентичны по ресурсам и не отличаются ни на один байт, Вы проверили, убедились, но признать ошибку - не по-пацански. Знакомая позиция.
Да, если это просто синтаксический сахар. Что касается боле содержательных конструкций то все не так однозначно. Вы правы, я пацан для Бьёрна Страуструпа, но в этом деле кое-чего да смыслю. Это не позиция, а мировозрение, присобаченное.
Под здравым смыслом мы понимаем то мировозрение которое усвоили в течении жизни и считаем верным, т.е. здравым, а не больным. Здравый смысл может быть очень разным у различных нездравых умов, самовольно и неправильно мыслящих. Но что из слушать - больных; лечить из надо!
Я не пойму к чему ты прицепился, потому повторюсь подробнее..
"Если полное изменение обходится дорого, то надо изменять только то, без изменения чего нельзя обойтись."
Остання редакція Batu (2020-03-26 14:01:15)
Неактивний