arduino и конденсатор
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
goldenandy, в конкретно данном случае (обсуждаемом выше) дело не в static, а именно в inline. Не важно как, просто inline далеко не всегда становится inline. А в случае с оптимизацией -Os если вызывается из прерывания даже значительно больше кода занимает из-за того, что не инлайнится по факту.
- Реклама
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
[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, пики и некоторые другие МК — в пролете!
Если функция или переменная не-static, она будет иметь глобальную видимость, что может привести к косякам и UB. В лучшем случае линкер выругается, что в нескольких файлах переменная носит одно и то же имя и инициализирована.
Кроме того, читающему код сразу понятно: если функция объявлена static, она используется только в этом файле, а наружу не торчит. Если же она без static, ее можно будет вызвать откуда угодно (даже если ее объявления в заголовочном файле нет).
В случае же inline-функций все точно наоборот: их реализацию втыкают прямо в заголовочный файл, поэтому без static линкер, мягко говоря, охренеет, если будет собирать такое.. Но вот то, что вы сказали static inline, совершенно не гарантирует, что компилятор стопудово заинлайнит эту функцию! Как уже выше говорили, для этого нужен gcc'шный атрибут always_inline. В sdcc, кажись, такого атрибута нет — поэтому 5051, STM8, пики и некоторые другие МК — в пролете!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
Eddy_Em, Я всегда считал, что видимость у функций определяется наличием прототипа в заголовочном файле.
На что я неоднократно и нарывался, забывая прописать прототип в заголовочном файле....
Или имеется ввиду, что если объявить функцию static, то из других модулей к ней нельзя будет обратиться, даже задекларировав ее прототип как extern?
ЗЫ. Просто я наСИльник-самоучка, всю жизнь, начиная с 10 класса, был PASквилянтом.... И некоторые вопросы изучаю методом научного тыка. Про static -переменные знал. Но не думал, что это и к функциям относится....
На что я неоднократно и нарывался, забывая прописать прототип в заголовочном файле....
Или имеется ввиду, что если объявить функцию static, то из других модулей к ней нельзя будет обратиться, даже задекларировав ее прототип как extern?
ЗЫ. Просто я наСИльник-самоучка, всю жизнь, начиная с 10 класса, был PASквилянтом.... И некоторые вопросы изучаю методом научного тыка. Про static -переменные знал. Но не думал, что это и к функциям относится....
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
goldenandy, нет, без static они будут глобальными. Равно как и переменные. И если где-то объявить эту функцию, ее там можно и использовать (даже если в заголовочных файлах пусто). Аналогично с переменными: если где-то написали int x, забыв про static, из любого другого файла можно, заранее написав extern int x, обращаться к этой переменной.
Именно так.goldenandy писал(а):Или имеется ввиду, что если объявить функцию static, то из других модулей к ней нельзя будет обратиться, даже задекларировав ее прототип как extern?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 141
- Зарегистрирован: Чт сен 26, 2019 20:42:21
[uquote="goldenandy",url="/forum/viewtopic.php?p=3725587#p3725587"]По "оптимальной схеме"
Господа, откуда тут будет плавное зажигание-угасание?[/uquote]
Да не, норм работает. Я правда не совсем так сделал:
- слева от R1 поставил диод (я пин с 1 на 0 переключаю)
- R1 10 КОм
- R2 убрал
- Конденсатор на 220 мкФ
.
Добавлено after 5 minutes 15 seconds:
Прототип это информация для компилятора для контроля корректности вызова функции(все ли параметры указаны, правильный ли тип).
static - это для линкёра. Если в двух .o-файлах функции с одинаковым именем, то не понятно какую вызывать. Если же они static, то область видимости их ограничена .o-файлом. Вне его их не существует и пересечения имён не будет.
Добавлено after 2 minutes 13 seconds:
Т.е. можно провести такой эксперимент. Сделать прототип функции без задания функции и вызвать её из main. Скомпилировать. Компилятор создаст .o-файл без вопросов(т.к. эта функция наверняка в другом .o-файле будет - он не знает, что её нет). А вот линкёр, задача которого соединить все .o-файлы в единый бинарник уже, не найдя функции, которую вызывают, будет ругаться.
Господа, откуда тут будет плавное зажигание-угасание?[/uquote]
Да не, норм работает. Я правда не совсем так сделал:
- слева от R1 поставил диод (я пин с 1 на 0 переключаю)
- R1 10 КОм
- R2 убрал
- Конденсатор на 220 мкФ
static тут ни при чём. Разговор про inline былDimon456, Т.е. с точки зрения оптимизации gcc static в случае inline-функций - зло?
Про это уже написали, вроде.И кто-нибудь, подскажите сакральный смысл static в определении функций в чистом Си (не ++)?
Добавлено after 5 minutes 15 seconds:
Прототип это информация для компилятора для контроля корректности вызова функции(все ли параметры указаны, правильный ли тип).
static - это для линкёра. Если в двух .o-файлах функции с одинаковым именем, то не понятно какую вызывать. Если же они static, то область видимости их ограничена .o-файлом. Вне его их не существует и пересечения имён не будет.
Добавлено after 2 minutes 13 seconds:
Т.е. можно провести такой эксперимент. Сделать прототип функции без задания функции и вызвать её из main. Скомпилировать. Компилятор создаст .o-файл без вопросов(т.к. эта функция наверняка в другом .o-файле будет - он не знает, что её нет). А вот линкёр, задача которого соединить все .o-файлы в единый бинарник уже, не найдя функции, которую вызывают, будет ругаться.
Ардуинщик. Не шарю в электронике.
- Реклама
oleg_4rk, спасибо за ликбез.
А по поводу емкости - да , оно будет работать и в случае каскада с общим эммитером. Только что бы добиться плавного зажигания - вы поставили аж 220 мкф.
И светодиод зажигается у вас за достаточно короткий период времени. Навскидку - где то за треть секунды. Поскольку конденсатору всего то и надо, что бы зарядиться до 0.7 вольта.
В случае эммитерного повторит еля зажигание светодиода у вас будет длиться в несколько раз дольше, поскольку вы не ограничиваете напряжение на конденсаторе переходом база-эммитер. Мало того, в случае схемы эммитерного повторителя вы еще получите и высокое входное сопротивление каскада, т.е. на процессы заряда-разряда конденсатора транзистор будет оказывать малое влияние.
А по поводу емкости - да , оно будет работать и в случае каскада с общим эммитером. Только что бы добиться плавного зажигания - вы поставили аж 220 мкф.
И светодиод зажигается у вас за достаточно короткий период времени. Навскидку - где то за треть секунды. Поскольку конденсатору всего то и надо, что бы зарядиться до 0.7 вольта.
В случае эммитерного повторит еля зажигание светодиода у вас будет длиться в несколько раз дольше, поскольку вы не ограничиваете напряжение на конденсаторе переходом база-эммитер. Мало того, в случае схемы эммитерного повторителя вы еще получите и высокое входное сопротивление каскада, т.е. на процессы заряда-разряда конденсатора транзистор будет оказывать малое влияние.





