Хм, продолжение...Пожалуй шаговые двигатели пока постоят.
А мы поговорим о Форте. Я не стану холиварить, скажу просто: Forth - он другой. Категорически. И теперь из горних высей плавненько перемещаемся поближе к делам нашим многотрудным )) Каждый, кто писал код для микроконтроллера, управляющий каким-либо железом ( драйвер, иными словами ), знает что такое всеразличные
delay() и для чего они нужны.
Посмотрим, что может предложить amForth-4.2: в лексиконе имеется слово
1ms, что , как нетрудно догадаться, означает задержку приблизительно в 1 миллисекунду. Кроме него имеется слово ms. Унутреннее его устройство:
: ms 0 ?do 1ms loop ;Видно, что оно просто в цикле вызывает слово
1ms указанное количество раз
Применяется так:
5 ms bla-bla-bla 10 ms .
Хорошие слова, полезные. А как быть, если нужны микросекундные интервалы? Если вы еще помните, в прошлом посте я ставил себе задачу наладить обмен с мышой и миллисекундные тооооормозззза никанают.
Начинаю исследовать amForth, напрягая таймер2: прескалер=8 ( amForth у меня крутится на 8 МГц, соответственно таймер будет щелкать микросекунды), счет от 0 и до останова.
Код:
amforth 4.2 ATmega32
> decimal
ok
> : t2> 0 TCCR2 c! ; \ остановить таймер
ok
> : <t2 2 TCCR2 c! ; \ запустить в вышеобозначенном режиме
ok
> \ собственно сам тест
ok
> : <t2> t2> 0 TCNT2 c! <t2 t2> cr TCNT2 c@ dup .x bl emit . ;
ok
> <t2>
16 22 ok
> <t2>
15 21 ok
> <t2>
15 21 ok
>
Хм, 21 микросекунда между стартом и стопом таймера, хреново...
Включаю моск. Каждое из слов
<t2 t2> является высокоуровневым определением, и в свою очередь состоит из вызовов трех высокоуровневых слов. Каждое такое слово обрабатывает внутренний ( адресный) интерпретатор Форта. Вобщем, полученный результат мне не нравится. Хотелось бы интервалов покороче. Что нам говорит программерская традиция? "Критичные по времени участки кода пишуться на ассемблере." О как! Их есть у amForth'а

...\amforth-4.2\lib\assembler.frt ( скормлен на шаге 2 из передыдущего поста). Продолжаем шаманить: определим слова запуска и останова таймера на встроенном ассемблере
Код:
> only forth also assembler
ok
> hex 25 constant tccr2
ok
> code t2> tccr2 R2 out, end-code
ok
> code <t2 R17 2 ldi, tccr2 R17 out, end-code
ok
> : <t2> t2> 0 TCNT2 c! <t2 t2> cr TCNT2 c@ dup .x bl emit . ;
ok
> only forth
ok
> decimal
ok
> <t2>
3 3 ok
> <t2>
3 3 ok
> <t2>
3 3 ok
>
Комментарии к коду:
- регистр
R2 во внутренней кухне amForth'а используется как 'ноль',
( см."...\amforth-4.2\core\macros.asm")
-
TCCR2 имеет значение
0x45, адрес, который не может использоваться с ассемблерной командой '
out', для этого определяется
tccr2, имеющий значение
0х25.
- претензии к виду ассемблерного кода отметаются, как флудерастские ( изучайте матчасть).
- загадочное слово '
.x ' выводит на консоль ("распечатывает") число на вершине стека в шестнадцатиричном виде, сохраняя текущее основание системы счисления и имеет определение:
: .x base @ swap hex . base ! ; - слово '
.' просто распечатывает число на стеке по текущему основанию.
- фраза '
bl emit' выводит на консоль пробел.
- '
cr' выводит на консоль "перевод строки, возврат каретки"
Итак, 3 микросекунды. Есть мнение признать результат удовлетворительным.
Но будем последовательны и запустим еще один тест. Между
<t2 t2> воткнем примитив, который ничего не делает -
noop и посмотрим, что из этого выйдет.
Код:
> : <<t2>> t2> 0 TCNT2 c! <t2 noop t2> cr TCNT2 c@ dup .x bl enmit . ;
ok
> <<t2>>
7 7 ok
>
Что мы видим? Накладные расходы на внутренний (адресный) интерпретатор косвенного шитого кода составляют 4 микросекунды. Претензии принимаются.
Могу сказать, что amForth конечно же неудовлетворителен для серьезных разработок.
А взрослые дяди для этих целей применяют коммерческие системы
SwiftX (
http://www.forth.com/embedded/swiftx-em ... ms-14.html ) от
Forth, inc. и
VFX Forth от
MicroProcessor Engineering limited (
http://www.mpeforth.com/ ), которые генерят нативный код, позволяют всеразличную оптимизацию, вплоть до удаления из целевого кода всего, что внем не используется...Но это уже "совсем другая история", да и стоят они неподъёмно - 1500 баксов и евриков соответственно, а жаль

Уфф, заколебался уписываться. Хватит на сегодня, пожалуй.
Засим, откланиваюсь, искренне Ваш chu.
PS. moving forth.