реклама на сайте
подробности

 
 
> WinAVR организация данных, Вопросы начинающего
Dim_ON
сообщение Jan 2 2008, 11:17
Сообщение #1


Участник
*

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



Недавно начал учиться программировать МК AVR семейство Mega, для этого использую WinAVR 20071221, тестирую в Proteuse 7 SP2. В чем собственно непонядки:
Проблемы с массивами:
Код
const unsigned char TabKey[4][4]  PROGMEM = \
       {{ '1', '2', '3', CTRL0 },\
        { '4', '5', '6', CTRL1 },\
        { '7', '8', '9', CTRL2 },\
        { '*', '0', '#', CTRL3 }};
//или
const u08  Tab[16] PROGMEM = \
{  33, 0xFA, 16, CTRL0, \
   48, 0xF9, 18, CTRL1, \
   56, 0xF8, 13, CTRL2, \
   69, 0xF7, 28, CTRL3 \
    };
//использую внешний индекс
extern u08             LastKey;
//но возращаются левые выборки
LastKey = Tab[LastKey]; //лажа

Объясните плиз использование static, extern, volatile переменных, функций. В каких случаях лучше объявить extern переменную, а где лучше использовать функцию возращающую значение static переменной. Про volatile я вообще ниче не знаю 05.gif
С массивами тоже туго... Что лучше, использовать одномерный массив или при необходимости можно создавать несколько размерностей. Как правильно их объявлять и определять, как обращаться к элементам массива. Операции с массивами: логические, арифметические, сортировка...
Структуры(struct)...Объявление, определение, битовые поля, использование массива в структуре и использование массива структур
Объединения(union)...
Перечесления(enum)...
Динамическое выделение памяти...malloc...free
Объявление и определение переменных внутри операторов... for(u08 i = 0; i < 10; i++){}
Перегрузка функций
Шаблоны функций

PS Хочется услышать советы бывалых при использовании тех или инных типов данных
PSS Хочется разобраться как организуется тот или иной тип на аппаратном уровне, что бы корректно использовать
PSSS Сильно не ругайтесь если это все 1000 раз обсуждалось, просто захотелось собрать все в одном месте, можно ссылки если не хотите по 150 раз переписывать одно и тоже. Ссылки на литературу по теме приветствуются
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dmitry77
сообщение Jan 2 2008, 14:56
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 3-09-06
Из: Архангельск
Пользователь №: 20 038



Приветики! С Новым Годом!!!
Посмотрите вот этот FAQ - возможно поможет....Это что касается самого WinAVR. Только есть досадный нюанс - текст на чисто немецком....

Файл
Прикрепленные файлы
Прикрепленный файл  AVR_GCC.rar ( 563.63 килобайт ) Кол-во скачиваний: 225
 
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 2 2008, 18:09
Сообщение #3


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Dmitry77 @ Jan 2 2008, 17:56) *
Приветики! С Новым Годом!!!
Посмотрите вот этот FAQ - возможно поможет....Это что касается самого WinAVR. Только есть досадный нюанс - текст на чисто немецком....

Файл

В документации к WinAvr есть FAQ, в том числе и про volatile, размещение данных во flash и другое написано, правда на английском. smile.gif


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Dim_ON
сообщение Jan 2 2008, 19:28
Сообщение #4


Участник
*

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



Цитата(mdmitry @ Jan 2 2008, 21:09) *
В документации к WinAvr есть FAQ, в том числе и про volatile, размещение данных во flash и другое написано, правда на английском. smile.gif

Оо спасибо большое, я просто не знал про этот FAQ beer.gif
ПС мои массивы заработали smile.gif
Еще вот у меня перегрузка функций и объявление переменных в операторах не прокатывает.
А вот про volatile так и не нашел(

Сообщение отредактировал Dim_ON - Jan 2 2008, 19:52
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 2 2008, 19:48
Сообщение #5


Гуру
******

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



Цитата(Dim_ON @ Jan 2 2008, 21:28) *
Еще вот у меня перегрузка функций и объявление переменных в операторах не прокатывает.
Телепатически можно предположить, что вы что-то не то пишете в исходном коде.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dim_ON
сообщение Jan 2 2008, 19:56
Сообщение #6


Участник
*

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



Цитата(Сергей Борщ @ Jan 2 2008, 22:48) *
Телепатически можно предположить, что вы что-то не то пишете в исходном коде.

ну например:
Код
void motor_go(u08 speed);
void motor_go(u08 speed, u08 kol_shagov);
for(u08 i = 0; i < 10; i++){}

Еще интересует можно ли использовать конструкторы и деструкторы для структур и перегружать их

Сообщение отредактировал Dim_ON - Jan 2 2008, 20:05
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 2 2008, 21:47
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Dim_ON @ Jan 2 2008, 23:56) *
ну например:
Код
void motor_go(u08 speed);
void motor_go(u08 speed, u08 kol_shagov);
for(u08 i = 0; i < 10; i++){}

Еще интересует можно ли использовать конструкторы и деструкторы для структур и перегружать их

Простите, Вы уже с массивами разобрались?
Не плодите дополнительных сущностей и вопросов, с декларированным Вами знанием языка 'C' за конструкторами и деструкторами через пару месяцев приходите.
А приведенном примере расскажите словами, что хотели сделать. Я не понимаю.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Dim_ON
сообщение Jan 3 2008, 07:29
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 3 2008, 08:09
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Dim_ON @ Jan 3 2008, 11:29) *
Для этих целей я использовал extern переменные и все работает...в чем разница?
Заметил, что при объявлении extern переменных необходимо сразу их определять, иначе памяти под них не выделяется и в дальнейшем компилятор их не находит.

extern - средство для удобного разделения проекта на модули (файлы), и volatile заменить не может.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Dim_ON
сообщение Jan 3 2008, 08:16
Сообщение #10


Участник
*

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



Цитата(Dog Pawlowa @ Jan 3 2008, 11:09) *
extern - средство для удобного разделения проекта на модули (файлы), и volatile заменить не может.

Я правильно Вас понял?
extern - область видимости весь проект(все файлы/модули), в которых они объявлены!
volatile - область видимости весь проект(все файлы/модули), без дополнительных объявлений. Специальная альтернатива extern(лучше подходит для применения!)
static - область видимости 1 файл(модуль).
ПС значит надо заканчивать extern-ичать и начинать volatile-ить smile.gif

Сообщение отредактировал Dim_ON - Jan 3 2008, 08:55
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 3 2008, 09:12
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Dim_ON @ Jan 3 2008, 12:16) *
Я правильно Вас понял?
extern - область видимости весь проект(все файлы/модули)
volatile - область видимости весь проект(все файлы/модули). Специальная альтернатива extern(лучше подходит для применения)
static - область видимости 1 файл(модуль).

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

Кстати, об английском.
extern (от external [англ] - внешний)- дает знать компилятору, что такая переменная где-то есть, и ее не нужно создавать.
volatile (англ - непостоянный, изменчивый) - дает знать компилятору, что переменная может измениться в любой момент
static ( что, тоже переводить?) - дает знать компилятору, что переменная будет находиться в статической области памяти, несмотря на то, что она может определена в функции (область видимости - это вторично).


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Dim_ON
сообщение Jan 3 2008, 09:29
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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 ( что, тоже переводить?) - дает знать компилятору, что переменная будет находиться в статической области памяти, несмотря на то, что она может определена в функции (область видимости - это вторично).

Да с анг, не очень), спасибо за пояснение
На счет первого поста, то вы меня наверное неправильно поняли, я хотел что бы Вы давали советы по использованию того или иного типа данных, а не обясняли что такое тип данных...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 3 2008, 09:57
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



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

У, так Вы не начинающий вовсе, а знаете С/C++? Простите, неправильно понял.
С какой именно практикой Вы хотите соединить теоретические знания?
Протеус - это не практика, это скорее шаг в сторону, в придуманный мир.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Dim_ON
сообщение Jan 3 2008, 10:34
Сообщение #14


Участник
*

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



Цитата(Dog Pawlowa @ Jan 3 2008, 12:57) *
У, так Вы не начинающий вовсе, а знаете С/C++? Простите, неправильно понял.
С какой именно практикой Вы хотите соединить теоретические знания?
Протеус - это не практика, это скорее шаг в сторону, в придуманный мир.

Изучал, но это я неправильно выразился, не извеняйтесь
Мне хочется научиться правильному стилю программирования МК AVR, с использованием С и WinAVR.
(ИМХО) Протеус это как раз таки первый шаг к практике, так как программист может визуально представить и довести до рабочего сотояния, то что он написал. А так же неплохая практика работы с схематехническим редактором.
Но если есть отладочная плата, то канешна Протеус придуманный мир
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dim_ON   WinAVR организация данных   Jan 2 2008, 11:17
- - bloodden   Вся проблема в том, что у АВР память программ и па...   Jan 2 2008, 11:46
|- - Dim_ON   Цитата(bloodden @ Jan 2 2008, 15:46) По-м...   Jan 2 2008, 12:04
|- - Dim_ON   Микроконтроллеры AVR семейства MEGA имеют RISC (со...   Jan 2 2008, 13:34
|- - zltigo   Цитата(Dim_ON @ Jan 2 2008, 15:34) Не я п...   Jan 2 2008, 13:44
|- - Dim_ON   Цитата(zltigo @ Jan 2 2008, 17:44) Вот им...   Jan 2 2008, 14:13
|- - zltigo   Цитата(Dim_ON @ Jan 2 2008, 16:13) Давайт...   Jan 2 2008, 14:38
- - mdmitry   >PS Хочется услышать советы бывалых при использ...   Jan 2 2008, 13:10
- - 733259   Вам сначала руководство по C бы почитать, про масс...   Jan 2 2008, 13:38
||- - Сергей Борщ   Цитата(Dim_ON @ Jan 3 2008, 09:29) Но впр...   Jan 3 2008, 10:41
||- - Dim_ON   Цитата(Сергей Борщ @ Jan 3 2008, 13:41) П...   Jan 3 2008, 10:55
|- - mdmitry   Цитата(Dim_ON @ Jan 2 2008, 22:28) А вот ...   Jan 2 2008, 22:38
- - vooon   скорее всего вы компилируете Си компилятором а не ...   Jan 3 2008, 11:25
|- - Dim_ON   Цитата(vooon @ Jan 3 2008, 14:25) скорее ...   Jan 3 2008, 11:37
||- - vooon   да, тогда будут доступны все возможности С++   Jan 3 2008, 11:56
|- - Сергей Борщ   Цитата(vooon @ Jan 3 2008, 13:25) наверня...   Jan 3 2008, 14:23
|- - mdmitry   Цитата(Сергей Борщ @ Jan 3 2008, 17:23) Д...   Jan 3 2008, 21:46
- - Dim_ON   Всем спасибо за подсказки Пока вроде вопросы з...   Jan 3 2008, 12:06
- - Dim_ON   Подскажите плиз Как в avr-gcc обращаться к младшем...   Jan 5 2008, 15:12
|- - Сергей Борщ   Цитата(Dim_ON @ Jan 5 2008, 17:12) Как в ...   Jan 5 2008, 17:13
|- - Dim_ON   Цитата(Сергей Борщ @ Jan 5 2008, 20:13) К...   Jan 5 2008, 17:18
|- - zltigo   Цитата(Сергей Борщ @ Jan 5 2008, 19:13) И...   Jan 5 2008, 18:41
|- - Сергей Борщ   Цитата(zltigo @ Jan 5 2008, 20:41) Ну а ...   Jan 5 2008, 19:03
|- - zltigo   Цитата(Сергей Борщ @ Jan 5 2008, 21:03) в...   Jan 5 2008, 19:57
|- - Сергей Борщ   Цитата(zltigo @ Jan 5 2008, 21:57) Не дол...   Jan 5 2008, 21:49
|- - zltigo   Цитата(Сергей Борщ @ Jan 5 2008, 23:49) н...   Jan 5 2008, 22:17
- - Dim_ON   Еще можно наверное вот так:Кодuint16_t KeyCod; uin...   Jan 5 2008, 18:43
- - Dim_ON   Еще возник вопрос: создаю в EEPROM-е массив структ...   Jan 6 2008, 10:31
- - Сергей Борщ   Цитата(Dim_ON @ Jan 6 2008, 12:31) eeprom...   Jan 6 2008, 12:47


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 06:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.0154 секунд с 7
ELECTRONIX ©2004-2016