Виртуальная машина и скриптовой движок в MSP430G2553 - проще пареной репы. 4e4th + TI Launchpad

Вот и дождался я своего launchpad'a!
Жажда халявы и широкий пеар в узких кругах сделали свое черное дело :)
Ну да ладно, пора к делу.

Итак,

постановка задачи

Дано:
непонятная красненькая плата со штырьками PLS-ок, USB шнурок и… собственно, всё.
Никаких ардуин на компе, никаких иаров, композеров, и даже MspGCC вне досягаемости.

Требуется написать и разместить в памяти контроллера программу, выполняющую какие-либо полезные действия.
С помощью циркуля и линейки, то есть консоли и терминала.
Страшно?!

Возможно, олдфаги мне скажут — «фигня вопрос, мы-то в советские времена ещё и не такое делали». Пожалуй, соглашусь. Было время, рисовал в клетчатой тетради листинги в машинных кодах (!) Z80, а потом забивал в память с помощью простейшего «загрузчика» INPUT-POKE addr-GOTO 10 (ностальжи :)

Однако, отвлекся. Это ещё не все. Определим, что же будет делать наша программа.
Пусть будет джентльменский набор новичка. То есть:

  1. Измерение напряжений на аналоговых входах. Измерение внутренней температуры.
  2. Управление внешними устройствами
  3. Опрос дискретных входов (кнопка S2)
  4. Вывод на индикатор
  5. Форматный вывод в UART
  6. Командный интерфейс через UART

Но и это ещё не всё.

7. Предоставим пользователю возможность переопределять функции по своему усмотрению через тот же терминал, подключенный к UART-у.

Вот теперь всё.

Поехали!


Позвольте мне, пока зрители рассаживаются в партере, подготовить некоторый реквизит.

Как некоторые справедливо заметили, в заголовке фигурирует непереводимая игра букв 4e4th. Это как раз то, что нам нужно. Переходим на сайт проекта и скачиваем необходимые файлы.

  1. IHEX файл прошивки (сохранить объект как)
  2. Драйвер для ланчпада
  3. Программатор FET-Pro430 Lite (free)

Все необходимые приготовления сделаны, можно начинать.

Устанавливаем драйвер (у кого не установлен), запускаем программатор, прошиваем.
У кого установлен IAR (можно даже KickStart) или CCS, могут прошиться привычным способом.
Секунды томительного ожидания, и вдруг оба светодиода на плате загораются.

Ну, и?!


Спокойствие, только спокойствие! Как завещал великий Карлсон.
Не написав ни строчки кода, мы внезапно реализовали три крайних с конца пункта, два из которых являются нетривиальными с т.з. начинающего программиста микроконтроллеров.

Как такое возможно? Дело в том, что та прошивка, которую мы залили — это ядро форт-системы (forth), основанной на компактном CamelForth Брэда Родригеса.
Заняв 8кБ флеш-памяти, то есть ровно половину из отпущенных нам 16кБ, мы получаем:

  • Интерактивный парсер входного потока UART
  • Встроенную систему компиляции введенных слов
  • Доступ через терминал абсолютно к любой периферии контроллера
  • Базовые математические и логические операции
  • Преобразования string <-> num
  • Преобразования из одной системы счисления в другую (с произвольным основанием)
И многое другое, выходящее далеко за рамки вводной статьи.

Экспериментальная часть


Наш LaunchPad живет теперь собственной внутренней жизнью, хоть это ничем внешне не проявляется. Чтобы поучаствовать в процессе, необходимо подключиться любым терминалом к виртуальному СОМ-порту платы (в моем случае это COM2)


Терминал — любой, какой нравится. Пусть даже дефолтный HyperTerminal.
Устанавливаем соединение со стандартными параметрами 9600-N-1

Важное замечание: джамперы RXD и TXD на плате установлены по умолчанию в положение SW UART, то есть неправильно.
Нужно их развернуть поперек, о чем свидетельствует шелкография и п.5 приложенного руководства (но кто ж их читает :)

Да-да, вот эта картинка :)

Торжественный момент…
Нажимаем кнопку S1 (Reset) на плате…

> 4E4th-se v0.34 Apr 5 2012|110001110 Cold
>

4e4th выдал при старте свое приветствие и заодно сообщил о холодном старте.

Конечно, чтобы лучше понимать, о чем пойдет речь дальше, все-таки неплохо бы пролистать основы фортостроения, я по мере возможности буду пояснять выполняемые действия.

Ниже пойдут диалоги в терминале, жирным договоримся выделять то, что вводится с клавиатуры. Ответы — обычным текстом.

Упражнение 1. HelloWorld :)


> : hello ." Hello World! " ;
ok
> hello
Hello World! ok
>

Так просто!
Поясню, что произошло.

Мы определили новое слово hello, которое выводит текст, и скомпилировали его в пользовательский словарь.
Здесь придется расписать по буквам и разъяснить азы азов, чтобы было понятно всем.
Программа в форте состоит из слов, которые размещены в т.н. словаре.
Интерпретатор парсит входной поток, выделяет слова (разделом считается пробел) и ищет их в словаре.
Найдя слово, выполняет. Не найдя, выводит непонятое со знаком вопроса.

Разбираем наш случай. Подробно, пословно. Каждое слово на новой строке с комментариями.

:        // Начало определения нового слова.
hello    // имя нового слова (можно и старого, в этом случае оно будет переопределено)
."       // вывод текстовой строки, следующей до закрывающей кавычки
"        // закрывающая кавычка
;        // конец определения. Новое слово компилируется и упаковывается в словарь.

Теперь, набрав hello, мы вызвали вновь определенное слово на исполнение и получили, как и было задумано, текстовую строку на выходе.

Идем дальше.

Упражнение 2. HelloLight

Попробуем помигать светодиодиками, раз уж они есть.
Разработчики образа системы заботливо предопределили для нас слова для установки и сброса периферийных регистров по маске.
Это слова cset и cclr.
Также, определены адреса и маски для светодиодов — соответственно, red и green.

Попробуем.
red cset
Загорелся красный с/д

red cclr
Погас обратно.

Здесь подробно описано, как это работает, но я все-таки прокомментирую.
Слово red кладет на стек данных (а есть ещё и стек возвратов, но это нас пока не касается) два числа. Адрес периферийного регистра P1OUT (0x21) и маску пина с подключенным красным светодиодом (0x01).
Проверим?
>red . .
33 1  ok
>

Заодно узнали новое слово. Точка (.) снимает содержимое вершины стека и выводит в выходной поток.
В конструкции red cset последнее слово снимает со стека адрес и устанавливает в нем биты по маске, которая лежит в следующей ячейке стека.

Таким образом, мы имеем доступ абсолютно к любой периферии, задавая адрес и значение прямо из терминала. Аналогичные слова есть и для чтения.

Попробуем соорудить чего-нибудь повеселее.
> : blink ( mask port time -- )
 ok >r 2dup ( mask port mask port, R -- time )
 ok cset ( mask port )
 ok r> (  mask port time, R-- )
 ok ms ( mask port )
 ok cclr ( -- )
 ok ;
 ok

> red 200 blink
 ok
>

Светодиод моргнул и погас.

Как видим, копилка пополнилась ещё порцией стандартных слов. Более того, применены комментарии в том виде, как принято в форте. Это так называемый стековый портрет слова. Слева от черточек показан вид стека до выполнения (фактически это список аргументов), справа — после. То есть возвращаемые параметры. Далее в каждой строке отображен стек после выполнения слов.

Здесь сталкиваемся со стеком возвратов R, который используем в качестве временного буфера для «лишнего» значения задержки. Слова >r и r> перекидывают значения с одного стека на другой и обратно.

Слово ms формирует задержку в миллисекундах, равную значению на стеке.

Идем дальше. Я, с вашего позволения, не буду больше приводить диалоги в терминале, а просто покажу текст, который надо вводить.

: 2blink red 200 blink green 200 blink ;

: blinks
begin
2blink
s? until ;


Запустив на выполнение слово blinks, увидим поочередное моргание светодиодов.
Наконец-то добрались до циклов. Слово until проверяет значение на стеке и в случае нулевого значения запускает новую итерацию.
Слово s? опрашивает кнопку s2 и оставляет результат на стеке.
Нажав кнопку, остановим веселое моргание и вернемся в режим диалога.

Упражнение 3. Benchmark


Введем небольшой тест.

> : test
  begin
  red cset
  red cclr
  key? until ;

> test

Слово test запускает цикл «ногодрыганья» пином красного светодиода, пока на вход не поступит символ с терминала.
Слово key? проверяет входной буфер UARTa.

К пину P1.1 подключен осциллограф для контроля временных параметров.

Запускаем.

На экране осциллографа ровные импульсы длительностью 3,8 мкс и 7,8 мкс паузы между ними.
Посмотрим в исходниках ядра, чему равна тактовая частота.


    mov.b   &CALBC1_8MHZ, &BCSCTL1   ; Set DCO
    mov.b   &CALDCO_8MHZ, &DCOCTL    ; to 8 MHz.

То есть, частота DCO равна 8 МГц, получаем по 30 тактов на исполнение команд red cset и red cclr и около 60 на все остальное (опрос UART и цикл).
Много это или мало, решайте сами.

Для сравнения, попробуем реализовать то же самое в Arduino-like Energia.

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}

void loop()
{  
    digitalWrite (ledPin, HIGH);
    digitalWrite (ledPin, LOW);
}

Результаты такие: период ровно 5 мкс, примерно 2мкс положительный импульс и около 3-х пауза.
Здесь, правда, нет опроса флага UARTа, только голый цикл, но это не принципиально. По длительности импульса можно оценить порядок разницы в быстродействии.

На этом рискну завершить вводную статью (да-да, на самом интересном месте!)
Отдышаться, осмотреться и по отзывам решить, в какую сторону и как двигаться дальше.
Так как тема очень обширная и для меня крайне интересная, но хотелось бы, чтобы это было интересно ещё кому-нибудь, кроме меня.
В конечном итоге планирую по шагам реализовать все то, о чем было заявлено в начале.

В заключение — ссылки по теме

С чего все начиналось (как вирус форта поразил мой мозг)
Продолжение
WingLion — русскоязычный форум по forth
4e4th — сабжевый проект
CamelForth — прототип (обратите внимание на список поддерживаемых архитектур)

Напоследок, небольшой фокус :)

> : привет 2blink ;
 ok
> привет
 ok
>


Вторая часть: Основы forth
Третья часть: Лезем внутрь
  • +9
  • 01 ноября 2012, 12:57
  • MrYuran

Комментарии (78)

RSS свернуть / развернуть
Лишний раз убеждаешься, как же много есть способов работы с МК. Жаль только forth я совсем не знаю, но теперь есть повод поковыряться :)
Спасибо за статью, прочитал с удовольствием!
0
Требую продолжения банкета! Какова скорость исполнения, требования к флешу и ОЗУ, возможно ли использовать прерывания или низкоуровневый доступ к периферии?
0
Получается высокоуровневое программирование микроконтроллеров, очень интересно, жду продолжения.
0
Очень интересно. Как говорится «песчы изчо!»…
Мне, конечно, как человеку с абсолютно нулевыми знаниями в этой области, было немного сложновато воспринимать материал, но в целом статья неплохая. Буду ждать продолжения
0
ИМХО бесполезная приблуда.
Write-only синтаксис, на С то же самое выглядит еще короче.
Нужно грузить через СОМ — прошейте бутлоадер.
+1
а как насчет программирования без IDE и без компилятора? По-моему это круто! Сам ковырял в свое время форт, была отличная тренировка для мозгов… Теперь когда он есть в ланчпаде, можно все вспомнить, и это здорово!
0
Мне здесь чудится скриптование универсального устройства, типа простенького ПЛК. Когда можно на коленке перенастроить девайс под что угодно. Все плюсы интерпретируемого языка даром. Хотя форт конечно не очень популярный язык. Ну и на ланчпаде форт-машина сьедает половину флеша, что много для ланчпада и немного для армов, где 128к никого не удивишь.
+1
что меня смущает, так это обработка прерываний… как с этим у форта?
0
В этой реализации форта никак — он позиционируется как учебный. Да и в стандарте обработка прерываний никак не регламентируется. Но никто не мешает написать свой обработчик.
0
здесь описан принцип
0
Вот ниже дана ссылка на SwiftForth, а вот выдержка из документации:
The basic, high level code form of an interrupt handler is:

LABEL

<name> <dev#> INTERRUPT

where LABEL starts the definition of the routine, which is called name; the code instructions perform the necessary work of the routine; dev# is the device code or interrupt vector to which the routine will respond, and INTERRUPT is a special code-ending macro that assembles the appropriate return-from-interrupt instruction and attaches the address of name to the interrupt vector. When an interrupt occurs, it will be vectored directly to the code at name with no overhead imposed by SwiftOS.
</blockquote>
Как видим, даже коммерческие проекты существуют. Стоимость пакета лучше не смотреть :(
0
черт, движок увидел в сообщении тег code и все перемешал…
0
Forth не совсем интерпретатор в привычном понимании. Это компилятор в так называемый «шитый» код. А вот шитый код уже интерпретируется. И не надо путать его с «P-code» — они по разному интерпретируются.

Слово ":" производит компиляцию скормленного ему текста. На выходе получаем шитый код. Формат кода может быть разный (существует несколько вариантов реализации шитого кода), от него зависит сколько байт будет занимать скомпилированное слово и как быстро оно будет выполняться.

Поковырял немного исходники. Ниже весь интерпретатор шитого кода.
; ----------------------------------------------------------------------
; INTERPRETER LOGIC
; ITC NEXT is defined as
;        MOV @IP+,W      ; 2 fetch word address into W
;        MOV @W+,PC      ; 2 fetch code address into PC, W=PFA

;C EXECUTE   i*x xt -- j*x   execute Forth word at 'xt'
        HEADER  EXECUTE,7,'EXECUTE',DOCODE
        MOV TOS,W       ; 1 put word address into W
        MOV @PSP+,TOS   ; 2 fetch new TOS
        MOV @W+,PC      ; 2 fetch code address into PC, W=PFA

;C EXIT     --            exit a colon definition
        HEADER  EXIT,4,'EXIT',DOCODE
        MOV @RSP+,IP    ; 2 pop old IP from return stack
        NEXT            ; 4

Здесь
EXECUTE парсит шитый код, вызывая или ассебмлерный примитив, или следующее слово.
NEXT — (макрос для ассемблера) собственно сам интерпретатор
EXIT — выход из обработки текущего слова.

Остальной ассемблерный код — это минимльная библиотека слов, необходимых для работы слов. Все остальные слова базируются на этом фундаменте.

PS. В статье при описании как это работает (см. Упражнение 1) понятие «интерпретатор» надо понимать как коммандный процессор. Который принимает символы из буфера и передает их на исполнение. В словаре forth это слова INTERPRET и EXECUTE.
0
без IDE и без компилятора?
и даже без компьютера :)? Поиграться — можно, но без посветки и проверки синтаксиса — трудно.
была отличная тренировка для мозгов
вот-вот… Для скриптования простейших алгоритмов — пойдет, для чего-то посложнее получается write-only код.
+1
Угу, ведь в наше время гораздо практичнее таскать с собой ланчпад, взамен флешки с установленным на неё ПО :)
0
Спасибо. Продолжайте пожалуйста, это интересно =)
0
… для тех кому не терпится побольше узнать о форте:
Forth Interactive Development Environment
Getting starting
поддерживаемые процы и киты на продажу
книги по форту
+1
— Forth Interactive Development Environment
Вот это действительно вещь. В свое время тоже пытался колупаться, но остановило отсутствие типового железа, а колупать под свое не хватило времени/желания/сноровки итд.
Попробовал запустить с ланчпадом.
Перетащил kernel.f и debug.f в окошко IDE и — о чудо! — светодиодик на плате заморгал «SOS»
0
: 2blink red blink green blink;
ошибочка у вас, на стек задержку моргания не положили
0
Сразу видно, кто внимательно читал :)
Спасибо. Часть в дороге на планшетке набивал, что-то мог упустить.
Сейчас поправлю.
0
Поправил и сохранил в черновики, вот чудак…
0
Добавил своеобразный бенчмарк (см. упражнение 3)
Оценка скорости исполнения кода
0
Если сумею дома к убунте подцепить, может ещё чего придумаю.
0
А для STM32 Discovery готовой реализации Форта не существует, случайно?
0
гуглил вчера, в готовом виде не нашёл
0
Так, как STM32 это ARM архитектура, то можно приспособить один из подходящих проектов
для других ARM контроллеров.
Ссылки можете посмотреть на рускоязычном форуме Форт программистов.
0
Существуют встраиваемые версии, написанные на си. Соответственно, их можно встроить на любую платформу.
Конечно, скорость ещё более замедлится, но зато можно встроить как одну из задач RTOS или как прерывание от технологического UART-а, в целях отладки.
0
Существуют встраиваемые версии, написанные на си.
Истинный интерпретатор Форта писался раньше обычно на самом Форте. (кроме самых элементарных действий со стеком, реализованных на асме).

Соответственно, их можно встроить на любую платформу.
Фиг там. Попробуйте сделать для PIC…
Форт изначально базируется на стековых операциях. Основной набор базовых действий низкого уровня — положить на стек, снять со стека, поменять местами два верхних значения на стеке.
У большинства же PIC стековые операции вообще отсутствуют (кроме аппаратно реализованного сохранения адреса возврата из подпрограмм).

Можно, конечно, исхитриться и реализовать софтовый эквивалент стека на PICе, но зачем?

И вообще Форт создавался во времена, когда каждый байт был на счету, поскольку при длине равноценного по функцианальности кода, при длине ассемблерного более 2 килобайт, программы на Форте могли даже иметь меньшую длину. Ради этого и терпели его выкрутасы. Но и то мало кто…

Хотя, например, программа управления глубоководного аппарата, с помощью которого нашли Титаник, была написана на Форте. Правда, про другие значительные случаи его использования я не слышал. Да и обследовали по-настоящему Титаник потом уже наши глубоководные аппараты с людьми на борту, но безо всякого Форта…

Я пробовал Форт еще в 80х годах. Два варианта — для «Микро-80» и для «Корвета».
Не впечатлил… Уж лучше на ассемблере. По крайней мере, асм мозги наизнанку не выворачивает.

Даже несмотря на то, что на программируемых калькуляторах Б3-21 и Б3-34, где использовалась «обратная польская нотация», чем — то напоминающая Форт (тоже сначала вводились значения, потом — действия над ними), я работал без проблем…
0
Фиг там. Попробуйте сделать для PIC…
Как ни странно, для пиков как раз ьольше всего понаписано :)
Для AVR тоже много реализаций.
0
Фиг там. Попробуйте сделать для PIC…

но вот на PIC18 с расширеренным набором комманд
FORTH — ОЧЕНЬ просто организавать!!!
0
Ради интереса попробовал.
В упражнении 2, код для blink заработал после того, как я поставил пробел после R (и убрал лишний перед mask)
ok r> ( mask port time, R -- )
И странно, но на ключевое слово s? (и на S?) ругается сообщением S?? (KEY? работает)
0
В этой строке между скобками находится комментарий, его в принципе можно вообще не вводить, и уж точно от него ничего не должно зависеть. Слово s? на самом деле должно было быть s2?
Я сначала написал правильно, а потом посмотрел в описании и переправил на неправильное. Надо переправить обратно.
0
Хотя нет, сейчас проверил — все правильно, s? опрашивает кнопку S2 и выставляет на стеке флаг.
> s?.
0 ok
>
0
С S2? работает, а вот на s? выдает:
s? until ; S??
Главное, что и здесь написано "s?"
0
У меня тоже, только S2? работает.
0
Копирую прямо из окна терминала:
> s2?
s2??
> s?
ok
>
Надо будет разобраться…
0
Вот из моего терминала:
s? S??

s2? ok
0
Возможно, разные версии.
Я сначала заливал простую, а потом se.

Ну и говорю — надо будет разобраться.
0
Да, работает и без пробела… Чет я напутал. Видимо, перед этим я не погасил светодиоды :]
0
Разобрался с S? и S2?
Это разные версии. Одна — просто 4e4th.a43, другая — se.
Чем ещё отличаются, пока не знаю.
0
Не стал мучиться с поиском других реализаций форта, а просто заказал launchpad, пару штук…
Хотел узнать, я пользуюсь Terminal v1.9b, там можно файлы засылать. Можно как-то примеры вводить не построчно, а сразу файлом засылать? Я пробую сам, но фигня какая-то выходит.
0
На сайте проекта в вики есть примеры загрузочных скриптов для win и lin, сам собирался попробовать.
Там есть некоторый нюанс, после ввода слова надо немного подождать — ведь оно должно скомпилироваться и записаться в флешь.
0
Требуется написать и разместить в памяти контроллера программу, выполняющую какие-либо полезные действия.
С помощью циркуля и линейки, то есть консоли и терминала.
Страшно?!
Конечно, страшно!
Порнография же, да еще и в особо извращенной форме.

Стоит только выключить Лончпад, как он всё забывает. Снова к плате нужно подключать компьютер.
Вдумайтесь — что мы делаем и для чего!

Ах, да! Можно еще сказать, что мы хотим поупражняться с регистрами периферийных устройств, освоить их работу. И не просто так поиграться, а при этом не истратить ни одного цикла стирания/записи флеш-памяти.

Ну еще можно сослаться на чисто академический интерес к особым методам программирования типа обратной польской записи. Да и принцип Jast for Fun никто не отменял. Ну может быть я чего-то еще упустил. Добавляйте!

Однако! Давайте опустимся с небес на землю и посмотрим, может быть мы делаем что-то не то? Не знаю, как у вас, но у меня подсознание подает сигналы, что тут что-то не так. Что тут какая-то засада, развод. Что серьезно заниматься лучше не этим, а другими технологиями. А на это следует навесить ярлык «Забавно и бесполезно».

Однако, давайте вернемся к авторской публикации. Допустим, мы не знаем, как работают некоторые периферийные устройства нового для нас процессора MSP430. Например, хотелось бы поближе познакомится с портами. — ОК!

Выполняем задачу классическим способом. Запускаем mspdebug и всё! Если мы «начинающие», то вместо заучивания Фортовских инструкций, мы запоминаем команды mspdebug.

Знания команд отладчика — это наш «золотой фонд знаний». Думаю, не надо объяснять, почему нужно изучать классические инструменты и изучать сам объект (MSP430), к которому они применяются, а не отвлекаться на неключевые технологии. Это особенно критично, когда вы только-только начали осваивать программирование.

Четкое понимание что есть «цель» и что есть «шум» позволяет решать задачи максимально эффективно, не блуждая огородами.

Так вот, mspdebug — это классический инструмент. Он позволяет записывать/считывать регистры непосредственно. Вы ничего не потеряете, если вы с помощью mspdebug, а не Форт-прокладки, будете записывать в регистры периферийных устройств значения. Вы точно так же сможете включать/выключать светодиоды. При этом, ваша задача «освоить работу регистров периферийного устройства» будет решена!

К тому же, вы еще и получаете бонус! Бонус состоит в том, что вы познакомитесь непосредственно с регистрами периферийного устройства (и назначением его битов), а не с высокоуровневой абстракцией. Знание регистров — это ваш «золотой фонд», а высокоуровневое абстрагирование от железа — это отвлекающий от «цели» маневр. Вы совершите круг по полям и придете в ту же точку, что нужно знать регистры и их биты.

Абстрагирование нужно использовать там, где оно действительно необходимо. А у нас что получилось? — С помощью Форта мы абстрагировались от битов и регистров, перешли на уровень вверх, и теперь не взирая на комичность ситуации снова опускаемся на уровень железа. Ничего не скажешь! Фейерично!

Вы можете возразить, что, вот-де, программа на Форте выполняется автоматически и тем самым позволяет автоматически моргать светодиодами в цикле, а зажигание/гашение светодиодов с помощью команд, которые набираются на клавиатуре терминала, — это не то! Да, согласен.

Но давайте прикинем, а что (какие знания или опыт) дает нам это автоматическое включение/выключение светодиодов? Если мы можем (то есть уже научились это делать!) зажечь светодиод, если мы можем погасить светодиод, то в чем состоит прикол выполнять эти действия в цикле? Только не говорите, что «изучаем работу циклов». Это смешно!

Хорошо! Представим, что нам нужно узнать (или наоборот — задать заранее) скорость переключения светодиодов. Понятно, что быстрое переключение светодиодов «руками» из дебаггера не исполнить! Но мы с таким же успехом можем написать короткую программу. Более того, мы можем даже разместить ее в ОЗУ, дабы не тратить циклы стирания/записи флеша.

К стати, знаете, сколько стоит каждый цикл стирания/записи? Давайте посчитаем примерно:

100 рублей за МК
— = 1 копейка
10000 циклов

А если мы за вечер сотрем/запишем проц 200 раз, то получается, что мы выкинем на ветер аж целых 2 рубля!

Мне кажется, что изучать MSP430 с помощью Форта — это чистой воды разврат и порнография! И наоборот: изучать Форт на примерах моргания светодиодами — то же самое, только с боку!

Уважаемый MrYuran! Пожалуйста, пишите о таких применениях Форта, где бы он давал фору другим языкам программирования или другим технологиям управления МК.

На сколько я понимаю, если человек далек от программирования на С/С++ (и других языках), то он (человек) так же далек и от программирования на Форте. (Если, вообще, на Форте будет еще не дальше!) А если человек уже владеет С/С++, то возникает законный вопрос — а зачем ему извращаться на Форте, если он ту же задачу уже способен максимально эффективно решить на С/С++?

По моим представлениям, Форт имеет место в жизни только ради академического интереса, или только ради Just for Fun, или только в патологическом случае — «программист» ничего другого не знает.

Срочно нужны реальные примеры применения Форта. Причем такие, где было бы четко видно, что — да, ничего другого, кроме как Форт, сюда не подойдет.

А Форт (сжирающий 8 кило фарша) для моргания светиками — на практике и в коммерческих продуктах — не нужен!
0
При отправке сообщения у текста сломалось форматировние, а средств редактирования своих сообщений — нет.

100 рублей за МК
— = 1 копейка
10000 циклов
Я хотел сказать следующее:

Цена_МК / Количество_циклов = 100 рублей / 10000 = 1 копейка
0
При отправке сообщения у текста сломалось форматировние
Для этого есть тег code. При этом, во первых, движок не жрет отступы, а во вторых — показывает моноширинным шрифтом.
Получается:
100 рублей за МК
---------------- = 1 копейка
  10000 циклов
0
Спасибо.
Заметил теги уже после того, как всё сломалось.
А осознал, что могу воспользоваться тегом code, после вашего поста.
0
Примерно такой же эмоциональной тирадой разразился один мой коллега, когда я ему расписал преимущества линукса на домашнем компьютере, а он, устанавливая мандриву, случайно разровнял два терабайта торрентовых раздач.
Понятно, что я не мог в одной статье охватить все аспекты. Целью вводных слов было привлечь внимание и подготовить читателей к серьёзному материалу. Тем более что на его написание требуется на порядок больше времени и сил, чем на общие слова.
Второе — это то, что я сам по ходу действия тоже продолжаю изучать тему, и чем дальше, тем больше мне нравится этот стройный механизм, в который каждый может внести что-то свое (в отличие от того же GCC, где порог вхождения на порядки выше)
0
В конце концов, для меня уже отрадно, что тема вызывает интерес. Намного хуже было бы безразличие.
Форт интересно изучать даже в чисто академических целях, для общего развития, а практическое применение можно найти всегда.
И до этого (уверен) тоже дойдет.
0
Ну вот, уже кое что — «академический аспект».

Да, Форт — сейчас это модно. И если у человека есть вагон времени, то почему бы и нет?
0
А жаль!

Вы увидели только эмоции, а я прошу привести конкретные примеры применения Форта. И это подчеркиваю особо — нужны такие примеры, чтобы стало понятно, что в этой ситуации только с помощью Форта можно разрулить проблему. Другие технологии либо не применимы, либо будут проигрывать Форту по ряду показателей.

Хорошо! Давайте приведу пару примеров, чего я жду от Вас (или от других Форт-евагелистов), чтобы Вас стало легче понять, что мне надо.

Сегодня ко мне придут на занятия студенты. Предполагается, что мы будем изучать MSP430. Если я сразу начну втирать регистры, команды, способы адресации — я отобью у них всякое желание продвигаться дальше. Нет мега-проблемы, значит нет потребности в изучении МК.

Поэтому я на выбор предлажу им «идти» в сторону создания:
1. «махательных» часов (часы, которые показывают время, когда ими совершаешь колебательные движения. По другому — механическая развертка. 8 светодиодов в столбик, включаются только тогда, когда проц зафиксирует ускорение.)
2. Игра в «крестики-нолики» (9 двухцветных светодиодов, под ними 9 кнопок.)
3. Тупой генератор «всяко» бегающих огней. Скоро НГ, людям понадобится оживить свои елки.

Мне, конечно, тоже будет не легко убедить их в том, почему мы берем MSP430, а не AVR или STM32. Но тут мне помогут глубокие знания этих архитектур, и я уверен, что для своих студентов я смогу найти аргументы в пользу MSP430. А вот если бы мне пришлось убеждать таких же спецов, как я, то процессор мог бы оказаться практически любым из указанных. При отличном знании этих архитектур к проблеме выборы будут подключены такие аспекты, как наличие микросхем под рукой (дабы не бегать в магазин), важность задачи (или насколько полученное устройство будет нужно людям), наличие уже собранного тулчейна на компе, и т.д.

Ведь, если брать энерго-потребление, то это лет пять назад не было равных MSP430. Сейчас это не показатель. Поэтому вот так просто заявлять, что на MSP430 схема будет потреблять меньше, — наивно. Нужно собирать и проверять. Факторов, влияющих на итоговое энергопотребление целого устройства, очень много.

Вы понимаете, о чем я говорю?

И если у студента, мозги еще забиты плотно ни одной архитектурой, то ему все равно, какое ядро изучать. А если это будет не студент, а профи, который, допустим, знает ядро Кортекс или AVR и не знает MSP430, то убедить его в применения MSP430 для реализации мохательных часов или «тик-так-туу» будет практически невозможно.

Мой аргумент «энергопотребление» разобьется об технологию PicoPower в AVR-е и использование Zero Gecko EFM32 вместо STM32. И этот гипотетический инженер будет прав — нахрена изучать езе одно ядро, когда те же самые задачи можно решить точно так же эффективно на тех технологиях, которые уже знаешь!

Еще раз. Люди (ну и я в том числе) ждут озвучку набора проблем, которые побеждаются наиболее эффективно при использовании Форта, а не других технологий.

У меня есть убеждение, что ниша применения Форта очень узкая по жизни вообще, а в области МК — так и вообще бесперспективняк! Я реально не нахожу оправданий использования Форта на МК. Ну разве что только поприкалываться или чисто академический интерес исследования. А так — я бы не стал закладывать рискованные технологии в свои изделия.

Чтобы меня увлечь, обмануть наконец, мне нужен очень веский аргумент преимущества Форта в МК на фоне других традиционных технологий.

Относительно Линуха и Венды. Да, сложно убедить людей, которые всю жизнь крякали софт и при этом не испытывали каких-либо страданий (моральных, штрафы и т.д.), что Венда — это плохо. Но ведь, нашлись же аргументы и у меня тоже, перевести кучу людей на Линух. Значит, далеко неравнозначны и существенно отличаются Виндовс и Линукс.

Но на данный момент, я, простите, в упор не вижу преимуществ использования Форта в МК!

То, что Вы описываете, это как «потрогать только хвост слона» и ответственно утверждать — какой он, слон. Но я вот, гад такой, успел потрогать «только ногу слона». И что мы сейчас будем делать с нашими знаниями? А за нами стоит еще куча слепых мудрецов…
0
Лично я помню как на компах типа специалист, радио РК и так далее использовался асемблер который был написан как форт ядро с самой програмой и занимало оно что-то около 2 Кб!!! Это был полный асемблер!!! Попробуйте написать чтото такого на асемблере… Форт хорош именно тем что компактный код и без проблем его можно перенести на другую железку. Ведь Java и Flash — это тоже в общем смысле — генераторы байткода. Там точно так же используется стек и обратная запись… Так же никто вам не мешает написать и использовать например генератор форт байткода но из С нпример… Или из бейсика :) Сам байткод занимает мало места…
0
со времен строго доброго РК86 мир изменился. Ну нельзя применять к современному миру (изобилующему всяким компами, нотиками, кросс-компиляторами, интерфейсами связи и прочей staff) подходы 30-летней давности в решении современных задач.

Ностальжи — это хорошо, но практической пользы мало.

Я вам говорю — нужны примеры использования Форта в современном мире, а вы ссылаетесь на его старинные ордена. Война с тотальной «безкомпьютерностью» и отсутствием инструментов уже давно давно закончилась. Ау! С добрым утром!
0
Так это, а как же программирование с планшета или телефона? :)
0
Вы это серьезно? — Программирование с телефона?

Я понимаю — задание там каких-то уставок для оборудования. Ну приспичило где-нибудь по дороге, в пробеке, в метро. Ну сил нет, нужно перепрограммировать. Но программировать — в смысле писать программу — … ну я не знаю!

Вот как раз это я и называю извратом. Извратом с моей точки зрения. Но это ни о чем не говорит, так как мир не черно белый. Мир — цветной. И нормой в мире считается такое положение, когда ты соответствуешь математическому ожиданию (М).
0
Ещё к асемблеру — там только список всех команд занимал больше места чем 2Кб :)
0
И как эти 2 килобайта соотносится с тем количеством памяти, которое наличествует в Вашем компе?

Два кила — это невидимая пылинка для современных компов. И теперь Вы в эти два кила (которые в МК) переносите часть компьютерного функционала. Вы не находите, что это немного странно? (Мало того, Вы еще гордитесь этим достижением.)
0
Ну, такие вещи тащить в МК есть смысл только для скриптования. Плюс форта как движка скриптования — простота и скромные требования интерпретатора.
0
А как часто этот интерпретатор скриптов нужен на мелких контроллерах?
0
Не часто, но бывает нужен.
0
Речь идёт не о том чтобы засрать всю свободную память которая есть в наличии… Нужно относиться к этому так что оно там работает довольно быстро и занимает мало места!!! Скажите мне зачем многие современные процесоры имеют подержку исполнения байткода?? Ну и если мало скорости — используйте специализированые форт процесоры — которых полно как чипов так и как ядер в ПЛИС… У форта после изменения разрядности данных ненадо менять програму. Просто берёш процесор пошире и едет дальше как положено. Ну и опять повторяю — верите другой компилятор того на что Вы привыкли и чтобы на выходе был байткод!!! И опять всё будет работать :) Ладно… Больше небуду. А то будет на долго. А у меня нет времени. Я работать должен.
0
Мне как-то пофиг на то «что оно там работает довольно быстро и занимает мало места!!!», если мне эта функциональность не требуется. Да пусть хоть мгновенно исполняет, но оно мне это не надо.

>> Скажите мне зачем многие современные процесоры имеют подержку исполнения байткода?

А вы сам как на этот вопрос отвечаете?
0
Так вот, mspdebug — это классический инструмент. Он позволяет записывать/считывать регистры непосредственно. Вы ничего не потеряете, если вы с помощью mspdebug, а не Форт-прокладки, будете записывать в регистры периферийных устройств значения. Вы точно так же сможете включать/выключать светодиоды. При этом, ваша задача «освоить работу регистров периферийного устройства» будет решена!
Не буду спорить. Скажу только, что, к примеру, в серийных изделиях JTAG (и его аналоги типа Spy-by-wire), как правило, лочатся. Что предложите на этот случай?
Я на данный момент делаю так: первым делом «натягиваю» модбас, регистры которого маплю на необходимые переменные и периферию. Затем в процессе отладки набдюдаю за нужными данными. Отладчики не использую принципиально, т.к. «в поле» мне от них никакого толку не будет. Оверхед — ничуть не меньше, чем «8 кило форша».
0
Вот жешь, блин! Я уж подумал, ну всё, типа завязали…
— Значит так, Златая рыбка. Ящик водки и всех обратно! (с) из анекдота

Я ничего предлагать не буду. Я старый еврей (шутка!). На Ваш вопрос я задам встречный:
Укажите, на какой круг задач рассчитан Форт. А также опишите тип пользователя, который будет применять (то есть писать на нем проги) Форт-в-микрконтроллере.

Про JTAG: я не понял, а зачем на серийной — те есть уже отлаженной продукции — предоставлять пользователям возможность для экспериментов с регистрами периферийных устройств?

У каждого программиста-разработчика свои методы отладки кода/железа.
Да и задачи у всех разработчиков разные.
0
Укажите, на какой круг задач рассчитан Форт. А также опишите тип пользователя, который будет применять (то есть писать на нем проги) Форт-в-микрконтроллере.
Да на любой.
От мигания светодиодами до диспетчера RTOS (при этом сами задачи вполне могут быть на привычном си)
Если речь идет именно о полностью встроенной версии, как у нас в теме, то могу однозначно рекомендовать на любой запрос типа «а какой бы мне скриптовой движок в мелкоконтроллер засунуть».
Неважно, кому и зачем это надо. Но надо, и часто. И есть вещи намного проще, легче и быстрее, чем java, lua или python.
Пользователь — от непосредственного разработчика до дяди Васи у станка ЧПУ, который вводит с панели «150 230 drill»
0
Дядя Вася у станка, вот уж действительно, положит большой «болт» на рассуждения об инфиксе и постфиксе, и тем более префиксе.
При переходе в BIN систему счисления азы булевой алгебры можно достаточно просто продемонстрировать
0
Хотите простейшее применение? Калькулятор!
Преобразователь систем счисления, физических и денежных единиц, чего угодно.

1234 hex . 4D2 ok
hex C000 decimal .u  49152 ok
146 bin . 10010010 ok
110001010011 decimal . 3155 ok

Самое интересное, что forth может вывести (и ввести) число в любой системе счисления, например, в 25-ричной :)
2345 25 base ! . 3IK ok


/ Да шучу я :) /

Каждый сам выбирает себе инструмент. Кому топор удобнее, кому хускварна и бошь…
0
Дано:
непонятная красненькая плата со штырьками PLS-ок, USB шнурок и… собственно, всё.
Никаких ардуин на компе, никаких иаров, композеров, и даже MspGCC вне досягаемости.
Признаться, после такого вступления я не ожидал увидеть «идем в инет и качаем MSPDEBUG и 4E4th». Этак можно и тот же MSP-GCC скачать.
0
  • avatar
  • Vga
  • 10 ноября 2012, 15:43
Если бы TI прошивал при производстве или отправке платы предварительно Форт системой, то и прошивальшик бы не потребовался. (но может, по примеру AVR есть проект автономного прошивальшика-терминала?)
0
Оба-на, да это же отличная идея! И незанятая ниша.
А что купил 3-5-10 тысяч микросхем, залил код, продал. На вырученные деньги купил еще больше…

Однако, почему-то ее никто не стремиться занять эту нишу. Интересно, почему?

(У меня тоже есть на этот счет свои соображения.)
0
Например, есть контора mosaic-industries.com которая продаёт для покупателей
полуфабрикаты приборов для программирования по месту самим пользователем.
В приборах Firmware Форт система, а у пользователя есть возможность писать логику
своего приложения на Форте или Си в кросс-среде, но это уже не российские реалии.
0
Ну да, черный пеар, надо ж было как-то народ завлечь.
Тем более писал на живую, под впечатлением первых опытов.
Но смотрите шире.
8 кБ — это полноценная и самодостаточная система, причем содержащая множество излишеств, включая даже определения некоторой периферии.
В репозитории лежит файл was4.f — это компактный ассемблер, заливаемый прямо в контроллер. И сегодня обнаружил у немцев на сайте дизассемблер.
Но все это опять не про то.
Имея очень компактный движок, можно сделать практически все что угодно. Введенные слова компилируются на лету и затем исполняются очень быстро, при этом занимая совсем немного места.
Может, надо было начинать сразу с практического применения, но тогда, я думаю, мало бы кто чего понял. Тем более что я и сам до этого не дошел, но расту по ходу действия.

В очередной раз прошу — дайте время и «усе будет».
Тем более что купленный ланчпад я планирую поставить на хоббикинговскую тележку, которую ушлые китайцы пока в виду не имеют отсылать, и вот там будет реальное применение и боевой тест. Пока все только игрушки.
0
Спасибо автору за цикл статей.
В инете много восторженной информации о преимуществах языка Форт и стековых процессорах. Вот к сожалению в реалии все как то кисло, специализированных процессоров раз два и обчелся, они либо редки либо дороги и не понятно как обстоят дела со средствами разработки.

… применение стековых процессоров становится наиболее целесообразно для
небольших встроенных применений, так как позволяет получить поддержку языка высокого уровня и упростить отладку системы. Однако применение Форт-процессоров будет, как и на предыдущих этапах, тормозиться отсутствием квалифицированных программистов, с одной стороны, а с другой стороны — отсутствием свободно распростра-няемого программного обеспечения для встроенных систем.
0
Да пожалуйста!
Для меня куда большим спасибом было бы конструктивное обсуждение. Я ведь тоже учусь, с одной стороны. А с другой, хочется, чтобы время и труды не пропали зря. А для этого должен быть практический выхлоп. А для этого надо изучить поглубже. А для этого — чтобы не пропадал интерес. Ну и так далее по кругу.
0
Я ведь тоже учусь, с одной стороны. А с другой, хочется, чтобы время и труды не пропали зря. А для этого должен быть практический выхлоп. А для этого надо изучить поглубже. А для этого — чтобы не пропадал интерес. Ну и так далее по кругу.
Тут главное — вовремя остановиться, и начать что-то делать.

А то можно всю жизнь только учиться, учиться, и учиться… Да так ничего и не сделать.

Интересного в мире — много, каждый день появляется еще и еще. И все хочется изучить, попробовать… За всем — не угнаться, жизни не хватит.

Самое сложное для молодых — определить, что им действительно нужно, а что — так никогда и не понадобится.
Или — что проще то же самое сделать на уже изученном, чем терять время на освоение другого.
Это приходит только с годами и опытом, и то не ко всем…
0
А то можно всю жизнь только учиться, учиться, и учиться… Да так ничего и не сделать.
А если все время только делать и делать, не оставляя времени на обучение, то очень быстро окажешься на обочине прогресса.
С другой стороны, что изучать? Можно т.н. технологии, то есть конкретные методики применения конкретных инструментов.
А мне всегда интереснее разобраться, как это все устроено. Скучно чувствовать себя просто винтиком в чьей-то технологической цепочке.
0
Раз не получается работать руками, выхода два — либо учить, либо руководить :)
0
А если все время только делать и делать, не оставляя времени на обучение, то очень быстро окажешься на обочине прогресса.
Зато — с кучей интересных и полезных вещей.

А если только учить — все равно всего не выучишь, а без видимого результата — и интерес к обучению быстро пропадет.

И останется только совершенно ненужное и неиспользованное знание, которое тоже быстро устареет…
Да и не одиночки на кухне прогресс двигают, как бы хорошо они не освоили на коленке запайку ARM на плату, и даже — металлизацию…

Прогресс двигают крупные компании. А там, как правило, — очень узкие специалисты. У которых — просто нет времени осваивать и учить все подряд. Давно уже настало время узкой специализации.

Что же касается хобби — для него важна не новизна и крутизна, а удовольствие от самого процесса. Которое намного больше, если виден и результат.

Лучше иметь кучу сделанных простеньких устройств, которые не стыдно и другим показать, чем голые знания непонятно о чем. Которые и приткнуть — то некуда…
0
Всё же есть и средний вариант — компании некрупные, работающие в узких областях, на корпоративный в основном рынок. И там частенько востребованы «многостаночники». Порой, однако, доходит до абсурда — одним человеком норовят заменить целое КБ.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.