| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| MCCP (C18) и оптимизация http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8263 |
Страница 1 от 1 |
| Автор: | npelov [ Сря Ное 03, 2010 4:20 pm ] | |||||||||||||||||||||||||||
| Заглавие: | MCCP (C18) и оптимизация | |||||||||||||||||||||||||||
Как да напиша на C нещо което да се транслира в: swapf XXX, f Опитах какво ли не -union с 4 бита, x<<4 | x>>4, последното с & 0xF0 и & 0X0F .. Виждал съм x=x & ~(1<<5) да се транслира в bsf x, 5 (може и да не е било с майкрочипското C) Пробвах с inline:
обаче има 2 проблема: 1. ако използвам инлайн в някоя функция се изключва оптимизацията за тази функция 2. не работи с union. Пример:
последното го прескочих с функция:
което обаче генерира 4-5 инструкции при извикването. доста код си е за едно swapf. Чудя се дали има някакъв готов макрос в MC C18 за това? |
||||||||||||||||||||||||||||
| Автор: | Cino [ Сря Ное 03, 2010 4:48 pm ] |
| Заглавие: | |
v c:\mcc18\h , във всеки h фаил за всеки PIC има #define Swapf(f,dest,access) {_asm movlb f swapf f,dest,access _endasm } само че имаше някаква особеност за dest i access, трябва да са с числа.. |
|
| Автор: | relsys [ Сря Ное 03, 2010 6:39 pm ] | |||||||||
| Заглавие: | ||||||||||
Ами аз така съм го правил:
|
||||||||||
| Автор: | npelov [ Сря Ное 03, 2010 7:22 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
movlb f ... това е хитро. не знаех че на movlb може да му подадеш директно променливата. access обаче защо са го сложили ... след като зареждат банката и може винаги да е banked. Проблема обаче остава проблема с union.
Може би въпроса е повече за union отколкото за swapf. Как да ползвам union променлива в inline асемблер |
|||||||||||||||||||
| Автор: | sukhoi [ Сря Ное 03, 2010 8:01 pm ] |
| Заглавие: | |
аз мисля че трябва да се сложи static на това което искаш да слопваш с тази функция Swapf(f,dest,access) . и на access май се задава 1, т.е да е банкирана |
|
| Автор: | npelov [ Чет Ное 04, 2010 1:48 am ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | |||||||||||||||||||||||||||||||||||||
за access си прав, но какво общо има статик. Ето това както писах работи:
но това - не:
едит: не съм опитал каст към (unsigned char) например мне, не стана:
Проблема е че с union е удобно да се работи, но дори някое поле да е байт не може да се ползва от inline асемблер. Ей това обаче работи:
Което ми подсказва че би трябвало да има някакъв cast или нещо такова... |
|||||||||||||||||||||||||||||||||||||
| Автор: | sukhoi [ Чет Ное 04, 2010 8:09 pm ] |
| Заглавие: | |
ами аз използвах rlfc(...) функцията и нищо не се въртеше на симулация в watch като гледах. Направих променливата static и проработи |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|