Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 14.05.2018, 21:29  
Исбанни
Прописка
 
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
Исбанни на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

Вызов функции можно назвать подпрограммой, а можно и не называть. Более правильно всё же оставить термин "функция". Потому что, как сами же заметили, функция может инлайниться, то есть ее код не вызывается отдельно методом перехода по адресу, а вставляется на этапе компиляции целым куском кода и выполняется линейно.

Сообщение от parovoZZ Посмотреть сообщение
А как же в ней управлять инициализацией интерфейсов, если устройств на них чуть больше, чем одно?
Так в один и тот же момент времени через один интерфейс вы обращаетесь не более, чем к одному устройству на интерфейсе.
Например, интерфейс I2C. Все устройства, сидящие на одной такой шине, имеют общие настройки - частота (100k, 400k, 1М), ширина адреса.
U(S)ART - тоже одинаковый тип, одинаковая скорость, одинаковые настройки стоп-битов.
SPI - желательно тоже иметь одинаковую скорость ширину для всех устройств на общей шине.

Для инита хардвара я обычно выделяю связанную пару файлов hardware_init.c, hardware_init.h, и там и прописываю вызовы функций инициализаций драйверов.
Для случая с общими интерфейсами можно вызывать один раз функцию с обобщенными настройками.
Пример файла hardware_init.c:
Код:
#include "../Drivers/EDP154_Drv/interface_drv.h" // драйвер интерфейса e-ink дисплея
#include "../Drivers/I2C_drv.h" // драйвер I2C

void NormalHardwareStart(void)
{
    EPD154_Interface_Init();  // инит интерфейса дисплея
    I2C_Init();    // инит I2C
}
...и вызов ф-ции NormalHardwareStart() из main в самом начале прекрасно настраивает периферию МК на работу.

Касательно энергосбережения, вот потому ф-ция и называется NormalHardwareStart, потому что используется для запуска в нормальном рабочем режиме. Можете прописать функцию AbridgedHardwareStart c сокращенным запуском периферии МК при работе в энергосберегающем режиме. Например, в ней настраивается только UART для работы в режиме ожидания приема команды. Как только нужная команда принята, вызывается NormalHardwareStart.
Режимы энергосбережения зависят от конкретного микроконтроллера. Я ориентируюсь на STM32.
Реклама:
Исбанни вне форума  
Непрочитано 15.05.2018, 12:29  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

У меня не много по-другому сделано. Я возвращаю указатель на void. Функция создает драйвер и возвращает указатель. Внутри драйвера есть функции вызова. Если драйвер не создан, возвращается ноль или функции возвращают код ошибки.
Easyrider83 вне форума  
Непрочитано 15.05.2018, 23:00  
parovoZZ
Почётный гражданин KAZUS.RU
 
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

Сообщение от Исбанни Посмотреть сообщение
Для инита хардвара я обычно выделяю связанную пару файлов hardware_init.c, hardware_init.h, и там и прописываю вызовы функций инициализаций драйверов.
Очень хорошая идея.
parovoZZ вне форума  
Непрочитано 16.05.2018, 01:10  
parovoZZ
Почётный гражданин KAZUS.RU
 
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

Сообщение от STM32F0 Посмотреть сообщение
Завидная древовидность, типа самотестирования. На выходе - ноль, ноль, ноль, ноль и по телетайпу "МК не обнаружен или живёт своей жизнью и просит его не беспокоить".
бугага
parovoZZ вне форума  
Непрочитано 16.05.2018, 01:13  
parovoZZ
Почётный гражданин KAZUS.RU
 
Регистрация: 15.11.2010
Сообщений: 2,374
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

Сообщение от mike-y-k Посмотреть сообщение
вызов функции уже не обращение к подпрограмме?
Раз уж здесь собрались кандидаты наук, то здесь спрошу.

Вызов функции внутри обработчика прерывания не есть выход из обработчика прерывания?
parovoZZ вне форума  
Непрочитано 16.05.2018, 03:11  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

Сообщение от parovoZZ Посмотреть сообщение
Вызов функции внутри обработчика прерывания не есть выход из обработчика прерывания?
Странный вопрос, просто складывается мнение что вам еще азы нужно изучать.
Обычно прерывание должно выполняться как можно быстро,установка флага или бита для индикации в основной программе, что произошло определенное событие и главная программа или цикл основной уже должен что то сделать.
Вы хоть свой пример покажите, на чем пишете, какой микропроцессор, что хотите изобразить.
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 16.05.2018, 03:31  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

parovoZZ, вызов функции таки подразумевает возврат на следующую за вызовом команду. В обработчике прерывания таким не занимаются - там разве что данные из порта прочитать можно, а обычно это просто работа с флагами.
А вот уже в свободное от обработки прерываний время можно и функции повязывать.
Собственно обработчик прерывания сам является обычной функцией. И выход из него - это его return. Вызов внутри него функции не сможет привести к выходу из обработчика в общем случае, кроме ситуации явной манипуляции с адресом возврата.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 16.05.2018, 08:46  
Исбанни
Прописка
 
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
Исбанни на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

Вызов сишной функции из обработчика не является выходом из прерывания. Потому что во-первых, эта функция в результате работы оптимизатора может оказаться встроена без вызова, а во-вторых, выход из прерывания подразумевает некоторые действия на аппаратном уровне, противоположные действиям при входе в прерывание.
Вызов сишной функции и возврат из нее происходит немного иначе и зависит от поведения компилятора.
С другой стороны, вызов сишной функции из прерывания - это очень удобный способ передать параметры между прерывание и основной программы, находясь при этом в прерывании
Исбанни вне форума  
Сказали "Спасибо" Исбанни
parovoZZ (17.05.2018)
Непрочитано 16.05.2018, 08:56  
Исбанни
Прописка
 
Регистрация: 21.04.2018
Сообщений: 174
Сказал спасибо: 1
Сказали Спасибо 66 раз(а) в 53 сообщении(ях)
Исбанни на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

Между прочим, выставляя в прерываниях только флаги, вы сильно снижает время реакции системы на событие.
Исбанни вне форума  
Сказали "Спасибо" Исбанни
parovoZZ (17.05.2018)
Непрочитано 16.05.2018, 09:13  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,580
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: #include - оптимальное использование директивы

Сообщение от parovoZZ Посмотреть сообщение
Вызов функции внутри обработчика прерывания не есть выход из обработчика прерывания?
Вот как сбросили флаг прерывания, так считай и вышли. А уж где это произошло — все равно. И тоже присоединяюсь к тем, кто считает, что обработчик прерывания должен занимать как можно меньше времени. Циклов 10-20 — и хватит!
Сообщение от Исбанни Посмотреть сообщение
сильно снижает время реакции системы на событие
Смотря что за событие. В подавляющем большинстве случаев достаточно в прерывании выставить флаг, а в основном цикле его обработать. Если вам с микросекундной точностью надо время внешнего прерывания засекать, то можно просто выставить глобальную переменную — время срабатывания, а затем обработать. Хотя, я и сам — тот еще рукожоп: для системы старт-финиш время по PPS с GPS корректировал внутри прерывания, что не очень-то хорошо, учитывая наличие еще уймы прерываний (хоть от того же USB).
__________________
Смерть бандеровской мразоте!
eddy вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OLED ssd1306 + STM32f030f4 miwutka Песочница (вопросы новичков) 195 07.01.2019 15:38
AVR Studio + CVAVR: директивы #include SwanSwan AVR 2 30.10.2016 18:50
Светодиоды "Straw Hat" - оптимальное использование mikesmith Отвлекитесь, эмбеддеры! 10 09.03.2014 02:28
usb cdc pic18f14k50 gromovi Proteus, KiCAD и другие ECAD 9 21.04.2013 15:31
В какой программе компелить код (подключение #include ) FedorChek Микроконтроллеры, АЦП, память и т.д 4 04.05.2009 20:00


Часовой пояс GMT +4, время: 10:04.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot