In the last episode, I advocated a little bit for Forth on microcontrollers being a still-viable development platform, not just for industry where it’s normally seen these days, but also for hackers. I maybe even tricked you into getting a couple pieces of cheap hardware. this time around, we’re going to get the Forth system set up on that hardware, and run the compulsory “hello world” and LED blinky. but then we’ll also take a dip into one of the features that make Forth very neat on microcontrollers: easy multitasking.
Работать!
Аппаратное обеспечение
Mecrisp-Stellaris Forth runs on a great number of ARM microcontrollers, but I’ll focus here on the STM32F103 chips that are available for exceptionally little money in the form of a generic copy of the Maple Mini, often called a “STM32F103 minimum System Board” or “Blue Pill” because of the form-factor, and the fact that there used to be red ones for sale. The microcontroller on board can run at 72 MHz, has 20 kB of RAM and either 64 or 128 kB of flash. It has plenty of pins, the digital-only ones are 5 V tolerant, and it has all the normal microcontroller peripherals. It’s not the most power-efficient, and it doesn’t have a floating-point unit or a DAC, but it’s a rugged old design that’s available for much less money than it must be.
Programmer Connected, Power over USB
Similar wonders of mass production work for the programmer that you’ll need to initially flash the chip. any of the clones of the ST-Link v2 will work just fine. (Ironically enough, the hardware inside the programmer is nearly identical to the target.) Finally, considering that Forth runs as in interactive shell, you’re going to need a serial connection to the STM32 board. That probably indicates a USB/serial adapter.
This whole setup isn’t going to cost much a lot more than a fast food meal, and the programmer and USB/serial adapter are things that you’ll want to have in your kit anyway, if you don’t already.
You can power the board directly through the various 3.3 and GND pins scattered around the board, or through the micro USB port or the 5V pins on the target board. The latter two options pass through a 3.3 V regulator before joining up with the 3.3 pins. all of the pins are interconnected, so it’s best if you only use one power supply at a time.
Firmware: The Forth System
Go get the super-special Hackaday-edition Mecrisp Forth package from GitHub. included in the “ROMs” directory is a Forth system that’ll work for the demos here. I’ve loaded in a respectable base from [jcw]’s exceptional Embello Forth libraries as well, supplying things like easy GPIO configuration, delay functions, and so on. There are lots of a lot more libraries available, and we’ll look into them next time when we need them.
The coolest thing about using a Forth system is that very little support software is needed in any way — the Forth interpreter compiles its own code, and you interact with it over the serial terminal. everything happens inside the microcontroller. The one hurdle, then, is getting Forth onto the chip. In the old days, this used to be done by toggling in the bytes manually, and Forth is actually small enough that literally bootstrapping it this way is possible. but you already gotten that chip programmer, right?
[Texane]’s ST utilities are the easiest way to get Forth onto your chip. download them from GitHub, and build it yourself or try your luck with your distro’s package manager. (Windows folks, you’re not left out either. Although that binary hasn’t seen updates in a while, it’ll do.)
Connect up the programming wires in the evident fashion, and issue the magic commands st-flash erase and st-flash write mecrisp-stellaris-hackaday-edition.bin 0x8000000. In five seconds, you’ll be ready to rumble.
GND — GND
SWCLK — CLK
SWSIO — DIO
Having to get a programmer is a hassle if you don’t have one, but it will make the rest of your life easier, and getting one is as basic as clicking “pay” and waiting. Our own [Al Williams] (no relation) has a recent post on using the same software for debugging C or Arduino code with GDB, so it’s worth your time to set this up.
Программное обеспечение
Serial Hookup, Powered by Laptop
Put the programmer away for now and connect to the STM32 over serial; the default baud rate must be 115,200. If you haven’t unplugged power yet, you might need to hit the reset button on the STM32 board. If all went well, you’ll be greeted by a familiar skull-and-cross-wrenches. Mecrisp is expecting a linefeed at the end of lines, so if you’re sending LF+CR, you’ll be successfully hitting return twice.
A9 TX — Serial RX
A10 RX — Serial TX
GND — GND
[jcw]’s folie is a nice, multi-platform serial terminal emulator for this application. What it does that your normal terminal program doesn’t is allow you to re-enter a command line with the up-arrow, which makes taking care of mistakes much, much much easier than re-typing a long command. Это такжеАвтоматически включает в себя другие файлы, которые я сделал значительное использование в построении двоичного для этой статьи. Вам не нужно бегать FOLIE, но держу пари, вы будете понравиться.
Привет мир
Теперь это «Hello World». Если вы новобрачно, здесь приходит очень избирательное введение. Тип 2 2 + и нажмите Enter. Он говорит ОК .. Это обнадеживает, верно? Теперь введите. (прочитайте «точку»), и он распечатает неудивительный результат. Точка – это первая из нескольких глобальных складок, которые вы захотите усваивать. Многие команды с точкой сразу распечатают их результаты. .S (dot-ess) распечатывает содержимое стека. Два большие идиомы, которые мы увидим много @ для получения переменной или чтения ввода и! Для установки переменной или вывода. Прочитайте их как «Get» и «Установить» в голове при сканировании кода.
Далее давайте посмотрим, как написать функцию. : начинает определение функции и; заканчивает это. Итак: четыре 2 2 +; Определяет функцию, которая добавляет два и два вместе. (И собрал его в режиме реального времени!) Вы можете затем обернуться и вызывать эту функцию немедленно. Четверо .s покажет вам, что наша функция покинула сумму двух и двух на стеке. В этом смысле функции в далее не на самом деле не функционируют. Они не принимают явные аргументы или возвращают явные значения. Они просто работают на любых данных на стеке, и оставьте результаты тоже. Вот почему Функции называются «словами». Я сейчас буду придерживаться этой конвенции.
Здесь, наконец, это «Hello World» :: hw. “Привет, мир!” CR; «Строки немного странно в прямом эфире, главным образом из-за того, как язык анализируется – компилятор читает до пространства, а затем выполняет то, что он нашел, так что должно быть пространство между печатной строкой Команда (. “) И первый персонаж, который вы хотите распечатать. Команда печати сканирует вперед, пока он не найдет закрытие «, хотя, чтобы вам не нужны дополнительное место. CR отправляет возврат каретки. Введите HW в подсказке. Привет, мир!
Мигающие светодиоды
Несмотря на то, что вход и вывод последовательного текста настолько прост, мигающий светодиодом – это стандартный «Hello World» микроконтроллеров, поэтому пришло время для некоторых GPIO. Поскольку система уже сконфигурирована для этой конкретной доски микроконтроллеров, поворачивая светодиод. Хотите выключить это? LED.OFF. Ручная мигание станет старой довольно быстро, хотя, так что давайте напишем мигание слова. : Blink Led.on 100 мс LED.OFF 200 мс; сделаю трюк. Попробуйте мигать мигать мигать. См. Мой Minink Demo Code для разработки. (Больше на MS в нескольких тысячах миллисекунд.)
Детали инициализации GPIO спрятаны в Core / Hackaday / LED.FS и в STM32F1 / IO.FFS Embello. Продвигаясь, вы увидите стандартную процедуру инициализации: конкретный PIN-код установлен в качестве вывода, переворачивая некоторые биты в регионах периферийных управления STM32. [JCW] определил кучу из них, делая установку PIN-либо вывода, с помощью драйвера Push-Thing, так же просто как PC13 Omode-PP IO-Mode!. (Помните «!» Указывает на установку значения в переменной или регистре.)
Чтобы настроить PIN PA7 для входа ADC: PA7 IMODE-ADC IO-MODE!. Кнопки тестирования, использующие встроенные потягивающие или раскрывающиеся резисторы: PA3 Imode-Pull IO-Mode! А затем установите вывод, чтобы вытащить или вниз, используя True PA3 IO! или PA3 iOS!. Затем вы сможете прочитать состояние кнопки с PA3 IO @ («IO GET») позже.
GPIO на чипах STM32 очень гибкий, и если вы хотите глубоко впустить параметры конфигурации в таблице данных, вы можете установить все это справедливо, используя код [JCW] IO.FS. Например, IO.All печатает все регистры GPIO и их значения, что является отличной помощью для интерактивной отладки. Тем не менее, здесь есть какая-то комната для намного более удобного удобного аппаратно-абстракционного уровня, если вы хотите внести свой вклад.
Многозадачность на быстром
Итак, теперь у нас есть мигающий светодиодный и последовательный порт печати «Hello World». Не плохое начало, и оба из них хорошо используют интерактивность вперед: светодиод загорается только при наведении мигания. Для меня один из главных достоинств в честь, является легкость продвижения между интерактивным тестированием слов, как это, а затем развертывание функциональности в рабочей системе. Одна из причин заключается в том, что почти все сдачи поддерживают базовую совместительную многозадачность. Вот что я имею в виду.
Во-первых, давайте свяжитесь с нашей функцией Blink, чтобы нам не приходилось так много печатать. : BB снова начинают мигать; Создает функцию, BB для «плохого мигания», которая будет работать навсегда. Проблема с «запущенным навсегда» в далее входит в далее, вы никогда не возвращаетесь к командной строке интерпретатора без физически нажимающего кнопки сброса, а затем все, что вы работали в RAM, потеряны.
Вместо этого давайте мигаем в петле с выходом. : GB Begin Blink Key? до ; Создает функцию, которая запускает нашу команду Blink, пока не будет никаких входных данных с клавиатуры – нажата решающее значение. Эта конкретная циклическая конструкция очень полезна для тестирования функций, которые вы хотели бы постоянно работать, без подвешивания системы. Держите это яНум.
Как только мы настроим нашу функцию Blink, чтобы запустить только так, как мы хотим, давайте создадим фоновую задачу, чтобы она могла мигать без присмотра.
Задача: Blinktask.
: мигание и
Blinktask Activate
Начните мигать снова
;
многозадачность
мгновение и
Кратко, задача: слово создает некоторое пространство памяти для нашего мигающего фоновой задачи, которую мы называем Blinktask. Функция мигает и делает работу на заднем плане. Мигание и начинается, заявив, что он будет использовать контекст задачи BlinkTask, и что он должен запустить работу. Затем он входит в безграничную мигающую петлю, из которой он никогда не уходит. Multitask включает многозадачность, и мигает и выполняет нашу задачу. Запустите его, и светодиод мигает, пока вы все равно можете взаимодействовать с консолью. Милая. Введите задачи, и вы увидите, что есть два активных: One Blinker, а другой – интерактивный интерпретатор.
Но как задача мигания знает, когда уступает другим одновременным процессам? В прямом эфирте слово пауза уступает от текущего контекста и перемещается на следующую многозадачность круглых робин. Функция MS, среди прочего, состоит из команды паузы, поэтому то, что выглядит как задержка блокировки в настройке одной задачи, в конечном итоге фантастически хорошо играет и играет на других задачах.
Великая вещь о совместном многозадачении в том, что вы точно контролируете, когда будет контекстной выключатель, который может помочь устранить глюки, которые вы найдете в упреждающих системах. Нижний вид – это то, что вы несете ответственность за запоминание, чтобы приостановить ваши функции сейчас, а затем, и вам нужно проверить время самостоятельно. Конечно, это микроконтроллер, и у вас есть довольно богатый внутренний контроллер внутреннего прерывания в руках.
Настоящая точка многозадачности на Microse Forth состоит в том, что она делает отличный рабочий процесс для письма, тестирования и развертывания маленьких демонов: функций, которые хотят быть «всегда включенным». Во-первых, напишите функцию, которая выполняет действие один раз. Во-вторых, протестируйте его в петле с экипажем люк. В-третьих, как только это работает, удалите побег и сделайте фоновую задачу для нее. Затем вы можете включить его и выключить, используя простаивание и пробуждение, даже из других задач. Смотрите MeCrisp’s Multitask.txt, источник для намного больше деталей.
Что дальше?
До сих пор мы создали Mecrisp-Stellaris, с дополнительными библиотеками из Embello Frame Frame Frame jelibs и запустите несколько быстрых демонстраций. Если это побудило ваш интерес, я возьму вас в прохождение построения некоторого реального программного обеспечения в следующий раз. Здесь много еще многое, чтобы сказать о том, как Mecrisp обрабатывает нюансы вспышки против оперативной памяти, входов и выходов и практикой интерактивной разработки. Некоторые из действительно причудливых аспектов работы в далее будут поднимать свои смешные головы, и мы научаемся любить их в любом случае.
In the meantime, get your cheap STM32F103 boards flashed up with our binary, and get a little bit used to playing around in the Forth environment on the chip. Мигать некоторыми светодиодами. look around the Mecrisp-Stellaris glossary and the embello API documentation. Or just type list to see all the command at your disposal and start hacking away.