Цитата(MrYuran @ Jul 7 2009, 20:15)

А каким фортом для MSP пользуетесь?
Вынужден огорчить

, никакого особого форта для MSP430 у меня нет, пишу на ассемблере.
НО! Forth - это прежде всего технология программирования ( философия решения задач ), и уже затем - язык и всё такое прочее...
Первый источник идеи - A 3-INSTRUCTION FORTH FOR EMBEDDED SYSTEMS WORK
http://pygmy.utoh.org/3ins4th.htmlВторой - виртуальная форт-машина, аналогичная имеющейся в SwiftX MSP430,
а также небольшой набор традиционных для форта примитивов, реализованных на ассемблере.
Плюс форт-сервер ( в терминологии не уверен) созданный в ростокском универе во времена оно.
Высокоуровневое определение этого сервера :
: Server BEGIN addr execute ACK char_send AGAIN ;
Как это работает.
Иаровский асм генерит код , который шьется в чип, кроме этого генерит "таблицу перекрестных ссылок" ( my_application.map ), в которой приводится однозначное соответствие цепочка_символов == число. Вырезка из этого файлика скармливается SPF4:
CODE
\
\
\ в словаре XTARGET создаются словари MSP430, TARGET, XDEBUG
\
VOCABULARY XTARGET ALSO XTARGET DEFINITIONS
VOCABULARY MSP430 \ определения регистров и битов процессора
VOCABULARY TARGET \ application. слова-константы содержат адреса целевых п/п
VOCABULARY XDEBUG \ обмен с target, отладочные\тестовые "скрипты"
\
\
ALSO MSP430 DEFINITIONS
: EQU CONSTANT ;
S" E:\vm_working\mast_tst\f235\Host\msp430x23x.f" INCLUDED
\
\
ALSO TARGET DEFINITIONS
TRUE VALUE MAP?
\ Благодарность VoidVolker. С его великодушной помощью написано следующее:
: NUMBER 0 0 2SWAP >NUMBER NIP IF 2DROP FALSE ELSE D>S TRUE THEN ;
: DO-MY CREATED BASE @ HEX NextWord NUMBER 0= THROW , BASE ! DOES> @ ;
: NOTFOUND ( a u -- )
2DUP 2>R ['] NOTFOUND CATCH
IF
2DROP MAP? IF 2R@ DO-MY ELSE -2003 THROW THEN
THEN
RDROP RDROP
;
S" E:\vm_working\mast_tst\f235\Host\app.f" INCLUDED
FALSE TO MAP?
MSP430 по сбросу и после необходимой инициализации крутится в п/п Server - ожидает 16-бит слово
и делает переход по этому адресу.
CODE
;
;
execute_: ; ( xt -- )
mov T,W
tpop
br W
;
ACK EQU 0x90
;
server:
bis.b #BIT0,&P1OUT ; LED+
call #addr
bic.b #BIT0,&P1OUT ; LED-
call #execute_
tpush
mov #ACK,T
call #char_out
jmp server
;
Всё!
Остальным я рулю из консоли SPF4.
CODE
ALSO XDEBUG DEFINITIONS
\ *********************************************************
\ работа с целевым процессором
\
0x90 VALUE ACK \ подтверждение от target device
: ok? ( c -- ) CommIn DUP ACK = NOT IF CR ." target no ACK,received=" SPACE . ABORT ELSE DROP THEN ;
: c>t ( c -- ) \ переслать байт, принять эхо, сравнить
DUP CommOut CommIn 2DUP
= NOT IF CR . ." <-<" .
CR ." bad connection. need to reset target" ABORT
THEN 2DROP ;
: >t ( n -- ) \ переслать слово (2бйта)
DUP 0xFF AND c>t 8 RSHIFT c>t ;
: t> ( -- n ) \ принять 2байта от target device
CommIn 0xFF AND CommIn 0xFF AND 8 LSHIFT + ;
: >x >t ok? ; \ выполнить п/п в target device
: >s ( n -- ) \ положить слово на верхушку целевого стека параметров
addr >t >t ok? ;
: s> ( -- n ) \
eword >t t> ok? ;
: t! ( n a -- ) \ записать n по адресу a
DUP RAMEND > ABORT" address not valid" \ ОЗУ и периферия
SWAP >s DUP >s
0x00 0x100 WITHIN
IF cstore
ELSE store
THEN >x ;
: t@ ( a -- n ) \ прочитать содержимое a
DUP >s
0x00 0x100 WITHIN \ байт?
IF cfetch
ELSE fetch
THEN >x s> ;
Такой ( наверное довольно громоздкий ) подход позволяет не прошив ни байта кода сверх имеющегося,
прощупать каждый регистр, каждый бит HW периферии ( как на борту процессора так и вовне ),
настроить периферию на любой режим работы и выбрать оптимальный\целесообразный и только потом написать фрагмент кода ( на асме

) с последующим тестированием ( обязательно ). Зачастую этот процесс идет параллельно с изучением datasheet
на соответствующий периферийный модуль.
Конечно, дело не ограничивается установкой битов, чтением регистров и тд. Взможность писать форт-определения ( в SPF4 ),
реализующие какие-то более сложные алгоритмы работы target device, присутствуют в полной мере.
Ну вот, как-то так.