C для AVR -- пишем аккуратно.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: C для AVR -- пишем аккуратно.

Сообщение Flasher »

для IARа в документации все расписано. Для AVR в AN тоже все расписано. Т.е. учиться будем с чьих-то слов, вместо того, чтобы прочитать документацию? Тогда каждое слово будет откровением.
Аватара пользователя
drvlas
Родился
Сообщения: 14
Зарегистрирован: Пн апр 19, 2010 12:42:13

Re: C для AVR -- пишем аккуратно.

Сообщение drvlas »

Не пойму, о чем речь?

Вам лично не нужны откровения? Не читайте, у нас теперь свобода.
Вы беспокоитесь обо мне, чтобы у меня не выработалась дурная привычка? Могу Вас уверить, что я умею читать документацию. Читал ее с начала 80-х, преимущественно в оригинале. Так что, спасибо за заботу, но она излишня.
Или у Вас есть глубокое убеждение, что без вкуривания многотомных мануалов и апноутов путь в программирование ДОЛЖЕН быть закрыт? На чем основано такое убеждение? Моежет не отвечать, потом... сюрприз будет :)
Ну, подумать, что у Вас просто неприязнь к товарищу avreal или зависть к тому признанию, которое мы ему отдаем, я просто не смею.

А Вы никогда не пользовались подсказками от коллег для того, чтобы освоить новое? Можете себя вспомнить "в коротких штанишках" или уже на в силах?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: C для AVR -- пишем аккуратно.

Сообщение HHIMERA »

drvlas писал(а):
HHIMERA писал(а):Ничего удивительного....
IAR уже давно перестал быть лидером... ...
Поэтому сравнения компиляторов и дают в результате +- лапоть...

Специально поискал среди Вашего шума - и нашел хоть что-то полезное. Спасибо за Ваш вклад. Но знаете, пришлось искать...

Ну тогда ещё парочку... чтобы не искал... ))))))))
1. Использовать по минимуму уникальные особенности компилятора...
2. Избегать использования недокументированных особенностей компилятора...
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: C для AVR -- пишем аккуратно.

Сообщение HHIMERA »

drvlas писал(а):Ну, подумать, что у Вас просто неприязнь к товарищу avreal или зависть к тому признанию, которое мы ему отдаем, я просто не смею.

Если для одних он Божество, то для других он такой же, как и многие другие... так понятнее??? )))))
А Вы никогда не пользовались подсказками от коллег для того, чтобы освоить новое? Можете себя вспомнить "в коротких штанишках" или уже на в силах?

Но не за каждым же чихом... иногда и своими мозгами шевелить надо...
Понимаю, вам некогда... вам "нужно спасать мир"... но всё же...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
drvlas
Родился
Сообщения: 14
Зарегистрирован: Пн апр 19, 2010 12:42:13

Re: C для AVR -- пишем аккуратно.

Сообщение drvlas »

HHIMERA писал(а):1. Использовать по минимуму уникальные особенности компилятора...
2. Избегать использования недокументированных особенностей компилятора...

Ну, второе вытекает из первого. И вообще, очень общие рекомендации. Но - спасибо! Это значительно более конструктивно, чем следующий пост.

Но появление второго постинга как раз и отбивает у меня желание вникать в Ваши советы. Тем более, что Ваш стиль с этими 100500 скобками, вопросами, многоточиями не добавляет привлекательности Вашим желчным заметкам. Блондинистый стиль, ИМХО.
И спорить с Вами на данную тему я больше не буду. И так нафлудили мы тут предостаточно. Считайте, что мне нечего ответить на все, что Вы сейчас накатаете. Со скобочками :)

С уважением,
Юра Власенко
Киев
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: C для AVR -- пишем аккуратно.

Сообщение HHIMERA »

drvlas писал(а):Но появление второго постинга как раз и отбивает у меня желание вникать в Ваши советы. Тем более, что Ваш стиль с этими 100500 скобками, вопросами, многоточиями не добавляет привлекательности Вашим желчным заметкам. Блондинистый стиль, ИМХО.

Ну... вы хоть какую-то пользу извлекли из моих постов... я из ваших - НОЛЬ!!!
Стиль комунечегосказатьнооченьхочется... ИМХО... ))))))))
И спорить с Вами на данную тему я больше не буду.

А и правильно... ваши знания вам не позволяют...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: C для AVR -- пишем аккуратно.

Сообщение shads »

drvlas писал(а):Ваш стиль с этими 100500 скобками, вопросами, многоточиями не добавляет привлекательности Вашим желчным заметкам. Блондинистый стиль, ИМХО. ..... Считайте, что мне нечего ответить на все, что Вы сейчас накатаете. Со скобочками :)

С уважением,
Юра Власенко
Киев
Брат, не распаляйся, это бесполезно. Каждый ответ на сообщения некоторых, порождает бесполезную страницу, бесполезной перепалки. Просто помни что "Если оборачиваться на лай каждой собаки, то далеко не уйдеш....."
Последний раз редактировалось shads Вс сен 16, 2012 14:19:23, всего редактировалось 1 раз.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: C для AVR -- пишем аккуратно.

Сообщение HHIMERA »

shads писал(а):Брат, не распаляйся, это бесполезно.

Спасибо, не буду... :))
Лучше расскажи о результатах... прога то хоть как-то работает??? :))
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: C для AVR -- пишем аккуратно.

Сообщение shads »

HHIMERA писал(а):
shads писал(а):Брат, не распаляйся, это бесполезно.

Спасибо, не буду... :))
Слушай, а ник ты себе подобрал в точку, не знаю что это означает, но думаю оно соответствует твоему стилю.

HHIMERA писал(а):Лучше расскажи о результатах... прога то хоть как-то работает??? :))
А какое тебе дело до проги..... Во первых, ты ни капли не добавил в ее функциональность, во вторых, это же не та программа, не тот стиль программирования который бы был достоен твоего внимания, так что проходи мимо и кончай засирать ветку.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: C для AVR -- пишем аккуратно.

Сообщение HHIMERA »

shads писал(а):А какое тебе дело до проги.....

Да никакого... результат был предсказуем заранее... только, зачем так нервничать???
"Отрицательный результат - это тоже результат." (С)
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: C для AVR -- пишем аккуратно.

Сообщение shads »

avreal поясни пожалуйста, насчет применения static к функциям, народ чето разделился на за и против.
Какие могут быть сюрпризы если пихать статик неглядя (а смысл есть, многие убедились, да и я тоже)
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: C для AVR -- пишем аккуратно.

Сообщение DX168B »

Жуть.... Шо за срач в тематическом разделе? :shock:
А по существу - советы ТС дельные. Пригодятся многим. Бывают моменты, когда в ТЗ стоит мега 8 и как не крути,
а надо впихнуть в нее огромный функционал и бутлодер и при этом памяти мало. Сталкивался с этим на днях.
На АСМе не укладывался в сроки, на Си памяти не хватало для бутлодера. Причем выжал все соки с исходника, а код бутлодера не хотел никак сжиматься в 512 слов.
Советы тов. avreal оказались как раз в тему. Удалось ужать код на 24 байта и все влезло. :beer:
Компилятор нагло инлайнил одну из функций, не смотря на выставленную оптимизацию "ужать по самое нехочу"
I am DX168B and this is my favourite forum on internet!
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: C для AVR -- пишем аккуратно.

Сообщение HHIMERA »

"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: C для AVR -- пишем аккуратно.

Сообщение DX168B »

:))) :))) :))) :)))
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: C для AVR -- пишем аккуратно.

Сообщение avreal »

Опять добрался до интернета.

Как оказалось, в программе «работает всё, кроме длинной вспышки при занесении кода».
Косяк был в простой функции мигания светодиодом.

Сначала она писалась под аргумент -- число смен состояния светодиода, т.е. для одиночной вспышки нужно было передавать count = 2, для десяти вспышек 20. Так сама функция проще :-)

Потом я решил сделать более «естественный» параметр -- число вспышек, хоть это и увеличило код :-). Строку count = 2*count - 1; добавил, но при редактировании функция приняла вид:

Код: Выделить всё

static void blink_led(uint8_t tacks, uint8_t count)
{
    count = 2*count - 1;
    ON(LED);
    do {
        TOGGLE(LED);
        delay(tacks);
    } while(--count);
}
В результате чего первая (а для одиночной -- единственная) вспышка была в пару тактов контроллера.

А надо так:

Код: Выделить всё

static void blink_led(uint8_t tacks, uint8_t count)
{
    count = 2*count - 1;
    ON(LED);
    do {
        delay(tacks);
        TOGGLE(LED);
    } while(--count);
}

Очередной архив
Вложения
mreceiver-20120919.7z
(15.85 КБ) 335 скачиваний
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: C для AVR -- пишем аккуратно.

Сообщение avreal »

shads писал(а):avreal поясни пожалуйста, насчет применения static к функциям, народ чето разделился на за и против.
Какие могут быть сюрпризы если пихать статик неглядя (а смысл есть, многие убедились, да и я тоже)
Ну разбуянились… По поводу затащить меня ещё на один форум, так это не в агитаторах дело.
Я просто (часто безуспешно) стараюсь сокращать время, потраченное на форумы. На сахаре, наверное, уже с год не показывался. Где уж ещё куда-то ввязываться.

Теперь по основному вопросу.
Давайте сначала определимся, что называть «бездумно натыкивать куда попало». Где граница «бездумности»? Может, она вовсе безгранична?
А то ведь и long для AVR «бездумно напихивать» вредно -- код сильно раздуется. И uint8_t или там unsigned char «бездумно напихивать» не дело, информация пропасть может. Если постараться, то и комментарий можно так впихнуть, что «неизвестно, чем аукнется» *)

Не «не глядя». Я четко ограничил область — функции, вызываемые только из той единицы трансляции (т.е. компилируемого файла со всеми его include), в которой они определены. Все внутренние, «служебные» функции модуля — первые кандидаты на static. Как кто-то привёл пример на том форуме — функция обмена одним битом в модуле поддержки 1-Wire. Применение static к таким функциям ничего не меняет в остальной программе.
Если же функция таки откуда-то ещё вызывается, то линкер ругнётся, программа не соберётся. Нужно будет подумать (во сюрприз!), почему это она вызывается, если начало казаться, что она внутренняя в модуле. И либо снять static, либо переопределить интерфейс к модулю.
В принципе, во включаемом файле могут быть и функции «с телами» и при включении в несколько других файлов вызываться они будут из разных единиц трансляции. Без static будет конфликт имён, линкер не даст собрать. Со static конфликта не будет, но это будут разые копии одной функции (на уровне объектного кода они будут иметь разные имена), что невыгодно по размеру.

Во вторых, пусть кто-то приведёт конкретный пример, когда применение static приведёт к «трудноуловимым глюкам» скомпилированной программы. Причём именно по вине слова static, а не по вине более ранних ошибок, заметённых под коврик отсутствием явного ограничения области видимости для функций, видимость которых и должна быть ограничена по сути проекта. А то сколько бы много я примеров не приводил — всегда можна будет сказать «а в x1 каком варианте при x2 каких условиях таки может x3 что получиться». А так — пусть приведут один пример.

С моей точки зрения, «не писать static, так как это неизвестно чем аукнется» — это не
    не писать бездумно static
а
    бездумно не писать static


*) Кстати, когда-то была интересная задачка — определить во время выполнения программы, была при компиляции включена поддержка вложенных комментариев или нет (борландовские компиляторы имели вредный ключик -C для разрешения вложенных комментариев). Моё решение

Код: Выделить всё

printf("Nested comments is %s\n", */*/**/"*/"/*"/**/ == '*' ? "OFF" : "ON"); 
Во… Судя по получившейся раскраске, в php тоже вложенные комментарии не допускаются :))
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: C для AVR -- пишем аккуратно.

Сообщение avreal »

p.s. А чего это на wasm.ru возле «Истории одного байта» стоит 2003 год?
Это ж максимум начало 2001-го. А то и гораздо раньше, просто в эху попало в 2001-ом (сам текст, содержание, к началу 90-ых относится).

Эх, сколько там в обсуждении знакомых имён…
И Валера Журило еще жив был, он осенью 2001-го от инфаркта умер… А летом мне, послеинфарктному, всё в метро место уступал…
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: C для AVR -- пишем аккуратно.

Сообщение HHIMERA »

avreal писал(а):С моей точки зрения, «не писать static, так как это неизвестно чем аукнется» — это не
    не писать бездумно static
а
бездумно не писать static

Бездумно и есть бездумно - это как на диахтунге... сначала, как обезьяны с гранатами, тыкали наперегонки static куда попало, а потом, почесав затылок... "а вдруг рванёт?"... :)))
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: C для AVR -- пишем аккуратно.

Сообщение shads »

Насколько я понял из последнего пояснения avreal, static лепить к функции настолько же опасно как и хранить данные в unsigned char.....
Там тоже могут быть проблЭмы - информация пропасть может :)

А насчет обезьян..... они еще и с калаша хорошо стреляют http://www.youtube.com/watch?v=z6-hJlaZTRs
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: C для AVR -- пишем аккуратно.

Сообщение HHIMERA »

shads писал(а):А насчет обезьян.....

Хорошо... назовём это стадным инстинктом... :)

Вот яркий пример... goto...
Сколько "ярких" эпитетов было сказано против его применения...
Здесь
http://forum.easyelectronics.ru/viewtop ... =4&t=11143
... и не только...

Заглянем в pff.c от Чена...
pf_read, pf_write и pf_lseek содержат goto...
Попробуйте обвинить Чена в незнании СИ... :)))

Ещё пример...
viewtopic.php?p=1395178#p1395178
2. Вместе с макросом _BV в библиотеке определены также еще несколько полезных макросов для работы с битами. Один из них:

#define loop_until_bit_is_set( sfr, bit ) do { } while (bit_is_clear(sfr, bit))

ожидает в пустом цикле, пока в регистре ввода-вывода sfr установится бит bit. Грех не воспользоваться готовеньким, тем более что библиотечные элементы, как правило, хорошо оптимизированы и протестированы.

Слепая вера в истинность и непогрешимость... "все так делают, значит это правильно"... :)))
В данном случае макрос скрывает суть происходящего, а многие просто слепо поверят в то, что "библиотечные элементы, как правило, хорошо оптимизированы и протестированы"... (у меня, лично, по опыту общения с различными либами, такое архисмелое утверждение просто вызывает ржач...)
Вся фишка в том, что этот цикл, при определённых условиях, может стать "вечным"... что, в итоге, может обернуться либо зависанием, либо перезапуском, если включен WDT...
http://www.pic24.ru/doku.php/osa/articl ... ut_errors#правила_для_функций
Часто в программах встречаются участки кода, которые потенциально могут привести к зависанию. Самый распространенный пример – ожидание готовности или подтверждения при работе с внешней периферией
Если произошла непредвиденная ситуация (обрыв линии, короткое замыкание, конденсат и пр.), то из этого цикла мы никогда не выйдем. (Разве что только WDT сработает). Поэтому нужно всегда предусматривать аварийный выход из таких циклов. Можно это делать с помощью таймера.
Правда, целый таймер выделять для этого иногда накладно, и есть смысл работать с глобальной переменной, которая будет уменьшаться в прерывании по таймеру

Всех неверующих и думающих "это мне и нах не нужно, у меня такого просто быть не может" отсылаю опять к исходникам Чена... :))

Предвкушая вопрос одиозных личностей "А к чему это всё?", напоминаю, тема называется "C для AVR -- пишем аккуратно."...
"Я не даю готовых решений, я заставляю думать!"(С)
Ответить

Вернуться в «AVR»