Обсуждаем контроллеры компании Atmel.
Ответить

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 07:31:37

[quote="mazda"] когда вы ВСЕ ЗАГОЛОВОЧНИКИ включаете во ВСЕ ИСХОДНИКИ


я сказал не это, в главном файле я подключаю один инклюд conf.h

и в нём сначала указываю частоту потом доп настройки для таймеров, юарт и тд и потом все нужные библиотеки.

вы же видимо представили как я пихаю заголовок .h c с какими то опережающими объявлениями функций, я так вообще стараюсь не делать, за всё время работы опережающее объявление испрользовал пару раз всего

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 07:43:06

mazda писал(а):я сказал не это, в главном файле я подключаю один инклюд conf.h
выражайтесь точнее.

я не понимаю: у вас проект из 20 файлов, и только в одном "главном" вы включаете свой config.h? а как другие узнают о частоте, например?

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 07:54:00

main.c:


main_def_func.h:


proc_outputs.h


Проблема была только один раз, почему-то определение из одного модуля не работало в в другом. Добавил инклюд на тот модуль и все.

proc_device.h:

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 08:00:14

Demiurg писал(а):...
ну вот это то самое, о чем я и говорил: вместо того, чтобы максимально избегать глобальной видимости объектов, вы делаете все объекты глобально видимыми. это не комильфо.

хорошая практика - подключать в любой сишный файл только те заголовки, которые необходимы для успешной его компиляции. если модулю sound.c (генерация звука) не нужны для компиляции сведения из bunttons.h (описания кнопок и т.п.), то в sound.c не должно быть прямо или косвенно buttons.h. в вашем случае это не так благодаря тому, что все заголовки проекта собраны в едином "общем" заголовке, который вы суете во все исходники...

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 08:29:27

Я сделал так по той причине, что указал общий инклюд и забыл. Не нужно вспоминать, какие файлы подключать. И нет простыни с расписанным списком инклюдов.
А с той проблемой просто нужно разобраться в чем причина. Некогда пока разбираться. Даже если и не решу, то проблема уже обойдена и меня устраивает.

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 09:03:13

всегда есть причины делать не самым лучшим способом...

читали книжку "Веревка достаточной длины, чтобы выстрелить себе в ногу"? если нет - почитатйте.

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 09:33:03

ARV, если в первой строке программы написано include conf.h то первая его строка и будет первой строкой всей программы, если в conf.h первой строкой идёт F_CPU то его видят вообще все подключенные инклюды, область видимости макросов define - везде после него.

Если всё равно не вяжется, поставьте опцию only preprocessor, откомпильте простой проект и посмотрите что как раскрылось и куда поставилось.

Ограничивать области видимости вижу смысл только на слабых системах, что бы хоть как то ускорить компиляцию, не более того.

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 10:10:04

mazda писал(а):Ограничивать области видимости вижу смысл только на слабых системах, что бы хоть как то ускорить компиляцию, не более того
несколько секунд компиляции ничто по сравнению с часами поиска ошибок.

еще раз:
ARV писал(а):читали книжку "Веревка достаточной длины, чтобы выстрелить себе в ногу"? если нет - почитатйте

ограничивать область видимости следует для исключения потенциальных проблем, не более того. это как бы правила хорошего стиля программирования на Си.

mazda писал(а):посмотрите что как раскрылось и куда поставилос
мне в этом нет нужды, я отлично представляю себе весь процесс обработки кода препроцессором и последующую компиляцию.

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 10:23:47

тут имхо лучше отцов основателей почитать (K&R), начинающие обычно с этого начинают:
4.5. Заголовочные файлы
.....
Существует еще один момент, о котором следует предупредить читателя, — определения и объявления
совместно используются несколькими файлами. Мы бы хотели, насколько это возможно, централизовать эти
объявления и определения так, чтобы для них существовала только одна копия. Тогда программу в процессе
ее развития будет легче и исправлять, и поддерживать в нужном состоянии. Для этого общую информацию
расположим в заголовочном файле calc.h, который будем по мере необходимости включать в другие
файлы.

.....

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 11:05:54

со времен отцов-основателей воды много утекло... интересно, как при таком подходе можно узнать, где реализована та или иная объявленная "в общем" заголовке функция? писать детальные комментарии?

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 11:14:47

В модулях специфичные функции. Функции, которые объявлены в общем файле могут использоваться в любом модуле. Или в нескольких.
sprintf вы же используете в разных модулях, и не испытываете при этом дискомфорта. Не так ли?

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 11:26:41

возможно взаимное недопонимание связано с тем что говорим о разных языках и компиляторах?

я говорю тут только про си++11 на компиляторе GCC4.5 в IDE Atmel Studio 6.2

то есть у меня в коде запись PORTB = ({int x = 6; int y = 7; x+y}); будет выполняться, это работает не на каждом си++

ещё можно например посчитать количество объектов обращаясь к ещё не созданному объекту шаблона, и потом так его и не создать и это не ошибка, и не костыль а возможность плюсов. на ней организются компайл-тайм счётчики.

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 11:35:23

много утекло...

да утекло - сейчас понапридумывали иде всяких, где мышку навел - все увидал, а уж правой кнопкой даже скакнуть куда надо можно:
Изображение
вот раньше в консоли все как то делалось... :)

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 14:43:05

Demiurg писал(а):sprintf вы же используете в разных модулях, и не испытываете при этом дискомфорта. Не так ли?
в каждом модуле при этом я делаю #include <stdio.h>, чтобы пользоваться sprintf-ом. именно в каждом, а не в некоем "общем" для каждого, иначе независимость модуля не обеспечивается.

mazda писал(а):ещё можно например посчитать количество объектов обращаясь к ещё не созданному объекту шаблона, и потом так его и не создать и это не ошибка, и не костыль а возможность плюсов. на ней организются компайл-тайм счётчики
ну так я давно и говорю - использование С++ в качестве мощного препроцессора. счетчиков и итераторов времени компиляции очень не хватает в "стандартном" сишном препроцессоре...

oleg110592 писал(а):сейчас понапридумывали иде всяких, где мышку навел - все увидал, а уж правой кнопкой даже скакнуть куда надо можно
как это поможет с глобальной видимостью объектов в случае пихания всего в "общий" заголовочник? или не важно что, важно вставить словечко?

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 15:00:53

как это поможет с глобальной видимостью объектов в случае пихания всего в "общий" заголовочник? или не важно что, важно вставить словечко?

ответ был на "как при таком подходе можно узнать, где реализована та или иная объявленная "в общем" заголовке функция?", а не "как это поможет с глобальной видимостью" - я так, например узнаЮ, как и написал, причем это работает для любой функции. На форумах обычно не "вставляют" а обмениваются опытом. :)))

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 15:38:32

oleg110592 писал(а):ответ был
вопрос был о том, как глядя в заголовок, понять, где эта функция реализована, а не увидев реализацию этой функции в файле, наведением мыша на неё увидеть, где она описана. заголовки обычно короткие и достаточно информативные для анализа общей структуры проекта. если не поддерживать заголовки в порядке, придется анализировать проект по структуре исходников, что даже с IDE достаточно не тривиальная задача.

самый логичный способ - создавать заголовок, совпадающий по названию с модулем, но с расширением .h - тогда вопросов, к чему относится содержимое заголовка, не возникает принципиально.

логичная, с моей точки зрения, такая структура:
1. заголовок описания внешних сигналов. описаны порты и пины для общения с внешней схемой.
2. конфигурационный заголовок. описаны макросы, меняющие процесс сборки проекта, например, включающие или отключающие те или иные блоки кода и даже целиком модули. правильнее это делать при помощи возможностей makefile, но по вышеозвученным причинам я этого не умею делать.
3. пары файлов "модуль-заголовок"

в каждом модуле должно быть указано подключение тех заголовков проекта, которые необходимы для компиляции этого модуля. подключение заголовков, никак не влияющих на компиляцию модуля (типа просто до кучи) не должно осуществляться.

теоретически в моем видении проекта есть место, куда вписать F_CPU, но, так как IDE проекта уже содержит в том или ином виде это значение, я так не делаю и другим не советую - не нужно плодить сущности и тем более задваивать их.

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 16:36:32

удалились от темы имхо - изначально вопрос был про #define F_CPU и функции _delay_us() _delay_ms() (см. название темы и первый пост), функции то стандартные, знамо - где искать. Человеку надо было помочь где обозначить #define F_CPU, каждый высказал свое мнение - можно в иде, можно в заголовке, например, если я пишу в блокноте и компилирую в командной строке - в блокнот F_CPU не вставишь. Теперь рассматриваются какие то другие функции и "как понять, где эта функция реализована". F_CPU в иде при наведении тоже видно и по F3 или правой кнопкой мышки перейти к реализации можно тоже легко:
Изображение

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 17:11:10

команду из вас не слепить, кто в лес кто по дрова, стыдно должно быть.
я осушу это болото.

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 17:31:13

у Чена хорошо задержки сделаны в подключаемом асм файле - там в мэйкфайле DEFS = F_CPU=16000000 (без UL почему то) оно не только компилятору Си передается а и ассемблеру:
http://elm-chan.org/works/sd8p/report.html
з.ы. переменные там напрямую вроде в функции можно

Re: #define F_CPU _delay_us(); _delay_ms();

Вт ноя 21, 2017 18:50:21

oleg110592 писал(а):у Чена хорошо задержки сделаны в подключаемом асм файле
по моему мнению, при всей удивительной гениальности Чена, код из-под его рук выходит ужасным... Petit FatFS недавно внимательно изучал - ужас! никогда не посоветую никому так писать, даже если результат лучше всех!

oleg110592 писал(а):там в мэйкфайле DEFS = F_CPU=16000000
я об этом давным давно сказал - makefile наиболее подходящее место для F_CPU, однако, если проследить его путь из makefile, то можно увидеть, что все ээто попадает на прокорм компилятору и становится доступным в исходниках при помощи директивы компилятора -D, о чем я так же давным давно сказал.
Ответить