реклама на сайте
подробности

 
 
> Вычисляемый GOTO на pic18f45j10, максимальное быстродействие
=GM=
сообщение May 19 2008, 15:31
Сообщение #1


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Понадобилось написать на ассемблере вычисляемый GOTO, аналог switch k на си, с максимально возможным быстодействием. Пока дошёл до такого кода
Код
       movlw   HIGH v8goto
       movwf   PCLATH
       movf    k,w
       addwf   k,w
       addwf   PCL,1
v8goto
       bra     v8mf0     ;k=00
       bra     v8mf1     ;k=01
       bra     v8mf0     ;k=02-MF2(cylinder 1 & 5)
       bra     v8mf0     ;k=03
       bra     v8mf0     ;k=04
и т.д.

Проблема состоит в размещении кода в любом месте программы. После компиляции смотрю, где лежит таблица переходов, если не пересекает 256-байтную границу, то всё в порядке. Интересно бы посмотреть, как кто делает.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
buka_2004
сообщение Jun 17 2008, 07:40
Сообщение #2





Группа: Новичок
Сообщений: 2
Регистрация: 21-12-07
Пользователь №: 33 520



Для 18 серии еще возможен вот такой вариант на все случаи жизни и код будет перемещаемым, и размер k любой.
Код
    clrf    PCLATH
    rlcf    k, w
    btfsc    STATUS, C              ;это можно опустить если k<128
    incf    PCLATH, f            ;это можно опустить если k<128
    addlw    low    TAB_GOTO
    movlw    high  TAB_GOTO
    addwfc    PCLATH, f
    rlcf    k, w
    addlw    low    TAB_GOTO
    movwf    PCL

TAB_GOTO
    bra    L_1
    bra    L_2
...


Сообщение отредактировал buka_2004 - Jun 17 2008, 07:42
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 1 2008, 16:52
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(buka_2004 @ Jun 17 2008, 06:40) *
Для 18 серии еще возможен вот такой вариант на все случаи жизни, и код будет перемещаемым, и размер k любой.
Код
    clrf    PCLATH
    rlcf    k, w
    btfsc    STATUS, C        ;это можно опустить если k<128
    incf    PCLATH, f        ;это можно опустить если k<128

Здесь у вас возможна неуловимая ошибка во второй строке, если при выполнении фрагмента бит переноса будет установлен. Такие ошибки весьма опасны, поскольку их трудно отследить. Лучше код переписать так
Код
     clrf   PCLATH
     bcf    STATUS,C
     rlcf   k,w
     rlcf   PCLATH
и далее по тексту

Но код всё равно получается длинный, если сравнивать с моим последним вариантом, а стоит он у меня в прерывании.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 01:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016