#define F_CPU _delay_us(); _delay_ms();

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

[uquote="ARV",url="/forum/viewtopic.php?p=3238425#p3238425"][quote="mazda"] когда вы ВСЕ ЗАГОЛОВОЧНИКИ включаете во ВСЕ ИСХОДНИКИ[/uquote]

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

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

вы же видимо представили как я пихаю заголовок .h c с какими то опережающими объявлениями функций, я так вообще стараюсь не делать, за всё время работы опережающее объявление испрользовал пару раз всего
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

main.c:
Спойлер

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

//==================
#include "main_def_func.h" // Заголовочные файлы, глобальные определения, общие функции.
//==================
main_def_func.h:
Спойлер

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

//==================
#ifndef MAIN_DEF_FUNC_H

#define MAIN_DEF_FUNC_H

#include "main_def_func.h"
//==================

//==================
#include <ioavr.h>
#include <intrinsics.h>
#include <stdbool.h>
#include <math.h>

#include <pgmspace.h>

#include "avrlibtypes.h"
#include "macros.h"

#include "binary.h"

#include "bcd.h"
#include "math.h"

#include "proc_device.h"

#include "events.h"
#include "soft_timers.h"

#include "kbd_drv.h"

#include "info_service.h"
#include "menu.h"

#include "proc_outputs.h"

#include "proc_errors.h"

#include "spi.h"
#include "twi.h"
//==================

//==================
#define F_CPU 16000000UL
//------------------------------------------------------------------------
#define __PROJECT_MODE_WORK__ // __PROJECT_MODE_WORK__ // __PROJECT_MODE_DEBUG__ // 
//------------------------------------------------------------------------
#define __LOGO__
//==================

//==================
#define LOW    0
#define HIGH   1
//==================

//==================
#define WDTO_15_MS 0
#define WDTO_30_MS 1
#define WDTO_60_MS 2
#define WDTO_120_MS 3
#define WDTO_250_MS 4
#define WDTO_500_MS 5
#define WDTO_1_S 6
#define WDTO_2_S 7

void wdt_enable (u08 a);

void wdt_disable (void);

void enable_interrupt (void);

void disable_interrupt (void);

void ext_int0_init (void);

void sleep_mode_init (void);
void sleep_mode_enable (void);
//==================

//==================
typedef void (*FUNC)(void);
//==================

//==================
extern void empty_func (void);

#define EMPTY_FUNC 0
//==================

//==================
#define END_TABLE 0xFF
//==================

//==================
extern void sram_copy (u08 *s_1, u08 *s_2, u08 n);
//==================

//==================
void proc_fsm_func (FUNC __flash *ptr_func, u08 s);
//==================

#endif
proc_outputs.h
Спойлер

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

//==================
#ifndef PROC_OUTPUTS_H

#define PROC_OUTPUTS_H

#include "proc_outputs.h"
//==================

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

proc_device.h:
Спойлер

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

//==================
#ifndef PROC_DEVICE_H
#define PROC_DEVICE_H

#include "proc_device.h"
#include "proc_outputs.h"
#include "main_def_func.h"
//==================
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Я сделал так по той причине, что указал общий инклюд и забыл. Не нужно вспоминать, какие файлы подключать. И нет простыни с расписанным списком инклюдов.
А с той проблемой просто нужно разобраться в чем причина. Некогда пока разбираться. Даже если и не решу, то проблема уже обойдена и меня устраивает.
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

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

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

Ограничивать области видимости вижу смысл только на слабых системах, что бы хоть как то ускорить компиляцию, не более того.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

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

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

calc.h: 
#define NUMBER '0' 
void push(double); 
double pop(void); 
int getop(char[]); 
int getch(void); 
void ungetch(int); 
main.c: 
#include <stdio.h> 
#include <stdlib.h> 
#include "calc.h" 
#define MAXOP 100 
main() { 
… 
} 
getop.c: 
#include <stdio.h> 
#include <stype.h> 
#include "calc.h" 
getop (){ 
… 
} 
stack.c: 
#include <stdio.h> 
#include "calc.h" 
#define MAXVAL 100 
int sp = 0; 
double val[MAXVAL]; 
void push(double) { 
… 
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

В модулях специфичные функции. Функции, которые объявлены в общем файле могут использоваться в любом модуле. Или в нескольких.
sprintf вы же используете в разных модулях, и не испытываете при этом дискомфорта. Не так ли?
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

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

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

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

ещё можно например посчитать количество объектов обращаясь к ещё не созданному объекту шаблона, и потом так его и не создать и это не ошибка, и не костыль а возможность плюсов. на ней организются компайл-тайм счётчики.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="ARV",url="/forum/viewtopic.php?p=3238570#p3238570"]много утекло...[/uquote]
да утекло - сейчас понапридумывали иде всяких, где мышку навел - все увидал, а уж правой кнопкой даже скакнуть куда надо можно:
Изображение
вот раньше в консоли все как то делалось... :)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

[uquote="ARV",url="/forum/viewtopic.php?p=3238789#p3238789"]как это поможет с глобальной видимостью объектов в случае пихания всего в "общий" заголовочник? или не важно что, важно вставить словечко?[/uquote]
ответ был на "как при таком подходе можно узнать, где реализована та или иная объявленная "в общем" заголовке функция?", а не "как это поможет с глобальной видимостью" - я так, например узнаЮ, как и написал, причем это работает для любой функции. На форумах обычно не "вставляют" а обмениваются опытом. :)))
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

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

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

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

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

Сообщение mazda »

команду из вас не слепить, кто в лес кто по дрова, стыдно должно быть.
я осушу это болото.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

у Чена хорошо задержки сделаны в подключаемом асм файле - там в мэйкфайле DEFS = F_CPU=16000000 (без UL почему то) оно не только компилятору Си передается а и ассемблеру:
http://elm-chan.org/works/sd8p/report.html
з.ы. переменные там напрямую вроде в функции можно
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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