|
|
  |
WinAVR организация данных, Вопросы начинающего |
|
|
|
Jan 3 2008, 07:29
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-09-07
Пользователь №: 30 914

|
Цитата(Dog Pawlowa @ Jan 3 2008, 00:47)  Простите, Вы уже с массивами разобрались? Не плодите дополнительных сущностей и вопросов, с декларированным Вами знанием языка 'C' за конструкторами и деструкторами через пару месяцев приходите. А приведенном примере расскажите словами, что хотели сделать. Я не понимаю. Да, с массивами разобрался... Хочу использовать одно имя функции, с разным количеством аргументов, или разными типами аргументов Хочу объявлять переменные не вначале функции, а внутри операторов Код switch(u08 temp = getchar()) {} Но впринцепе, если перегрузка не работает, то про конструкторы вопрос отпадает Цитата(mdmitry @ Jan 3 2008, 01:38)  Кажется, первый вопрос в FAQ по avr-libc именно по volatile. Код uint8_t flag; ... ISR(SOME_vect) { flag = 1; } ...
while (flag == 0) { ... } Компилятор будет обычно получать доступ к флагу только однажды, и оптимизирует дальнейшие пути полного доступа, так как его code path analysis(анализ нахождения кода) показывает, что ничто в цикле не могло изменить, так или иначе, состояние флага. Сказать компилятору, что эта переменная могла быть изменена вне ее code path analysis(анализа нахождения кода) (т.е. изнутри обычного прерывания), переменная должна быть объявлена: Код volatile uint8_t flag; Для этих целей я использовал extern переменные и все работает...в чем разница? Заметил, что при объявлении extern переменных необходимо сразу их определять, иначе памяти под них не выделяется и в дальнейшем компилятор их не находит. Цитата(Б. Керниган, Д. Ритчи @ Jan 3 2008, 01:38)  Поскольку внешние(extern) переменные доступны всюду, их можно использовать в качестве связующих данных между функциями как альтернативу связей через аргументы и возвращаемые значения. Для любой функции внешняя переменная доступна по ее имени, если это имя было должным образом объявлено. По умолчанию одинаковые внешние имена, используемые в разных файлах, относятся к одному и тому же внешнему объекту (функции). (В стандарте это называется редактированием внешних связей (линкованием) (external linkage).) ...... Если же программа расположена в нескольких исходных файлах и внешняя переменная определена в файле1, а используется в файле2 и файлеЗ, то объявления extern в файле2 и файлеЗ обязательны, поскольку необходимо указать, что во всех трех файлах функции обращаются к одной и той же внешней переменной. На практике обычно удобно собрать все объявления внешних переменных и функций в отдельный заголовочный файл.
Сообщение отредактировал Dim_ON - Jan 3 2008, 08:07
|
|
|
|
|
Jan 3 2008, 08:16
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-09-07
Пользователь №: 30 914

|
Цитата(Dog Pawlowa @ Jan 3 2008, 11:09)  extern - средство для удобного разделения проекта на модули (файлы), и volatile заменить не может. Я правильно Вас понял? extern - область видимости весь проект(все файлы/модули), в которых они объявлены! volatile - область видимости весь проект(все файлы/модули), без дополнительных объявлений. Специальная альтернатива extern(лучше подходит для применения!) static - область видимости 1 файл(модуль). ПС значит надо заканчивать extern-ичать и начинать volatile-ить
Сообщение отредактировал Dim_ON - Jan 3 2008, 08:55
|
|
|
|
|
Jan 3 2008, 09:12
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Dim_ON @ Jan 3 2008, 12:16)  Я правильно Вас понял? extern - область видимости весь проект(все файлы/модули) volatile - область видимости весь проект(все файлы/модули). Специальная альтернатива extern(лучше подходит для применения) static - область видимости 1 файл(модуль). Нет, неправильно. Вы скачали хоть какой-нибудь учебник по С? Представьте, что Вы английский язык собрались изучать по советам на форуме. Теоретически возможно, но ... Кстати, об английском. extern (от external [англ] - внешний)- дает знать компилятору, что такая переменная где-то есть, и ее не нужно создавать. volatile (англ - непостоянный, изменчивый) - дает знать компилятору, что переменная может измениться в любой момент static ( что, тоже переводить?) - дает знать компилятору, что переменная будет находиться в статической области памяти, несмотря на то, что она может определена в функции (область видимости - это вторично).
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jan 3 2008, 09:29
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-09-07
Пользователь №: 30 914

|
Цитата(Dog Pawlowa @ Jan 3 2008, 12:12)  Нет, неправильно. Вы скачали хоть какой-нибудь учебник по С? Представьте, что Вы английский язык собрались изучать по советам на форуме. Теоретически возможно, но ... Я знаю С/С++, но писал я консольные проги под ПК, поэтому и интересует как без лишнего ущерба (расхода аппаратных средств) перейти на программирование МК...Когда был студентом писал на асме под К580, КР1821ВМ85, 1816ВЕ48, 1816ВЕ51, но это больше были теоретические проекты. Щас же когда есть возможность моделировать и отлаживать в Протеусе, решил соеденить свои теоритеческие знания с практикой... Цитата(Dog Pawlowa @ Jan 3 2008, 12:12)  Кстати, об английском. extern (от external [англ] - внешний)- дает знать компилятору, что такая переменная где-то есть, и ее не нужно создавать. volatile (англ - непостоянный, изменчивый) - дает знать компилятору, что переменная может измениться в любой момент static ( что, тоже переводить?) - дает знать компилятору, что переменная будет находиться в статической области памяти, несмотря на то, что она может определена в функции (область видимости - это вторично). Да с анг, не очень), спасибо за пояснение На счет первого поста, то вы меня наверное неправильно поняли, я хотел что бы Вы давали советы по использованию того или иного типа данных, а не обясняли что такое тип данных...
|
|
|
|
|
Jan 3 2008, 09:57
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Dim_ON @ Jan 3 2008, 13:29)  Я знаю С/С++, но писал я консольные проги под ПК, поэтому и интересует как без лишнего ущерба (расхода аппаратных средств) перейти на программирование МК... Да с анг, не очень), спасибо за пояснение На счет первого поста, то вы меня наверное неправильно поняли, я хотел что бы Вы давали советы по использованию того или иного типа данных, а не обясняли что такое тип данных... У, так Вы не начинающий вовсе, а знаете С/C++? Простите, неправильно понял. С какой именно практикой Вы хотите соединить теоретические знания? Протеус - это не практика, это скорее шаг в сторону, в придуманный мир.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jan 3 2008, 10:34
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-09-07
Пользователь №: 30 914

|
Цитата(Dog Pawlowa @ Jan 3 2008, 12:57)  У, так Вы не начинающий вовсе, а знаете С/C++? Простите, неправильно понял. С какой именно практикой Вы хотите соединить теоретические знания? Протеус - это не практика, это скорее шаг в сторону, в придуманный мир. Изучал, но это я неправильно выразился, не извеняйтесь Мне хочется научиться правильному стилю программирования МК AVR, с использованием С и WinAVR. (ИМХО) Протеус это как раз таки первый шаг к практике, так как программист может визуально представить и довести до рабочего сотояния, то что он написал. А так же неплохая практика работы с схематехническим редактором. Но если есть отладочная плата, то канешна Протеус придуманный мир
|
|
|
|
|
Jan 3 2008, 10:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Dim_ON @ Jan 3 2008, 09:29)  Но впринцепе, если перегрузка не работает, то про конструкторы вопрос отпадает Перегрузка работает. И конструкторы-деструкторы тоже. В том кусочке, который вы привели, я совершенно ничего не понял. Думаю, и компилятор тоже. Приведите конкретный пример, словами. Конкретную функцию и что конкретно вы от нее хотите. И послушайте совета Dog Pawlowa, прочтите книжку. Для начала по С (Керниган и Ритчи, "Язык программирования С, гугля дает кучи ссылок), потом по С++.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 3 2008, 10:55
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-09-07
Пользователь №: 30 914

|
Цитата(Сергей Борщ @ Jan 3 2008, 13:41)  Перегрузка работает. И конструкторы-деструкторы тоже. В том кусочке, который вы привели, я совершенно ничего не понял. Думаю, и компилятор тоже. Приведите конкретный пример, словами. Конкретную функцию и что конкретно вы от нее хотите. И послушайте совета Dog Pawlowa, прочтите книжку. Для начала по С (Керниган и Ритчи, "Язык программирования С, гугля дает кучи ссылок), потом по С++. Может и не такой выразительный Код void motor_go(u08 speed) { //в зависимости от speed устанавливаю частоту и количество пульсов ШИМ } void motor_go(u08 speed, u08 kol_shagov) { for(kol_shagov; kol_shagov != 0; kol_shagov--) motor_go(speed); } //ну или например u08 Serch(u08 Index) { //поиск в первом массиве } u08 Serch(u16 Index) { //поиск во втором массиве } u08 Serch(u08 Index, u08 NewElm) { //поиск в первом массиве //вернуть старое значение и записать новое } Мне то впринцепе не трудно самому переименовать функцию, но вот если конструкторы можно перегуржать то это хорошо
Сообщение отредактировал Dim_ON - Jan 3 2008, 11:09
|
|
|
|
|
Jan 3 2008, 11:37
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 28-09-07
Пользователь №: 30 914

|
Цитата(vooon @ Jan 3 2008, 14:25)  скорее всего вы компилируете Си компилятором а не С++. посмотрите на вывод мейка, наверняка используется avr-gcc , а нужен avr-g++ Да, это значит в makefile надо заменить? Код # Define programs and commands. SHELL = sh CC = avr-gcc // на avr-g++ OBJCOPY = avr-objcopy OBJDUMP = avr-objdump SIZE = avr-size AR = avr-ar rcs NM = avr-nm AVRDUDE = avrdude REMOVE = rm -f REMOVEDIR = rm -rf COPY = cp WINSHELL = cmd И после этого я смогу нормально перегружать, объявлять внутри операторов? А классы можно использовать?
Сообщение отредактировал Dim_ON - Jan 3 2008, 11:40
|
|
|
|
|
Jan 3 2008, 14:23
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(vooon @ Jan 3 2008, 13:25)  наверняка используется avr-gcc , а нужен avr-g++ Достаточно дать комилируемому файлу расширение .cpp Это наиболее "прямой" метод. К сожалению, он не работает с плугином для AVRStudio - плугин не дает указать файл с расширением, отличным от .c или .h Тогда либо не пользоваться менюшками в AVRStudio указав external Makefile, либо явно указать использование С++ (но это тоже потребует external makefile): Код CC = avr-gcc -x c++ или вписать -x c++ в опции компилятора. Это будет несколько "прямее", чем непосредственно вызывать g++.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|