|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:18 am
|
Страница 1 от 1
|
[ 7 мнения ] |
|
| Автор |
Съобщение |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
 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 за това?
|
| Сря Ное 03, 2010 4:20 pm |
|
 |
|
Cino
Ранг: Новодошъл
Регистриран на: Чет Окт 02, 2008 10:24 pm Мнения: 105
|
v c:\mcc18\h ,
във всеки h фаил за всеки PIC има
#define Swapf(f,dest,access) {_asm movlb f swapf f,dest,access _endasm }
само че имаше някаква особеност за dest i access, трябва да са с числа..
|
| Сря Ное 03, 2010 4:48 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
Ами аз така съм го правил:
|
| Сря Ное 03, 2010 6:39 pm |
|
 |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
movlb f ... това е хитро. не знаех че на movlb може да му подадеш директно променливата.
access обаче защо са го сложили ... след като зареждат банката и може винаги да е banked.
Проблема обаче остава проблема с union.
Може би въпроса е повече за union отколкото за swapf. Как да ползвам union променлива в inline асемблер
|
| Сря Ное 03, 2010 7:22 pm |
|
 |
|
sukhoi
Ранг: Напреднал
Регистриран на: Чет Авг 21, 2008 2:52 pm Мнения: 476 Местоположение: Пловдив
|
аз мисля че трябва да се сложи static на това което искаш да слопваш с тази функция Swapf(f,dest,access) .
и на access май се задава 1, т.е да е банкирана
|
| Сря Ное 03, 2010 8:01 pm |
|
 |
|
npelov
Ранг: Почетен член
Регистриран на: Пет Яну 22, 2010 5:46 pm Мнения: 680
|
за access си прав, но какво общо има статик. Ето това както писах работи:
но това - не: едит: не съм опитал каст към (unsigned char) например мне, не стана: Проблема е че с union е удобно да се работи, но дори някое поле да е байт не може да се ползва от inline асемблер. Ей това обаче работи:
Което ми подсказва че би трябвало да има някакъв cast или нещо такова...
|
| Чет Ное 04, 2010 1:48 am |
|
 |
|
sukhoi
Ранг: Напреднал
Регистриран на: Чет Авг 21, 2008 2:52 pm Мнения: 476 Местоположение: Пловдив
|
ами аз използвах rlfc(...) функцията и нищо не се въртеше на симулация в watch като гледах. Направих променливата static и проработи
|
| Чет Ное 04, 2010 8:09 pm |
|
|
|
Страница 1 от 1
|
[ 7 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|