| Микроконтролери и електроника 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 ] | |||||||||
| Заглавие: | ||||||||||
Този метод на работа ми се струва най прегледен. В случая uniona ти е само 16 битов и ако ще го използваш само като входен параметър във функцията може да го предадеш и по стойност и за повечето платформи генерирания код ще е подобен. |
||||||||||
| Автор: | Ники [ Вто Фев 17, 2009 11:09 pm ] | |||||||||
| Заглавие: | ||||||||||
Да изровя темата с поредния въпрос покрай АВРите... Дефинирал съм типовете за UNION посочени в горните мнения в основния файл на проекта, но правя предаване на параметри от тип word_t на функции от вторичен файл на проекта. Само, че WinAVR изрежда доста грешки. Правя следното използване :
Къде трябва да се дефинира типът на 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/ |
|