Страница 1 из 2
Проблемма при отладке
Добавлено: Пт дек 03, 2010 11:23:18
SABRAT
Подскажите ГУРУ AVR Studio и WinAVR, как быть.
Последнюю неделю активно перелажу с CodeVision на AVR Studio+WinAVR. Наваял небольшой проэктик. Вроде работает, компилируется без ошибок. Но я люблю чтобы программа была модульная, то есть отдельные функции были вынесены в отдельные файлы, которые, в свою очередь включены через #include в основной файл. Дабы улучьшить читабельность основной программы. Как это сделать, вроде разобрался, но не понятно почему при пошаговой отладке программы курсор указателя выполнения операторов не переходит на функции подключённых файлов. Нормально пошаговая отладка происходит только когда весь проэкт одними файлом. Также я не могу установить breakpoint в подключеннх файлах.
Использую такой софт:
AVR Studio 4.18 Build 716
WinAVR 20100110
Пример проэкта во вложении.
Заранее благодарю.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 11:28:40
ARV
уважаемый, вы допустили одну ошибочку: внесли код "модуля" в файл-заголовок - это неправильно.
файл заголовок, подключаемый при помощи #include, должен содержать только определения макросов (констант), типов и прототипы функций модуля, а сам модуль оформляется в виде сишного файла (расширение с) и подключается к проекту. то есть в проекте у вас должно быть два сишных файла, а не один, как сейчас.
а вообще извините, но стиль ужасный... не смотря на желание повысить читабельность программы, вы пишите крайне нечитабельно...
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 11:48:49
SABRAT
Благодарю за ответ. Стиль не ужасный у начинающего редко бывает - работаю над собой.
А как подключить файл с расширением *.с? Вынес функции в файл с расширением *.с попробовал подключить через #include и проэкт перестал компилится.
Что я опять делю не так?
Заранее благодарю.
Изменённый проэкт во вложении.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 11:52:23
SABRAT
Протупил, извините. Не сохранил изменения в новом файле. Вроде всё откомпилировалось...проверяю...
Всёрвно между файлами курсор не переходит при пошаговой отладке...блин...где я что нне так делаю?
Новый проэктик во вложении.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:08:52
Liv
SABRAT По WinAVR ничего не скажу - не знаю. Сам использую IAR. А вот по стилю могу сделать несколько замечаний.
Используйте отступы. Иначе текст смотрится очень плохо.
Отделяейте знаки арифметических и логических операций пробелами.
Вот пример:
Код: Выделить всё
void func1(void)
{
if (DOUT[1] & 0b10000000)
{
PORTB |= 0b00000100;
}
else
{
PORTB &= 0b11111011;
}
}
Не используйте в тексте "магических" цифр типа 0b10000000. Все численные значения должны быть определены в виде констант, их имена должны бвть написаны заглавными буквами.
Ну и еще: неужели трудно вместо vremya, cifra, massiv написать time, digit, array? Если Вы избрали для себя занятие в виде программирования, то должны в какой-то мере знать язык тех людей, которые все это создали.
ARV Что именно помещать в h-файлах, вопрос философский. Я обычно помещаю только то, что обычно находится в секции public при описании класса. Прототипы локальных функций размещаю в c-файле. Тогда взглянув на h-файл сразу виден интерфейс модуля, да и видимость внутренних функций модуля ограничивается самим модулем.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:09:15
ARV
снова повторюсь: вы не должны инклюдить сишные файлы - их надо ДОБАВЛЯТЬ
В ПРОЕКТ!!! инклюдить надо только ХИДЕРЫ!!!! ваш проект очень неудобный, плохо написан, но я постарался оформить его более-менее "по правилам" - как говорится, найдите 10 отличий

Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:13:46
ARV
Liv писал(а):ARV Что именно помещать в h-файлах, вопрос философский. Я обычно помещаю только то, что обычно находится в секции public при описании класса. Прототипы локальных функций размещаю в c-файле. Тогда взглянув на h-файл сразу виден интерфейс модуля, да и видимость внутренних функций модуля ограничивается самим модулем.
во-первых, речь не о С++ с его классами и прочим - а о Си.
во-вторых, есть определенные правила, чего не должно быть в хидере: определения переменных, определения функций (исключение - функции в виде макросов).
в-третьих, есть правило оформления хидера "рамкой" #ifndef - #endif
несоблюдение этих правил приводит к путанице, как минимум, и даже к ошибкам - в крайнем случае.
отсюда следует, что можно (или нужно) помещать в хидер... не так ли?
разумеется, все это не догма, но то, чему следует большинство программистов - это уже почти закон
P.S. на счет прототипов локальных функций - само собой, логичнее и
правильнее делать их внутри самого модуля. но товарищ намешал много всего - там я для примера все функции описал в хидере...
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:15:56
SABRAT
ARV писал(а):снова повторюсь: вы не должны инклюдить сишные файлы - их надо ДОБАВЛЯТЬ
В ПРОЕКТ!!! инклюдить надо только ХИДЕРЫ!!!! ваш проект очень неудобный, плохо написан, но я постарался оформить его более-менее "по правилам" - как говорится, найдите 10 отличий

Огромное СПАСИБО за внимание к моей проблемме. А где смотреть на исправленный проэкт?
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:18:21
ARV
SABRAT писал(а):Огромное СПАСИБО за внимание к моей проблемме. А где смотреть на исправленный проэкт.
странно... оказывается, файл надо отдельно загружать... исправляю оплошность
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:25:19
SABRAT
ARV писал(а):SABRAT писал(а):Огромное СПАСИБО за внимание к моей проблемме. А где смотреть на исправленный проэкт.
странно... оказывается, файл надо отдельно загружать... исправляю оплошность
Да уж...знаний у меня как оказалось, "ниже плинтуса". Благодарю за подсказку. Буду переваривать исправленный проэкт...
P.S. А где можно почитать про то как подключать файлы, да и вообще про структуру проэкта, чтобы понимать как это сделали Вы?
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:36:15
ARV
ну, самое правильное - читать классику... Кернигана и Ричи.... можно почитать что-то аналогичное наших авторов, но, как правило, такие книги читаются труднее - шибко любят наши писатели "академический" стиль изложения (вместо "сложить 2 и 2" пишут "произвести математическое действие сложения над числами, каждое из которых равно 2, в количестве двух штук"). не советовал бы читать "самоучители для чайников", но кое-кому и они помогают...
а вообще все просто: сишные файлы - это модули, из них составляется проект. все, что входит в проект - компилируется компилятором (т.е. каждый файл - отдельно). для того, чтобы модули могли взаимодействовать - служат хидеры. поэтому в каждом модуле инклюдятся только те хидеры, которые нужны только этому модулю. в хидере (обычно делаются отдельные хидеры для каждого модуля и плюс нужное количество глобальных хидеров для всего проекта) указывается все то, чем соответствующий модуль может помочь остальным модулям: константы, макросы, функции... вот и все вкратце
P.S. по предварительной договоренности с редакцией журнала Радиолюбитель вскоре я размещу на своем сайте все свои статьи о WinAVR, которые публикуются в журнале уже почти целый год. кое-что в этих статьях будет полезно начинающим, хотя я там дал только выжимки из Си - больше уделил внимание описанию стандартных для WinAVR "библиотечных" функций.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:45:10
Liv
ARV писал(а):во-первых, речь не о С++ с его классами и прочим - а о Си.
Ну так я же именно про Си. У C++ есть механизмы ограничения области видимости, вот там всё действительно делается стандартно. А в обычном Си это делается ручками, поэтому в Си-шный h-файл я момещаю лишь то, что было бы в секции public описания класса в случае C++. Очень простое и понятное правило.
ARV писал(а):во-вторых, есть определенные правила, чего не должно быть в хидере: определения переменных, определения функций (исключение - функции в виде макросов).
Да, некоторые правила есть, как есть и дискуссии, что же правильно помещать в h-файл.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 12:56:37
ARV
Liv писал(а):Ну так я же именно про Си. У C++ есть механизмы ограничения области видимости, вот там всё действительно делается стандартно. А в обычном Си это делается ручками, поэтому в Си-шный h-файл я момещаю лишь то, что было бы в секции public описания класса в случае C++. Очень простое и понятное правило.
ясно, это я не сразу понял

только вряд ли начинающему рассказ про public-секцию класса прояснит ситуацию
P.S. однако, в public-секции класса могут быть и поля-переменные, и тут аналогия для простого Си не срабатывает: в хидере крайне нежелательно определять переменные, т.к. это приведет к ошибкам при использовании модуля в других модулях более 1 раза: получится многократное определение переменных с одинаковыми идентификаторами.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 13:33:21
SABRAT
Благодарю всех кто откликнулся на мою проблемму. Только что вышел купил книгу "Язык программирования С. Брайан Керниган. Деннис Ритчи". Буду устранять личную безграмотность.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 13:42:09
ARV
SABRAT писал(а):Благодарю всех кто откликнулся на мою проблемму. Только что вышел купил книгу "Язык программирования С. Брайан Керниган. Деннис Ритчи". Буду устранять личную безграмотность.
вот это похвально!

Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 14:01:53
Liv
ARV писал(а):P.S. однако, в public-секции класса могут быть и поля-переменные, и тут аналогия для простого Си не срабатывает: в хидере крайне нежелательно определять переменные, т.к. это приведет к ошибкам при использовании модуля в других модулях более 1 раза: получится многократное определение переменных с одинаковыми идентификаторами.
Можно использовать с extern. Но я вообще не использую переменных, видимых более чем из одного модуля. Сознательно иду на некоторый оверхед, но к внутренним данным модуля разрешаю доступ только через функции.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 14:20:13
ARV
Liv писал(а):Можно использовать с extern. Но я вообще не использую переменных, видимых более чем из одного модуля. Сознательно иду на некоторый оверхед, но к внутренним данным модуля разрешаю доступ только через функции.
можно, только это будет не
объявление переменной, а обявление
ссылки на переменную (в терминологии могу заблуждаться). то есть
int var; выделяет 2 байта в ОЗУ, а
extern int var; только уведомляет, что где-то в ОЗУ есть 2 байта, таким образом, это две большие разницы. в частности,
extern int var = 12; вызывает варнинг - не одобряется инициализация "посторонних" по отношению к модулю переменных.
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 14:24:31
SABRAT
ARV писал(а):SABRAT писал(а):Благодарю всех кто откликнулся на мою проблемму. Только что вышел купил книгу "Язык программирования С. Брайан Керниган. Деннис Ритчи". Буду устранять личную безграмотность.
вот это похвально!

Сижу разбираюсь с исправлениями которые Вы внести. Возник вопрос. Зачем переменные объявляются два раза. В файле hourmetter.c они просто под инклюдами, а в файле TIC5234.c они же объявлены как глобальные и переменная vremya инициализируется как 12345 в файле TIC5234.c?
Второй вопрос. Я в книге ничего не нашёл про оформление хидеров.
// ВОТ ТАК НАДО ОФОРМЛЯТЬ ХИДЕР
#ifndef ___TIC5234_H___ /*Что это означает ?Почему именно такое оформление имя файла с нижними подчёркиваниями?*/
#define ___TIC5234_H___/*Что это означает ?*/
void func0(void);
void func1(void);
void func2(void);
void func3(void);
void func4(void);
void func5(void);
void massiv (void);
void load (void);
#endif // ___TIC5234_H___/*Что это означает ?*/
Re: Проблемма при отладке
Добавлено: Пт дек 03, 2010 15:01:03
ARV
вы за 15 минут прочли всю книгу?! да вы просто турбо-электровеник какой-то!
я только что ответил уважаемому
Liv, что переменная определяется только один раз, а вот в хидере на нее могут быть ссылки - это уже не определение переменной! под определением переменной я понимаю момент выделения памяти под нее, а под ссылкой - упоминание ее имени. в хидере имеется упоминание имени переменной с указанием extern для него - это означает, что данная переменная существует в проекте, но определена не в этом модуле.
по поводу второго вопроса дочитайте книгу до директив условной компиляции - это будет где-то в разделе про ПРЕПРОЦЕССОР. забегая вперед, поясню:
#ifndef ___TIC5234_H___ - встретив это препроцессор смотрит, определен ли символ (макрос)
___TIC5234_H___? если не определен, то продолжает анализировать следующие строки, а если окажется, что такой символ уже определен, то все строки вплоть до
#endif будут проигнорированы.
#define ___TIC5234_H___ - тут препроцессор вводит определение символа
___TIC5234_H___, т.е. начиная с этой строки он уже существует.
для чего это делается? все просто. если у вас по каким-либо причинам получится так, что
TIC5234.h будет подключен
два или более раза, то без этих конструкций в код программы попало бы два раза (или более) описание ссылок на переменные, что явилось бы ошибкой. при наличии таких конструкций в код программы будут включены только строки
от первого встреченного TIC5234.h, а все последующие будут проигнорированы, т.к. к моменту их обработки символ
___TIC5234_H___ уже будет существовать.
нижние подчеркивания - это не догма, тут просто главное - это обеспечить
уникальность символа, регулирующего игнорирование содержимого хидера. если вы будете использовать, например, символ
IGNORE, а где-то среди других модулей окажется уже такая переменная или константа - ваш хидер будет проигнорирован даже в первом включении, символ-то уже есть! поэтому обычно создают символ из имени файла хидера, добавляя к нему впридачу подчеркивания, чтобы получилось что-то неудобоваримое - врядли вам понравится в своем проекте использовать переменную
___TIC5234_H___ 
кстати, многие редакторы (например, Eclipse) вставляют такое "обрамление" в хидер автоматически - вам и писать ничего не надо!
такой подход позволяет вам не задумываться о том, где и сколько раз происходит подключение вашего хидера.
Re: Проблемма при отладке
Добавлено: Пн дек 06, 2010 14:08:23
SABRAT
Уважаемый ARV, благодаря Вам прояснил для себя многие моменты. Начало что-то получатся, поэтому решил задать ещё один вопрос. Подправил проэктик (в архиве), и хотелось бы избавится от глобальной переменной ToDisplay, а передавать значение функции display();. При обьявлении переменной ToDisplay как локальной в файле tic5234.c и описании функции как void display (unsigned long int ToDisplay) значение переменной ToDisplay не меняется (то есть 0) при вызове из основной функции типа display(12345);. Как передавать значение просто вызовом функции без занесения значения в переменную ToDisplay из функции main()?