Я правельно понимаю ,что выхотите vspeed задать -0, тоесть значение скорости будет равно нулю. Если это так то не вижу проблем ,хотя скорей всего пропадет возможность задать начальную скорость в момент СТОП. Тоесть сначала надо будет дать команду движения , а затем выбрать скорость,а при астановке она опять скинется в ноль что не есть гуд. Так что если я все правельно понял ,то наверное это не оптимально.
В подавляющем большинстве случаев - ничем. Но бывают редкие случаи, когда это приводит к экономии памяти.
По идее, static предполагает невозможность доступа из другого файла, а если слова static нет, то в другом файле можно описать эту же переменную с ключевым словом extern и иметь к ней доступ.
Современный оптимизирующий компилятор, если видит глобальную константу небольшого размера со словом static, он вообще не выделяет под неё память, а вставляет литерал в код. Если же слова static нет, то он тоже вставляет литерал в код, но также и "условно" выделяет память, сообщая линкеру, что если из других файлов никто туда не лезет, то переменную можно выбросить. Что линкер обычно и делает.
Так вот, в большинстве случаев это будет именно так - её всё равно выбросят (не компилятор, так линкер) и памяти она не займёт. Но здесь всё зависит от опций компилятора и линкера. А вот если явно указано static, то выбросить её может сам компилятор, линкер о ней и не узнает. Т.е. получается, что со словом static её легче выбросить и освободить память.
Общий вывод - если доступ из других файлов не нужен, надо писать static. Хуже не будет точно, а лучше - не часто, но может и быть.
Во первых, вы не перенесли функции выше использования и не прдъобявили их. В каких-то версиях IDE (напримерв 1.6.5), Вас может ждать неприятный сюрприз. По правилам языка, функция должна лиюо располагаться выше, чем используется, либо быть предобъявленной выше, первого использования.
Далее. Посмотрите на строки 96-162. Там содержатся 6 одинаковых функций, которые отличаются только числовыми пераметрами. А в строка 163-171 ещё одна, которая отличается от шести предыдущих одной строкой (вернее её отсутствием).
Наверное проскачило , но я спрашивал как предобъявить функцию, не совсем понял как это сделать.Наверное потому , что неправельно воспринемаю void. Я думаю что void loop это основная программа где собственно все и крутится, а остальные расцениваю как подпрограммы ,поэтому где их обьявлять что то не понимаю :(
Очень просто. Выиписываете её заголовок (без тела) и ставите точку с запятой. Заголовок - это то, что до {
Например,
// Предобъявление функции kaka
int kaka(const int a, const int b);
...........................
// Определение функции kaka
int kaka(const int a, const int b) {
return a + b;
}
По поводу сервы - точно плавает длительность импульсов, а не интервал между ними ?
Сейчас загружал с планшета последний вариант, длительность вроде в норме ,но есть провалы(моргание на осцицелографе), дома грузил предыдущий вариант там скакала длительность импульсов( тоесть 90 градусов длительность 15мс вроде,а уменя плавало рывками)соответственно серва дергалась.
Это параметры функции, они могут называться как угодно и используются внутри функции. Посмотрите на вызовы - там параметры передаются, а внутри функции испольуются. Ну, и почитатйте что-нибудь про функции в Си
Думаю, что отдельный.
В итоге получилось вот что:
Где еще нужно причесать?
и Главный вопрос куда смотреть чтобы решить вопрос с сервой и ее дерганием ?
Ну, а 13-ую строку чего обидели насчёт static? Всем дали, а ей не досталось? :)
Хорошо, чуть попзже, я пройду вторым кругом и напишу что дальше надо причёсывать.
Вы же пока напишите мне, откуда берутся команды типа 'F', 'B', 'G' и т.д. Их вводит человек или генерит какая-то программа?
Виноват ,исправлюсь :)
Команды приходят от планшета, апп Bluetooth RC controller.
Вся основа кода взята из примера для этой апп
Да и ещё вопрос, можно ли после строки 164 вставить: vspeed(0);?
Это имеено вопрос. Я не до конца понимаю логику, потому спрашиваю. Если можно, то мне это поможет Вам обзор усовершенствований писать.
Я правельно понимаю ,что выхотите vspeed задать -0, тоесть значение скорости будет равно нулю. Если это так то не вижу проблем ,хотя скорей всего пропадет возможность задать начальную скорость в момент СТОП. Тоесть сначала надо будет дать команду движения , а затем выбрать скорость,а при астановке она опять скинется в ноль что не есть гуд. Так что если я все правельно понял ,то наверное это не оптимально.
Ну, нет, так нет, обойдёмся. Я попозже напишу новый "список на 8 листов"
Хотелось бы не только следовать вашим рекомендациям , но и понимать что же я тут пишу. Пока я не совсем понимаю.
В любом случае Спасибо за помощь
По поводу vspeed , на самом деле нужно просто подавать на выходы speed1-4 разноуровневый сигнал , в зависимости от Поступающих команд с планшета.
Вопрос для гуру: зачем для глобальных объявлять
static
const...?
Чем просто const хуже?
Static из других файлов не виден
В подавляющем большинстве случаев - ничем. Но бывают редкие случаи, когда это приводит к экономии памяти.
По идее, static предполагает невозможность доступа из другого файла, а если слова static нет, то в другом файле можно описать эту же переменную с ключевым словом extern и иметь к ней доступ.
Современный оптимизирующий компилятор, если видит глобальную константу небольшого размера со словом static, он вообще не выделяет под неё память, а вставляет литерал в код. Если же слова static нет, то он тоже вставляет литерал в код, но также и "условно" выделяет память, сообщая линкеру, что если из других файлов никто туда не лезет, то переменную можно выбросить. Что линкер обычно и делает.
Так вот, в большинстве случаев это будет именно так - её всё равно выбросят (не компилятор, так линкер) и памяти она не займёт. Но здесь всё зависит от опций компилятора и линкера. А вот если явно указано static, то выбросить её может сам компилятор, линкер о ней и не узнает. Т.е. получается, что со словом static её легче выбросить и освободить память.
Общий вывод - если доступ из других файлов не нужен, надо писать static. Хуже не будет точно, а лучше - не часто, но может и быть.
Kraker, ну давайте смотреть.
Во первых, вы не перенесли функции выше использования и не прдъобявили их. В каких-то версиях IDE (напримерв 1.6.5), Вас может ждать неприятный сюрприз. По правилам языка, функция должна лиюо располагаться выше, чем используется, либо быть предобъявленной выше, первого использования.
Далее. Посмотрите на строки 96-162. Там содержатся 6 одинаковых функций, которые отличаются только числовыми пераметрами. А в строка 163-171 ещё одна, которая отличается от шести предыдущих одной строкой (вернее её отсутствием).
Т.е. мы можем вместо строк 96-171 написать так:
А строки 41-61 соответсвенно заменить на:
Сделайте это и сравните размер памяти программы.
Ну, пока хватит, потом как сделаете, ещё раз посмотрим, а то изменения больно глобальны
case ещё более читабельным будет.
Наверное проскачило , но я спрашивал как предобъявить функцию, не совсем понял как это сделать.Наверное потому , что неправельно воспринемаю void. Я думаю что void loop это основная программа где собственно все и крутится, а остальные расцениваю как подпрограммы ,поэтому где их обьявлять что то не понимаю :(
Если код который я накидал я еще как то понимаю, то с заменой от Евгения я буду разбираться оч долго,надеюсь разберусь.
как предобъявить функцию
Очень просто. Выиписываете её заголовок (без тела) и ставите точку с запятой. Заголовок - это то, что до {
Например,
Я правельно понял?
Да.
И первую строчку повыше.
Кстати, IDE именно это и делает за Вас. Потому всё и работает. А там, где не делает, там бы Вашу программу компилятор обругал бы.
Ну ,он и ругается но компилирует.
Если я внесу ваши изменения ,разве будет необходимость в обьявлении их теперь? Выже их заменили.
По поводу сервы - точно плавает длительность импульсов, а не интервал между ними ?
По поводу сервы - точно плавает длительность импульсов, а не интервал между ними ?
Сейчас загружал с планшета последний вариант, длительность вроде в норме ,но есть провалы(моргание на осцицелографе), дома грузил предыдущий вариант там скакала длительность импульсов( тоесть 90 градусов длительность 15мс вроде,а уменя плавало рывками)соответственно серва дергалась.
Евгений а можно мне разжувать так сказать что от куда в вашем коде
А то я немогу слепить картинку,просто копироввть неинтересно, хотся понять что где.
Где ловим сдвиговый регистр? И как работате серва если в servoPulse прописано чуть по другому?
Ну и чобственно что есть чтов этом
Интуитивно понимаю вроде, но от так чтоб совсем понять, так нет
Вы уж простите мне мое полное незнание но я бы понял еслиб было так( ну как понял,относительно конечно)
Это параметры функции, они могут называться как угодно и используются внутри функции. Посмотрите на вызовы - там параметры передаются, а внутри функции испольуются. Ну, и почитатйте что-нибудь про функции в Си
Доброго времени суток.
Благодаря Евгению получился у меня вот такой кодик.
Проблемму с дерганием сервы решила библиотека PWMServo.h найденная на просторах форума.
Всем спасибо.
Пойду читать про функции :)