Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Може ли, и как се предава UNION, като параметър в AVRGCC?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6286
Страница 1 от 1

Автор:  Ники [ Сря Ное 19, 2008 1:17 am ]
Заглавие:  Може ли, и как се предава 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 бита и маскиране на младшия байт, но ми се струва че не са най-доброто за тази цел.

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

Автор:  Nikola Kirov [ Сря Ное 19, 2008 1:42 am ]
Заглавие: 

Код:
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 битов и ако ще го използваш само като входен параметър във функцията може да го предадеш и по стойност и за повечето платформи генерирания код ще е подобен.

Автор:  Ники [ Вто Фев 17, 2009 11:09 pm ]
Заглавие: 

Да изровя темата с поредния въпрос покрай АВРите...

Дефинирал съм типовете за 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 файловете имат ли нужда от някакво допълнително описание , за да имат видимост към всички типове и променливи, които са дефинирани в основния файл на проекта?

Автор:  Nikola Kirov [ Вто Фев 17, 2009 11:22 pm ]
Заглавие: 

typedef за тази union трябва да го сложиш в някой h файл. Където е инклуднат ще имаш видимост за този тип.

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

extern type_of_variable variable_name;

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

type_of_variable variable_name;

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

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

Автор:  Ники [ Сря Фев 18, 2009 11:01 pm ]
Заглавие: 

Благодаря Киров!
Някак си тръгна програмата, има да уча още много, и то не само в писането на софта, но и в 'администрирането' му :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/