| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Битови манипулаций в С++ http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6462 |
Страница 1 от 1 |
| Автор: | RM [ Чет Яну 15, 2009 9:05 pm ] | |||||||||
| Заглавие: | Битови манипулаций в С++ | |||||||||
Има ли по лесен начин в C++(защото го пиша е такава среда и знам че се пише като на С) да се отдели бит от байт и да се използва в случая като променлива char
|
||||||||||
| Автор: | bobyk [ Чет Яну 15, 2009 9:27 pm ] |
| Заглавие: | |
Ами мисля че второто ще генерира по-къс код. Иначе мога да ти каже че ако е за пик на асм може да стане с 3 инструкции, а авр може да го направи дори с 2 инструкции (има инструкции bit load, bit store) |
|
| Автор: | RM [ Чет Яну 15, 2009 10:01 pm ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
Така е правилно .... сбъркал съм по горе. Използвах това по друг случай
Компилаторите за микроконтролери позволяват проненливи дефинирани като ...
Интересува ме как се прави в Borland C++. |
||||||||||||||||||||||||||||
| Автор: | ¶ [ Чет Яну 15, 2009 11:55 pm ] | |||||||||
| Заглавие: | ||||||||||
Какво искаш да правиш, след като си отделил бита и си го заредил в променлива тип char ? Искаш бита да е на същата позиция на която си е бил, или просто искаш да го заредиш като 1 или 0 в променливата тип char ? Втория код ( ако е само да знаеш 1 или 0 ) може да стане още по-компактен ( като размер, не като скорост ), ако го напишеш така:
|
||||||||||
| Автор: | RM [ Пет Яну 16, 2009 10:18 am ] |
| Заглавие: | |
Да 0 или 1 в променлива тип чар. Искам да следя състояние на портове. Да се виждат в прозореца на програмата.Имам на платката 4 джъмпера, и тях искам да виждам на прозореца. Искам да изписвам прочетените от ADC-стойности на няколко пина, и ми трябва най компактно прехвърляне по серийния порт ( промерно с 2 BCD za 4 цифри). И се чудя как да намаля размера на пакетите, за да се обновява най-бързо на екрана на PC-то. Или по точно , имам една машина на която трябва да заменя скъпоструващото оригинално процесорно, с много, много по ефтино. Но има процеси който трябва да се настройват много финно в реално време, за да е налице същия резултат. Трябва да следя състоянието на мощните елементи и да се сигнализира при повреда, вентилатори да ли се въртят... |
|
| Автор: | ToHu [ Съб Яну 17, 2009 1:45 pm ] |
| Заглавие: | |
То много зависи за какъв процесор го пишеш според мен ама ..... |
|
| Автор: | Цецо [ Съб Яну 17, 2009 1:55 pm ] |
| Заглавие: | |
За съжаление при подобни ситуации ти се налага да поназнайваш асемблер. Инак няма как да знаеш какво е натворил конкретния компилатор, за конкретния процесор. Всеки е със собствено мнение. |
|
| Автор: | RM [ Съб Яну 17, 2009 5:07 pm ] |
| Заглавие: | |
Ще стане много трудно на асемблер, затова тъпо ама ще заложа на производителност, и повече Mhz. Мисля си за Mega32. Важно ми е, и не искам да ползвам някоя SAM7 , все още не съм ги изучил добре. |
|
| Автор: | Zdrav [ Съб Яну 17, 2009 9:45 pm ] |
| Заглавие: | |
Ако искаш да намалиш размера на пакетите и да стане по-бързо, предавай направо целия байт (port_b_byte). И остави ПС-то да се занимава с манипулирането на битовете. Освен това като напишеш веднъж фърмуеъра после е въпрос на развой върху ПС за да получиш информацията на монитора във вид в който ти е най-удобно. Иначе ако въпроса ти е принципен, както Цецо ти каза гледай резултата в асемблера. При arm-elf-gcc например с включена оптимизация, както и да го напишеш на С в крайна сметка и двата варианта, които си дал ще се сведат до едно и също. |
|
| Автор: | miro_atc [ Съб Яну 17, 2009 11:13 pm ] |
| Заглавие: | |
arm-elf-gcc вероятно ще се справи по-добре в първия случай, защото няма if() и при thumb ще се избегнат преходи (които тормозят конвейра) а при arm-mode може да се избегне условното изпълнение, т.е. вместо с 2 да стане с 1 инструкция. Друг е въпросът, arm-elf-gcc има алергия към char & short типове и много вероятно да вкара излишно шифтване напред-назад... Това което буди недоумение е защо трябва да се пръскат битовете в отделни променливи. Обикновено много по-ефективно е в една променлива да се запиши стойността на целия порт. Иначе и маската ако е константа е безсмислена... |
|
| Автор: | Zdrav [ Нед Яну 18, 2009 12:35 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Абе да ти кажа не вложих толкова усилия в разсъждението относно arm-elf-gcc. Основната ми мисъл беше че маскирането обикновенно го свежда винаги до шифтване наляво и после надясно. Ето един набързо скалъпен тест:
Резултата е:
Това е в arm режим. Тука се вижда един дефект на компилатора, който имам инсталиран на домашния компютър. В първата функция има ненужно дублиране на унструкции. Нещо беше скапана тази версия(4.2.2) която инсталирах тогава с YAGARTO. В предишната както и в последната тези магарии ги няма. Но се вижда че последните две функции са еднакви. А за пръскането на битовете в отделни байтове и аз това имах впредвид - не е нужно. |
|||||||||||||||||||
| Автор: | miro_atc [ Нед Яну 18, 2009 1:11 am ] |
| Заглавие: | |
Избягвай char... в случая unsigned char test_bit4(unsigned char port_b) е по-добре да е: unsigned int test_bit4(unsigned int port_b) Самата функция декрарина и по двата начина ще ти даде един и същ код, но при извикването може да те изненада ако я викнеш така: test_bit4(port_b_byte +1); просто ще вкара два ненужни шифта за да направи параметър char, демек да махне евентуален пренос в старшия байт... |
|
| Автор: | Zdrav [ Нед Яну 18, 2009 1:39 am ] | |||||||||
| Заглавие: | ||||||||||
Това е ясно. Написах го с char само за примера. Явно стратегията на компилатора е да маскира старшите байтове извън функцията, при извикването и, и затова наистина в примерите не се вижда това което искаше да кажеш в предния пост. Дано не сме забъркали по-голяма каша в главата на RM с "академичното" отклонение към arm-elf-gcc. |
||||||||||
| Автор: | Yanek [ Нед Яну 18, 2009 2:53 pm ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
Компилаторите, които използвам за С и С++ за микроконтролери обикновено позволяват побитови структури. Ето пример на IAR:
Този пример е с абсолютно задаване на адреса на променливата. по друг начин:
В клас:
Редакция: Редно е компилатора да изписка от подобно неявно преобразуване на char в unsigned char, но IAR-а явно счита, че не може да се получи загуба на информация (наистина е така) и си мълчи. Затова и съм го оставил така. |
||||||||||||||||||||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|