arduino и конденсатор

Обсуждаем контроллеры компании Atmel.
Ответить
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

goldenandy, в конкретно данном случае (обсуждаемом выше) дело не в static, а именно в inline. Не важно как, просто inline далеко не всегда становится inline. А в случае с оптимизацией -Os если вызывается из прерывания даже значительно больше кода занимает из-за того, что не инлайнится по факту.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="goldenandy",url="/forum/viewtopic.php?p=3725587#p3725587"]И кто-нибудь, подскажите сакральный смысл static в определении функций в чистом Си (не ++)?[/uquote]
Если функция или переменная не-static, она будет иметь глобальную видимость, что может привести к косякам и UB. В лучшем случае линкер выругается, что в нескольких файлах переменная носит одно и то же имя и инициализирована.
Кроме того, читающему код сразу понятно: если функция объявлена static, она используется только в этом файле, а наружу не торчит. Если же она без static, ее можно будет вызвать откуда угодно (даже если ее объявления в заголовочном файле нет).
В случае же inline-функций все точно наоборот: их реализацию втыкают прямо в заголовочный файл, поэтому без static линкер, мягко говоря, охренеет, если будет собирать такое.. Но вот то, что вы сказали static inline, совершенно не гарантирует, что компилятор стопудово заинлайнит эту функцию! Как уже выше говорили, для этого нужен gcc'шный атрибут always_inline. В sdcc, кажись, такого атрибута нет — поэтому 5051, STM8, пики и некоторые другие МК — в пролете!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

Eddy_Em, Я всегда считал, что видимость у функций определяется наличием прототипа в заголовочном файле.
На что я неоднократно и нарывался, забывая прописать прототип в заголовочном файле....
Или имеется ввиду, что если объявить функцию static, то из других модулей к ней нельзя будет обратиться, даже задекларировав ее прототип как extern?

ЗЫ. Просто я наСИльник-самоучка, всю жизнь, начиная с 10 класса, был PASквилянтом.... И некоторые вопросы изучаю методом научного тыка. Про static -переменные знал. Но не думал, что это и к функциям относится....
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

goldenandy, нет, без static они будут глобальными. Равно как и переменные. И если где-то объявить эту функцию, ее там можно и использовать (даже если в заголовочных файлах пусто). Аналогично с переменными: если где-то написали int x, забыв про static, из любого другого файла можно, заранее написав extern int x, обращаться к этой переменной.
goldenandy писал(а):Или имеется ввиду, что если объявить функцию static, то из других модулей к ней нельзя будет обратиться, даже задекларировав ее прототип как extern?
Именно так.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 141
Зарегистрирован: Чт сен 26, 2019 20:42:21

Сообщение oleg_4rk »

[uquote="goldenandy",url="/forum/viewtopic.php?p=3725587#p3725587"]По "оптимальной схеме"
Господа, откуда тут будет плавное зажигание-угасание?[/uquote]

Да не, норм работает. Я правда не совсем так сделал:
- слева от R1 поставил диод (я пин с 1 на 0 переключаю)
- R1 10 КОм
- R2 убрал
- Конденсатор на 220 мкФ
Dimon456, Т.е. с точки зрения оптимизации gcc static в случае inline-функций - зло?
static тут ни при чём. Разговор про inline был :-).
И кто-нибудь, подскажите сакральный смысл static в определении функций в чистом Си (не ++)?
Про это уже написали, вроде.

Добавлено after 5 minutes 15 seconds:
Прототип это информация для компилятора для контроля корректности вызова функции(все ли параметры указаны, правильный ли тип).
static - это для линкёра. Если в двух .o-файлах функции с одинаковым именем, то не понятно какую вызывать. Если же они static, то область видимости их ограничена .o-файлом. Вне его их не существует и пересечения имён не будет.

Добавлено after 2 minutes 13 seconds:
Т.е. можно провести такой эксперимент. Сделать прототип функции без задания функции и вызвать её из main. Скомпилировать. Компилятор создаст .o-файл без вопросов(т.к. эта функция наверняка в другом .o-файле будет - он не знает, что её нет). А вот линкёр, задача которого соединить все .o-файлы в единый бинарник уже, не найдя функции, которую вызывают, будет ругаться.
Ардуинщик. Не шарю в электронике.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1925
Зарегистрирован: Чт июл 28, 2016 07:58:37
Откуда: Kyiv, UA

Сообщение GoldenAndy »

oleg_4rk, спасибо за ликбез.

А по поводу емкости - да , оно будет работать и в случае каскада с общим эммитером. Только что бы добиться плавного зажигания - вы поставили аж 220 мкф.
И светодиод зажигается у вас за достаточно короткий период времени. Навскидку - где то за треть секунды. Поскольку конденсатору всего то и надо, что бы зарядиться до 0.7 вольта.
В случае эммитерного повторит еля зажигание светодиода у вас будет длиться в несколько раз дольше, поскольку вы не ограничиваете напряжение на конденсаторе переходом база-эммитер. Мало того, в случае схемы эммитерного повторителя вы еще получите и высокое входное сопротивление каскада, т.е. на процессы заряда-разряда конденсатора транзистор будет оказывать малое влияние.
ИзображениеИзображение
Изображение
 
Telegram               Лучшая благодарность ->
[+]
Контактная информация:
Реклама
Ответить

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