Отговори на тема  [ 5 мнения ] 
Може ли, и как се предава UNION, като параметър в AVRGCC? 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Може ли, и как се предава UNION, като параметър в AVRGCC?
декларирам си следното

union word{
int16_t val16;
struct {
int8_t val8L;
int8_t val8H;
} byte;
}

извън някаква функция ползвам 16-битовата стойност на word, но в тялото на функцията ползвам поотделно двете еднобайтови стойности, заиграх се да го направя с union, но трябва да го предам като параметър на функцията, и тук компилатора сипе грешки:

void dummy( int8_t count, union word address)
{
int8_t a,b;
....
a=address.byte.val8L;
b=address.byte.val8H;
....
}

Всъщност искам с минимум генерирани от компилатора инструкции да имам достъп до байтовете на 16 или 32 битова променлива.
Не знам кой е най-добрия начин за това, за момента се сетих за union, като си мисля че компилатора ще се сети сам кое е най-бързо.

Опитах се да предавам адреси на променливи и чрез тях да извличам отделните байтове, или чрез шифтване с 8,16,24 бита и маскиране на младшия байт, но ми се струва че не са най-доброто за тази цел.

Какво ползвате вие в такива случаи?


Сря Ное 19, 2008 1:17 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Код:
typedef union
{
  int16_t val16;
  struct
  {
    int8_t val8L;
    int8_t val8H;
  } byte;
} word_t;

// деклариране на променливата
word_t  my_variable;

//деклариране на функцията на която искаш да предадеш параметъра. вариант предаване като указател.
void dummy( word_t * input_pointer )
{
    input_pointer->byte.val8L = xxxx
    input_pointer->val16++;
    .........................................
}

// Извикване на функцията
dummy( &my_variable );


Този метод на работа ми се струва най прегледен. В случая uniona ти е само 16 битов и ако ще го използваш само като входен параметър във функцията може да го предадеш и по стойност и за повечето платформи генерирания код ще е подобен.


Сря Ное 19, 2008 1:42 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Да изровя темата с поредния въпрос покрай АВРите...

Дефинирал съм типовете за UNION посочени в горните мнения в основния файл на проекта, но правя предаване на параметри от тип word_t на функции от вторичен файл на проекта.
Само, че WinAVR изрежда доста грешки.
Правя следното използване :
Код:
void fun(int8_t cmd, union word_t tmp)
{
int8_t a,b;
...
a=tmp.byte.val8L;
b=tmp.byte.val8H;
...
}

Къде трябва да се дефинира типът на union word_t за да е видим за всички файлове и функции от проекта.
Освен, че се включват като сорс-файлове към проекта, *.c файловете имат ли нужда от някакво допълнително описание , за да имат видимост към всички типове и променливи, които са дефинирани в основния файл на проекта?


Вто Фев 17, 2009 11:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
typedef за тази union трябва да го сложиш в някой h файл. Където е инклуднат ще имаш видимост за този тип.

А пък ако искаш променлива да се вижда навсякъде,там където я ползваш трябва да има дефиниця от типа

extern type_of_variable variable_name;

такива дефиниции за една променлива може да имаш колкото си искаш в проекта. Но променивата трябва да бъде дефинирана само веднъж в някой c файл на проекта така:

type_of_variable variable_name;

там и се заделя място в паметта. external дефинициите указват че тази променлива е дефинирана някъде другаде. Ако не си я дефинирал при лнкването ще ти излезе съответната грешка.

Аз обикновенно си слагам в h file-a на съответния C file. такива extern дефиниции на променливите които са дефинирани в C файла. Така където е инклуднат H файла имам видимост и на променливата. Но има случаи когато е по добре да се направи и по друг начин.


Вто Фев 17, 2009 11:22 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Благодаря Киров!
Някак си тръгна програмата, има да уча още много, и то не само в писането на софта, но и в 'администрирането' му :)


Сря Фев 18, 2009 11:01 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни