Проблемма при отладке
Проблемма при отладке
Подскажите ГУРУ AVR Studio и WinAVR, как быть.
Последнюю неделю активно перелажу с CodeVision на AVR Studio+WinAVR. Наваял небольшой проэктик. Вроде работает, компилируется без ошибок. Но я люблю чтобы программа была модульная, то есть отдельные функции были вынесены в отдельные файлы, которые, в свою очередь включены через #include в основной файл. Дабы улучьшить читабельность основной программы. Как это сделать, вроде разобрался, но не понятно почему при пошаговой отладке программы курсор указателя выполнения операторов не переходит на функции подключённых файлов. Нормально пошаговая отладка происходит только когда весь проэкт одними файлом. Также я не могу установить breakpoint в подключеннх файлах.
Использую такой софт:
AVR Studio 4.18 Build 716
WinAVR 20100110
Пример проэкта во вложении.
Заранее благодарю.
Последнюю неделю активно перелажу с CodeVision на AVR Studio+WinAVR. Наваял небольшой проэктик. Вроде работает, компилируется без ошибок. Но я люблю чтобы программа была модульная, то есть отдельные функции были вынесены в отдельные файлы, которые, в свою очередь включены через #include в основной файл. Дабы улучьшить читабельность основной программы. Как это сделать, вроде разобрался, но не понятно почему при пошаговой отладке программы курсор указателя выполнения операторов не переходит на функции подключённых файлов. Нормально пошаговая отладка происходит только когда весь проэкт одними файлом. Также я не могу установить breakpoint в подключеннх файлах.
Использую такой софт:
AVR Studio 4.18 Build 716
WinAVR 20100110
Пример проэкта во вложении.
Заранее благодарю.
- Вложения
-
- hourmetter.rar
- (18.84 КБ) 174 скачивания
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
уважаемый, вы допустили одну ошибочку: внесли код "модуля" в файл-заголовок - это неправильно.
файл заголовок, подключаемый при помощи #include, должен содержать только определения макросов (констант), типов и прототипы функций модуля, а сам модуль оформляется в виде сишного файла (расширение с) и подключается к проекту. то есть в проекте у вас должно быть два сишных файла, а не один, как сейчас.
а вообще извините, но стиль ужасный... не смотря на желание повысить читабельность программы, вы пишите крайне нечитабельно...
файл заголовок, подключаемый при помощи #include, должен содержать только определения макросов (констант), типов и прототипы функций модуля, а сам модуль оформляется в виде сишного файла (расширение с) и подключается к проекту. то есть в проекте у вас должно быть два сишных файла, а не один, как сейчас.
а вообще извините, но стиль ужасный... не смотря на желание повысить читабельность программы, вы пишите крайне нечитабельно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Проблемма при отладке
Благодарю за ответ. Стиль не ужасный у начинающего редко бывает - работаю над собой.
А как подключить файл с расширением *.с? Вынес функции в файл с расширением *.с попробовал подключить через #include и проэкт перестал компилится.
Что я опять делю не так?
Заранее благодарю.
Изменённый проэкт во вложении.
А как подключить файл с расширением *.с? Вынес функции в файл с расширением *.с попробовал подключить через #include и проэкт перестал компилится.
Что я опять делю не так?
Заранее благодарю.
Изменённый проэкт во вложении.
- Вложения
-
- hourmetter.rar
- (17.33 КБ) 170 скачиваний
Re: Проблемма при отладке
Протупил, извините. Не сохранил изменения в новом файле. Вроде всё откомпилировалось...проверяю...
Всёрвно между файлами курсор не переходит при пошаговой отладке...блин...где я что нне так делаю?
Новый проэктик во вложении.
Всёрвно между файлами курсор не переходит при пошаговой отладке...блин...где я что нне так делаю?
Новый проэктик во вложении.
- Вложения
-
- hourmetter.rar
- (19.65 КБ) 166 скачиваний
- Liv
- Вымогатель припоя
- Сообщения: 525
- Зарегистрирован: Сб сен 20, 2008 12:12:30
- Откуда: Minsk
- Контактная информация:
Re: Проблемма при отладке
SABRAT По WinAVR ничего не скажу - не знаю. Сам использую IAR. А вот по стилю могу сделать несколько замечаний.
Используйте отступы. Иначе текст смотрится очень плохо.
Отделяейте знаки арифметических и логических операций пробелами.
Вот пример:
Не используйте в тексте "магических" цифр типа 0b10000000. Все численные значения должны быть определены в виде констант, их имена должны бвть написаны заглавными буквами.
Ну и еще: неужели трудно вместо vremya, cifra, massiv написать time, digit, array? Если Вы избрали для себя занятие в виде программирования, то должны в какой-то мере знать язык тех людей, которые все это создали.
ARV Что именно помещать в h-файлах, вопрос философский. Я обычно помещаю только то, что обычно находится в секции public при описании класса. Прототипы локальных функций размещаю в c-файле. Тогда взглянув на h-файл сразу виден интерфейс модуля, да и видимость внутренних функций модуля ограничивается самим модулем.
Используйте отступы. Иначе текст смотрится очень плохо.
Отделяейте знаки арифметических и логических операций пробелами.
Вот пример:
Код: Выделить всё
void func1(void)
{
if (DOUT[1] & 0b10000000)
{
PORTB |= 0b00000100;
}
else
{
PORTB &= 0b11111011;
}
} Ну и еще: неужели трудно вместо vremya, cifra, massiv написать time, digit, array? Если Вы избрали для себя занятие в виде программирования, то должны в какой-то мере знать язык тех людей, которые все это создали.
ARV Что именно помещать в h-файлах, вопрос философский. Я обычно помещаю только то, что обычно находится в секции public при описании класса. Прототипы локальных функций размещаю в c-файле. Тогда взглянув на h-файл сразу виден интерфейс модуля, да и видимость внутренних функций модуля ограничивается самим модулем.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
снова повторюсь: вы не должны инклюдить сишные файлы - их надо ДОБАВЛЯТЬ В ПРОЕКТ!!! инклюдить надо только ХИДЕРЫ!!!! ваш проект очень неудобный, плохо написан, но я постарался оформить его более-менее "по правилам" - как говорится, найдите 10 отличий 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
во-первых, речь не о С++ с его классами и прочим - а о Си.Liv писал(а):ARV Что именно помещать в h-файлах, вопрос философский. Я обычно помещаю только то, что обычно находится в секции public при описании класса. Прототипы локальных функций размещаю в c-файле. Тогда взглянув на h-файл сразу виден интерфейс модуля, да и видимость внутренних функций модуля ограничивается самим модулем.
во-вторых, есть определенные правила, чего не должно быть в хидере: определения переменных, определения функций (исключение - функции в виде макросов).
в-третьих, есть правило оформления хидера "рамкой" #ifndef - #endif
несоблюдение этих правил приводит к путанице, как минимум, и даже к ошибкам - в крайнем случае.
отсюда следует, что можно (или нужно) помещать в хидер... не так ли?
разумеется, все это не догма, но то, чему следует большинство программистов - это уже почти закон
P.S. на счет прототипов локальных функций - само собой, логичнее и правильнее делать их внутри самого модуля. но товарищ намешал много всего - там я для примера все функции описал в хидере...
Последний раз редактировалось ARV Пт дек 03, 2010 12:20:45, всего редактировалось 2 раза.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Проблемма при отладке
Огромное СПАСИБО за внимание к моей проблемме. А где смотреть на исправленный проэкт?ARV писал(а):снова повторюсь: вы не должны инклюдить сишные файлы - их надо ДОБАВЛЯТЬ В ПРОЕКТ!!! инклюдить надо только ХИДЕРЫ!!!! ваш проект очень неудобный, плохо написан, но я постарался оформить его более-менее "по правилам" - как говорится, найдите 10 отличий
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
странно... оказывается, файл надо отдельно загружать... исправляю оплошностьSABRAT писал(а):Огромное СПАСИБО за внимание к моей проблемме. А где смотреть на исправленный проэкт.
- Вложения
-
- hourmetter.rar
- (20.89 КБ) 189 скачиваний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Проблемма при отладке
Да уж...знаний у меня как оказалось, "ниже плинтуса". Благодарю за подсказку. Буду переваривать исправленный проэкт...ARV писал(а):странно... оказывается, файл надо отдельно загружать... исправляю оплошностьSABRAT писал(а):Огромное СПАСИБО за внимание к моей проблемме. А где смотреть на исправленный проэкт.
P.S. А где можно почитать про то как подключать файлы, да и вообще про структуру проэкта, чтобы понимать как это сделали Вы?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
ну, самое правильное - читать классику... Кернигана и Ричи.... можно почитать что-то аналогичное наших авторов, но, как правило, такие книги читаются труднее - шибко любят наши писатели "академический" стиль изложения (вместо "сложить 2 и 2" пишут "произвести математическое действие сложения над числами, каждое из которых равно 2, в количестве двух штук"). не советовал бы читать "самоучители для чайников", но кое-кому и они помогают...
а вообще все просто: сишные файлы - это модули, из них составляется проект. все, что входит в проект - компилируется компилятором (т.е. каждый файл - отдельно). для того, чтобы модули могли взаимодействовать - служат хидеры. поэтому в каждом модуле инклюдятся только те хидеры, которые нужны только этому модулю. в хидере (обычно делаются отдельные хидеры для каждого модуля и плюс нужное количество глобальных хидеров для всего проекта) указывается все то, чем соответствующий модуль может помочь остальным модулям: константы, макросы, функции... вот и все вкратце
P.S. по предварительной договоренности с редакцией журнала Радиолюбитель вскоре я размещу на своем сайте все свои статьи о WinAVR, которые публикуются в журнале уже почти целый год. кое-что в этих статьях будет полезно начинающим, хотя я там дал только выжимки из Си - больше уделил внимание описанию стандартных для WinAVR "библиотечных" функций.
а вообще все просто: сишные файлы - это модули, из них составляется проект. все, что входит в проект - компилируется компилятором (т.е. каждый файл - отдельно). для того, чтобы модули могли взаимодействовать - служат хидеры. поэтому в каждом модуле инклюдятся только те хидеры, которые нужны только этому модулю. в хидере (обычно делаются отдельные хидеры для каждого модуля и плюс нужное количество глобальных хидеров для всего проекта) указывается все то, чем соответствующий модуль может помочь остальным модулям: константы, макросы, функции... вот и все вкратце
P.S. по предварительной договоренности с редакцией журнала Радиолюбитель вскоре я размещу на своем сайте все свои статьи о WinAVR, которые публикуются в журнале уже почти целый год. кое-что в этих статьях будет полезно начинающим, хотя я там дал только выжимки из Си - больше уделил внимание описанию стандартных для WinAVR "библиотечных" функций.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Liv
- Вымогатель припоя
- Сообщения: 525
- Зарегистрирован: Сб сен 20, 2008 12:12:30
- Откуда: Minsk
- Контактная информация:
Re: Проблемма при отладке
Ну так я же именно про Си. У C++ есть механизмы ограничения области видимости, вот там всё действительно делается стандартно. А в обычном Си это делается ручками, поэтому в Си-шный h-файл я момещаю лишь то, что было бы в секции public описания класса в случае C++. Очень простое и понятное правило.ARV писал(а):во-первых, речь не о С++ с его классами и прочим - а о Си.
Да, некоторые правила есть, как есть и дискуссии, что же правильно помещать в h-файл.ARV писал(а):во-вторых, есть определенные правила, чего не должно быть в хидере: определения переменных, определения функций (исключение - функции в виде макросов).
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
ясно, это я не сразу понялLiv писал(а):Ну так я же именно про Си. У C++ есть механизмы ограничения области видимости, вот там всё действительно делается стандартно. А в обычном Си это делается ручками, поэтому в Си-шный h-файл я момещаю лишь то, что было бы в секции public описания класса в случае C++. Очень простое и понятное правило.
P.S. однако, в public-секции класса могут быть и поля-переменные, и тут аналогия для простого Си не срабатывает: в хидере крайне нежелательно определять переменные, т.к. это приведет к ошибкам при использовании модуля в других модулях более 1 раза: получится многократное определение переменных с одинаковыми идентификаторами.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Проблемма при отладке
Благодарю всех кто откликнулся на мою проблемму. Только что вышел купил книгу "Язык программирования С. Брайан Керниган. Деннис Ритчи". Буду устранять личную безграмотность.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
вот это похвально!SABRAT писал(а):Благодарю всех кто откликнулся на мою проблемму. Только что вышел купил книгу "Язык программирования С. Брайан Керниган. Деннис Ритчи". Буду устранять личную безграмотность.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Liv
- Вымогатель припоя
- Сообщения: 525
- Зарегистрирован: Сб сен 20, 2008 12:12:30
- Откуда: Minsk
- Контактная информация:
Re: Проблемма при отладке
Можно использовать с extern. Но я вообще не использую переменных, видимых более чем из одного модуля. Сознательно иду на некоторый оверхед, но к внутренним данным модуля разрешаю доступ только через функции.ARV писал(а):P.S. однако, в public-секции класса могут быть и поля-переменные, и тут аналогия для простого Си не срабатывает: в хидере крайне нежелательно определять переменные, т.к. это приведет к ошибкам при использовании модуля в других модулях более 1 раза: получится многократное определение переменных с одинаковыми идентификаторами.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
можно, только это будет не объявление переменной, а обявление ссылки на переменную (в терминологии могу заблуждаться). то есть int var; выделяет 2 байта в ОЗУ, а extern int var; только уведомляет, что где-то в ОЗУ есть 2 байта, таким образом, это две большие разницы. в частности, extern int var = 12; вызывает варнинг - не одобряется инициализация "посторонних" по отношению к модулю переменных.Liv писал(а):Можно использовать с extern. Но я вообще не использую переменных, видимых более чем из одного модуля. Сознательно иду на некоторый оверхед, но к внутренним данным модуля разрешаю доступ только через функции.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Проблемма при отладке
Сижу разбираюсь с исправлениями которые Вы внести. Возник вопрос. Зачем переменные объявляются два раза. В файле hourmetter.c они просто под инклюдами, а в файле TIC5234.c они же объявлены как глобальные и переменная vremya инициализируется как 12345 в файле TIC5234.c?ARV писал(а):вот это похвально!SABRAT писал(а):Благодарю всех кто откликнулся на мою проблемму. Только что вышел купил книгу "Язык программирования С. Брайан Керниган. Деннис Ритчи". Буду устранять личную безграмотность.
Второй вопрос. Я в книге ничего не нашёл про оформление хидеров.
// ВОТ ТАК НАДО ОФОРМЛЯТЬ ХИДЕР
#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___/*Что это означает ?*/
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18592
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Проблемма при отладке
вы за 15 минут прочли всю книгу?! да вы просто турбо-электровеник какой-то! 
я только что ответил уважаемому Liv, что переменная определяется только один раз, а вот в хидере на нее могут быть ссылки - это уже не определение переменной! под определением переменной я понимаю момент выделения памяти под нее, а под ссылкой - упоминание ее имени. в хидере имеется упоминание имени переменной с указанием extern для него - это означает, что данная переменная существует в проекте, но определена не в этом модуле.
по поводу второго вопроса дочитайте книгу до директив условной компиляции - это будет где-то в разделе про ПРЕПРОЦЕССОР. забегая вперед, поясню:
#ifndef ___TIC5234_H___ - встретив это препроцессор смотрит, определен ли символ (макрос) ___TIC5234_H___? если не определен, то продолжает анализировать следующие строки, а если окажется, что такой символ уже определен, то все строки вплоть до #endif будут проигнорированы.
#define ___TIC5234_H___ - тут препроцессор вводит определение символа ___TIC5234_H___, т.е. начиная с этой строки он уже существует.
для чего это делается? все просто. если у вас по каким-либо причинам получится так, что TIC5234.h будет подключен два или более раза, то без этих конструкций в код программы попало бы два раза (или более) описание ссылок на переменные, что явилось бы ошибкой. при наличии таких конструкций в код программы будут включены только строки от первого встреченного TIC5234.h, а все последующие будут проигнорированы, т.к. к моменту их обработки символ ___TIC5234_H___ уже будет существовать.
нижние подчеркивания - это не догма, тут просто главное - это обеспечить уникальность символа, регулирующего игнорирование содержимого хидера. если вы будете использовать, например, символ IGNORE, а где-то среди других модулей окажется уже такая переменная или константа - ваш хидер будет проигнорирован даже в первом включении, символ-то уже есть! поэтому обычно создают символ из имени файла хидера, добавляя к нему впридачу подчеркивания, чтобы получилось что-то неудобоваримое - врядли вам понравится в своем проекте использовать переменную ___TIC5234_H___
кстати, многие редакторы (например, Eclipse) вставляют такое "обрамление" в хидер автоматически - вам и писать ничего не надо!
такой подход позволяет вам не задумываться о том, где и сколько раз происходит подключение вашего хидера.
я только что ответил уважаемому Liv, что переменная определяется только один раз, а вот в хидере на нее могут быть ссылки - это уже не определение переменной! под определением переменной я понимаю момент выделения памяти под нее, а под ссылкой - упоминание ее имени. в хидере имеется упоминание имени переменной с указанием extern для него - это означает, что данная переменная существует в проекте, но определена не в этом модуле.
по поводу второго вопроса дочитайте книгу до директив условной компиляции - это будет где-то в разделе про ПРЕПРОЦЕССОР. забегая вперед, поясню:
#ifndef ___TIC5234_H___ - встретив это препроцессор смотрит, определен ли символ (макрос) ___TIC5234_H___? если не определен, то продолжает анализировать следующие строки, а если окажется, что такой символ уже определен, то все строки вплоть до #endif будут проигнорированы.
#define ___TIC5234_H___ - тут препроцессор вводит определение символа ___TIC5234_H___, т.е. начиная с этой строки он уже существует.
для чего это делается? все просто. если у вас по каким-либо причинам получится так, что TIC5234.h будет подключен два или более раза, то без этих конструкций в код программы попало бы два раза (или более) описание ссылок на переменные, что явилось бы ошибкой. при наличии таких конструкций в код программы будут включены только строки от первого встреченного TIC5234.h, а все последующие будут проигнорированы, т.к. к моменту их обработки символ ___TIC5234_H___ уже будет существовать.
нижние подчеркивания - это не догма, тут просто главное - это обеспечить уникальность символа, регулирующего игнорирование содержимого хидера. если вы будете использовать, например, символ IGNORE, а где-то среди других модулей окажется уже такая переменная или константа - ваш хидер будет проигнорирован даже в первом включении, символ-то уже есть! поэтому обычно создают символ из имени файла хидера, добавляя к нему впридачу подчеркивания, чтобы получилось что-то неудобоваримое - врядли вам понравится в своем проекте использовать переменную ___TIC5234_H___
такой подход позволяет вам не задумываться о том, где и сколько раз происходит подключение вашего хидера.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Проблемма при отладке
Уважаемый ARV, благодаря Вам прояснил для себя многие моменты. Начало что-то получатся, поэтому решил задать ещё один вопрос. Подправил проэктик (в архиве), и хотелось бы избавится от глобальной переменной ToDisplay, а передавать значение функции display();. При обьявлении переменной ToDisplay как локальной в файле tic5234.c и описании функции как void display (unsigned long int ToDisplay) значение переменной ToDisplay не меняется (то есть 0) при вызове из основной функции типа display(12345);. Как передавать значение просто вызовом функции без занесения значения в переменную ToDisplay из функции main()?
- Вложения
-
- hourmetter.rar
- (55.65 КБ) 179 скачиваний


