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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> WinAVR организация данных, Вопросы начинающего
mdmitry
сообщение Jan 3 2008, 21:46
Сообщение #31


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

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



Цитата(Сергей Борщ @ Jan 3 2008, 17:23) *
Достаточно дать комилируемому файлу расширение .cpp Это наиболее "прямой" метод. К сожалению, он не работает с плугином для AVRStudio - плугин не дает указать файл с расширением, отличным от .c или .h Тогда либо не пользоваться менюшками в AVRStudio указав external Makefile, либо явно указать использование С++ (но это тоже потребует external makefile):
Код
CC = avr-gcc  -x c++
или вписать -x c++ в опции компилятора. Это будет несколько "прямее", чем непосредственно вызывать g++.

Или отказаться от AVRStudio и пользоваться другую IDE, в которой Makefile может быть отредактирован программистом по своему усмотрению. Сам использую Eclipse.


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


Участник
*

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



Подскажите плиз
Как в avr-gcc обращаться к младшему и старшему байту слова, без использования функций преобразования типов? Есть ли какие ниб специальные средства, типа:
Код
unsigned int KeyCod = 0xFFFF;
unsigned char KeyRow = Hbyte(KeyCod);
unsigned char KeyCol = Lbyte(KeyCod);
........
........
if(Hbyte(KeyCod) != KeyRow){....}
if(Lbyte(KeyCod) != KeyCol){....}
ROWPORT = Hbyte(KeyKod);
//или надо все же использовать функции преобразования?
unsigned int KeyCod = 0xFFFF;
unsigned char KeyRow = utoa(KeyCod>>8);
unsigned char KeyCol = utoa(KeyCod);
.......


Сообщение отредактировал Dim_ON - Jan 5 2008, 15:14
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 5 2008, 17:13
Сообщение #33


Гуру
******

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



Цитата(Dim_ON @ Jan 5 2008, 17:12) *
Как в avr-gcc обращаться к младшему и старшему байту слова, без использования функций преобразования типов?
Код
uint16_t a;
uint8_t lo_byte, hi_byte;

void test()
{
    lo_byte = a & 0xFF;
    hi_byte = a >> 8;
}
И так в любом С.


--------------------
На любой вопрос даю любой ответ
"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 5 2008, 17:18
Сообщение #34


Участник
*

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



Цитата(Сергей Борщ @ Jan 5 2008, 20:13) *
Код
uint16_t a;
uint8_t lo_byte, hi_byte;

void test()
{
    lo_byte = a & 0xFF;
    hi_byte = a >> 8;
}
И так в любом С.

Я тоже думал на счет такого варианта, но не был уверен
Код
#define Lbyte(word)        (word & 0x00FF)
#define Hbyte(word)        (word>>8)        //((word>>8) & 0x00FF)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 5 2008, 18:41
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Jan 5 2008, 19:13) *
И так в любом С.

Ну если для определенности:
lo_byte = (uint8_t)a;
это правильно.
lo_byte = a;
это нормально.
Ну а
lo_byte = a & 0xFF;
явный перебор. Компияторы нынче хорошие - оптимизируют, конечно....


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dim_ON
сообщение Jan 5 2008, 18:43
Сообщение #36


Участник
*

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



Еще можно наверное вот так:
Код
uint16_t KeyCod;
uint8_t L_byte = (uint8_t)KeyCod;
uint8_t H_byte = (uint8_t)(KeyCod>>8);

меня опередили smile.gif

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


Гуру
******

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



Цитата(zltigo @ Jan 5 2008, 20:41) *
Ну а
lo_byte = a & 0xFF;
явный перебор. Компияторы нынче хорошие - оптимизируют, конечно....
Конечно оптимизируют. Но выдают предупреждение о присваивании большего типа меньшему. GCC, во всяком случае. Насчет варианта с явным приведением - не помню.


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Jan 5 2008, 19:57
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Jan 5 2008, 21:03) *
выдают предупреждение о присваивании большего типа меньшему. GCC, во всяком случае.

Не должно быть warnings. Относительно GCC/C++ - перепроверил 4.2.1 с полными ключами -Wall -Wextra как и положено сделал преобразование типов
lo_byte = a;
без предупреждений.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 5 2008, 21:49
Сообщение #39


Гуру
******

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



Цитата(zltigo @ Jan 5 2008, 21:57) *
Не должно быть warnings.
Да, точно, "с прямым углом попутал". Это если константу присваивать и значащие биты отсекаются, тогда ругается:
Код
uint8_t lo, hi;
#define TEST 1234
int main()
{
    lo = TEST;
    hi = TEST >> 8;
}

main.cpp:10: warning: large integer implicitly truncated to unsigned type
Поэтому рефлекторно накладываю маску. накладывание маски компилятор тоже оптимизирует.


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Jan 5 2008, 22:17
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Jan 5 2008, 23:49) *
накладывание маски компилятор тоже оптимизирует.

Дык, я об этом я сразу и написал. Только вот о незначащие маски глаз спотыкается sad.gif.
Цитата
Поэтому рефлекторно накладываю маску

А я явное преобразование типа часто делаю для подчеркивания факта осознанности действия.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dim_ON
сообщение Jan 6 2008, 10:31
Сообщение #41


Участник
*

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



Еще возник вопрос:
создаю в EEPROM-е массив структур типа
Код
struct MASS_DEF
{    
    u08 index;
    u08 oper;
    u08 kol;
};

static struct MASS_DEF massiv[100] EEMEM;

Могу ли я использовать запись типа
Код
        eeprom_write_byte(massiv[num].index, num);
        eeprom_write_byte(massiv[num].oper, OP0);
        eeprom_write_byte(massiv[num].kol, input_kol(temp));
// или надо
if(eeprom_is_ready())
{
    eeprom_write_byte(massiv[num].index, num);
    eeprom_write_byte(massiv[num].oper, OP0);
    eeprom_write_byte(massiv[num].kol, input_kol(temp));
}
else {do {/*ждем готовности*/} while (!eeprom_is_ready())}

или надо использовать eeprom_is_ready() для каждой команды eeprom_write_byte/eeprom_read_byte
Наверное eeprom_is_ready() используется для записи/чтения больших блоков

Сообщение отредактировал Dim_ON - Jan 6 2008, 11:30
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 6 2008, 12:47
Сообщение #42


Гуру
******

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



Цитата(Dim_ON @ Jan 6 2008, 12:31) *
eeprom_write_byte(massiv[num].index, num);

eeprom_write_byte(&massiv[num].index, num);
Цитата(Dim_ON @ Jan 6 2008, 12:31) *
или надо использовать eeprom_is_ready() для каждой команды
Это описано в документации на avr-libc в комплекте WinAVR, в разделе <eeprom.h>.


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:02
Рейтинг@Mail.ru


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