Оптимизация кода.
- Войдите на сайт для отправки комментариев
Пнд, 03/02/2014 - 14:55
У меня достаточно большой скечь . Иногда Arduino сложно с ним справляться и она зависает.
Появилось несколько идей по разгрузки ее. Нужны ваши советы.
Что менее ресурсоемко для Arduino
1 вариант:
if (LightSensor1 < 800 && LightSensor1 < LightSensor2+100 && LightSensor3 == 0) { }
2 вариант:
if (LightSensor1 < 800 && LightSensor1) { if (LightSensor2+100) { if (LightSensor3 == 0) { } } }
Далее что лучше использовать:
byte LightSensor1;
или
int LightSensor1;
В переменной LightSensor1 хранится число от 0 до 30. byte насколько я понимаю будит менее энергоемко, но как-то я этого не почувствовал. Мне показалось с int arduino лучше работает.
Второй вариант с ошибкой, правильно так:
Далее:
Варианты
if (LightSensor1 < 800)
if (LightSensor1 == 800)
if (LightSensor1 <= 800)
Какой из них менее ресурсоемкий?
В первом случае без разницы. Во втором читайте Программирование -> int и byte.
максим мне лично так не кажется. хотя может и ошибаюсь. тут вопрос как выполняется программа.
условие с несколькими параметрами
если не выполнилось 1 условие и стоит && для остальных, то есть должны выполнится все, программа сразу пропустит после 1 несовпадения или все таки проверит каждое?
если каждое то лучше писать по отдельности если важна скорость
maksim, обоснуйте пожалуйста как-то первый случай.
И хочется услышать что-то о:
Варианты
if (LightSensor1 < 800)
if (LightSensor1 == 800)
if (LightSensor1 <= 800)
Какой из них менее ресурсоемкий?
Иногда Arduino сложно с ним справляться и она зависает.
Ардуина может виснуть из-за проблем с питанием или когда память кончается обычно..(ну и некоторые могут умудриться отправить м/к в бесконечный цикл..)
Где возможно,то лучше использовать переменные byte ,а не int .
Вообще без кода тут нечего отптимизировать
ну и некоторые могут умудриться отправить м/к в бесконечный цикл..
В бесконечный цикл умудряются отправить микроконтроллер все
у это уже придираться к словам. одно дело когда микроконтроллер выполняет как положено программу, и ему положено крутиться бесконечно, а другое дело как он крутится на каком то кусочке программы и больше ничего не делает
У меня достаточно большой скечь . Иногда Arduino сложно с ним справляться и она зависает.
Появилось несколько идей по разгрузки ее. Нужны ваши советы.
Что менее ресурсоемко для Arduino
1 вариант:
2 вариант:
Далее что лучше использовать:
byte LightSensor1;
или
int LightSensor1;
В переменной LightSensor1 хранится число от 0 до 30. byte насколько я понимаю будит менее энергоемко, но как-то я этого не почувствовал. Мне показалось с int arduino лучше работает.
с точки зрения стабильности работы и отсутствия зависаний - без разницы
если виснет то по другой причине. Либо железо, либо грубые ошибки в программе. Часто встречаются такие ошибки:
- вылезазание за границы массива
- не корректное использование указателей
- отсутствие или ошибочное планирование заполнения оперативной памяти
если не выполнилось 1 условие и стоит && для остальных, то есть должны выполнится все, программа сразу пропустит после 1 несовпадения или все таки проверит каждое?
Поробуйте
Экономьте память, пишите
if (LightSensor1 < 800)
if (LightSensor1 == 800)
if (LightSensor1 <= 800)
У меня достаточно большой скечь . Иногда Arduino сложно с ним справляться и она зависает.
Появилось несколько идей по разгрузки ее. Нужны ваши советы.
Что менее ресурсоемко для Arduino
1 вариант:
2 вариант:
Далее что лучше использовать:
byte LightSensor1;
или
int LightSensor1;
В переменной LightSensor1 хранится число от 0 до 30. byte насколько я понимаю будит менее энергоемко, но как-то я этого не почувствовал. Мне показалось с int arduino лучше работает.
1. Второй исправленный вариант полностью эквивалентен первому. Операция && вычисляет аргументы слева направо до первого ложного.
2. byte занимает меньше места на стеке, в памяти, в регистрах и операций с ним на 8-битном контроллере требуется меньше -> выше быстродействие, эффективнее программа и меньше флеш-памяти требуется. Неверующие могут разглядывать ассемблерный листинг.
3. Если программа зависает, то проблема "где-то ещё", точно не в том как записывается условие и вряд ли в переходе от int к byte.
всякие String и даже обычные строковые константы очень прожорливы к оперативной памяти... да да именно оперативной
если не использовать PROGMEM то все строковые константы перед запуском setup() грузятся из флэш в оперативную память и используются оттуда и живут там до скончания века
всякие String и даже обычные строковые константы очень прожорливы к оперативной памяти... да да именно оперативной
если не использовать PROGMEM то все строковые константы перед запуском setup() грузятся из флэш в оперативную память и используются оттуда и живут там до скончания века
Да, именно константные строки стоит в прогмем пихать, согласен. Хотя доступ туда не так чтобы сильно удобен.
Экономьте память, пишите
Всем большое спасибо. Расскажите пожалуйста подробней о коде предложенный trembo, что делает символ "F"?
Экономьте память, пишите
Всем большое спасибо. Расскажите пожалуйста подробней о коде предложенный trembo, что делает символ "F"?
Символ F (макрос такой) делает две вещи:
1. строковая константа помещается в програмную область, которой обычно больше, чем SRAM;
2. тип получаемого значения становится "ни на что непохожим", чтобы случайно не спутать это с нормальным указателем в память.
Метод Serial.println умеет работать с таким типом данных, он знает как правильно читать из програмной памяти.