Система forth для микроконтроллеров stm32f0xx stm32f1xx
Система forth для микроконтроллеров stm32f0xx stm32f1xx
Представляю вашему вниманию систему simple-forth-c https://sourceforge.net/projects/simpleforthc/ это реализация диалекта языка программирования forth для микроконтроллеров семейства cortex-m.
В данный момент полностью поддерживаются микроконтроллеры фирмы ST семейства stm32f0xx,stm32f1xx
Simple-forth-c доступен под лицензией MIT.
Что такое FORTH вы можете узнать по данным ссылкам https://habrahabr.ru/post/159351/,https://habrahabr.ru/post/29967/
Как собрать и установить на плату stm32f0discovery смотри вложения
Для общения с внешним миром программа использует usart1 контроллера.
В данный момент голая инсталяция системы занимает приблизительно 6,5 кбайт памяти.
В данный момент полностью поддерживаются микроконтроллеры фирмы ST семейства stm32f0xx,stm32f1xx
Simple-forth-c доступен под лицензией MIT.
Что такое FORTH вы можете узнать по данным ссылкам https://habrahabr.ru/post/159351/,https://habrahabr.ru/post/29967/
Как собрать и установить на плату stm32f0discovery смотри вложения
Для общения с внешним миром программа использует usart1 контроллера.
В данный момент голая инсталяция системы занимает приблизительно 6,5 кбайт памяти.
- Вложения
-
- simple-forth-c.zip
- система
- (61.4 КБ) 403 скачивания
-
- Установка simple-forth-c на stm32f0discovery.pdf
- Сборка и прошивка на stm32f0discovery
- (170.92 КБ) 546 скачиваний
Последний раз редактировалось fenphys Вс апр 24, 2016 20:39:49, всего редактировалось 2 раза.
- Реклама
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Для примера работы продемонстрируем как засветит светодиоды на плате stm32f0discovery
данный код необходимо ввести в программе терминала которая подключенна к порту usart1 с контроллера с установленной системой simple-forth-c,
как это сделать смотри заглавное сообщение.
данная программа создаст два новых слова LED_INIT и LEDS_ON
чтобы светодиоды зажигались при загрузке микроконтроллера необходимо создать слово BOOT с таким содержимым
данный код необходимо ввести в программе терминала которая подключенна к порту usart1 с контроллера с установленной системой simple-forth-c,
как это сделать смотри заглавное сообщение.
Код: Выделить всё
HEX # переходим в шестнадцатеричный режим
: LED_INIT
40021014 # считываем значение регистра RCC_AHBENR
80000 OR # включаем тактирование порта C
40021014 ! # записываем значения в регистр
48000800 @ 50000 OR 48000800 ! # настраиваем PC8,PC9 на выход
;
: LEDS_ON
300 4800814 ! # включаем светодиоды на пинах PC8,PC9
;
чтобы светодиоды зажигались при загрузке микроконтроллера необходимо создать слово BOOT с таким содержимым
Код: Выделить всё
: BOOT
LED_INIT
LEDS_ON
;
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Забавный язык программирования
Но боюсь что отсутствие типизации и "Основная проблема при программировании больших систем на форте - необходимость постоянно контролировать состояние стека после работы слова." - это стразу ставит крест на использовании.
И немножко овлеченного философствования.
Языки программирования они развивались от "свободы и расхлябанности" к "жесткой дисциплине и тоталитарности".
Например типизация переменных в C не дает нам возможность не совершить кучу ошибок. Как только мы попытаемся сделать подобное int a=1; char* b = a; - компилятор заругается.
Структуры и классы в С++ позволяют избавиться от еще пачки ошибок. Более того, благодаря ним програма начинает обладать свойствами "самодокументированности".
В Java и C# есть еще одно ограниячение - нельзя куда попало писать в память программы. Т.е. выделили массив на 100 элементов, при записи в 101 элемент программа упадет.
И это хорошо, потому как "один плохой программист" не сломает систему, в которой 10 Мб кода.
Но боюсь что отсутствие типизации и "Основная проблема при программировании больших систем на форте - необходимость постоянно контролировать состояние стека после работы слова." - это стразу ставит крест на использовании.
И немножко овлеченного философствования.
Языки программирования они развивались от "свободы и расхлябанности" к "жесткой дисциплине и тоталитарности".
Например типизация переменных в C не дает нам возможность не совершить кучу ошибок. Как только мы попытаемся сделать подобное int a=1; char* b = a; - компилятор заругается.
Структуры и классы в С++ позволяют избавиться от еще пачки ошибок. Более того, благодаря ним програма начинает обладать свойствами "самодокументированности".
В Java и C# есть еще одно ограниячение - нельзя куда попало писать в память программы. Т.е. выделили массив на 100 элементов, при записи в 101 элемент программа упадет.
И это хорошо, потому как "один плохой программист" не сломает систему, в которой 10 Мб кода.
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Я не соглашусь с balmer так как данная реализация FORTH не предназначенна для десктопа а только для микроконтроллеров, и я не встречал реализацию java или C# которую можна воткнуть в stm32f030f4 с 16 кбайт. флеши, а FORTH свободно встанет и еще место останется.
А по поводу философствования да в Java и C# один программист может быть и не сломает систему, но он может написать абсолютно не сопровождаемый код или дописать костыль что бы быстро добавить какойто функционал и в результате чего вся программа в конечном итоге будет состоять из костылей. Так что я считаю что на любом языке можно написать как "самодокументируемый код" так и "абсолютно не сопровождаемое поделие".
А по поводу философствования да в Java и C# один программист может быть и не сломает систему, но он может написать абсолютно не сопровождаемый код или дописать костыль что бы быстро добавить какойто функционал и в результате чего вся программа в конечном итоге будет состоять из костылей. Так что я считаю что на любом языке можно написать как "самодокументируемый код" так и "абсолютно не сопровождаемое поделие".
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
fenphys, давай ближе к FORTH.
Отсутствие типизации, когда ты ложишь какоето число в стек, а потом случайно выбираешь его другого типа. Там даже "заплатка" типизации придуманна - выделить для float отдельный стек. Большинство языков ругнулись бы на такое, и программист исправил бы. А так ищи-свищи по мегабайтам кода.
Про "необходимость постоянно контролировать состояние стека после работы" - тоже совершенна дурная работа. В C/C++ кода мы добавляем еще один аргумент в функцию - он везде поругается, где вызывалась функция с неправильным количеством аргументов. FORTH - это схавает, потом упадет когда нибудь. Это АД!
Отсутствие типизации, когда ты ложишь какоето число в стек, а потом случайно выбираешь его другого типа. Там даже "заплатка" типизации придуманна - выделить для float отдельный стек. Большинство языков ругнулись бы на такое, и программист исправил бы. А так ищи-свищи по мегабайтам кода.
Про "необходимость постоянно контролировать состояние стека после работы" - тоже совершенна дурная работа. В C/C++ кода мы добавляем еще один аргумент в функцию - он везде поругается, где вызывалась функция с неправильным количеством аргументов. FORTH - это схавает, потом упадет когда нибудь. Это АД!
- Реклама
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
balmer, по поводу ограниченного применения FORTH в больших системах ты прав, но данная конкретная реализация FORTH задумана быстрее как аналог arduino для Corex-M, чтобы можно была быстро запрограммировать простую "ногодрыгальную программу". Но в тоже время FORTH в отличие от arduino дает полный контроль над железом. То есть допустим человек захотел познакомится с stm32 он скачивает FORTH собирает ядро например для stm32f051R8 прошивает через загрузчик и получает работающую систему и он теперь может в реальном времени менять значения регистров конфигурации периферии и смотреть как система реагирует на это.
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
в 80е у меня знакомый был - большой энтузиаст писать на Forth для Z80.
утверждал тогда , что на Форте шаттлы летают
регистры налету менять это интересно.
Форт - это же польский калькулятор.
утверждал тогда , что на Форте шаттлы летают
регистры налету менять это интересно.
а ты работай только с инт32 и все нормально будет.ложишь какоето число в стек, а потом случайно выбираешь его другого типа.
Форт - это же польский калькулятор.
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Ну если рассматривать Forth как скриптовый язык для микроконтроллеров
, чтобы побыстрому написать немножко строчек кода - то таки да, имеет право на жизнь. Причем микроконтроллер должен быть мелким, иначе начнут заруливать более высокоуровневые скриптовые языки, например LUA или Python.
- Муркиз
- Друг Кота
- Сообщения: 25896
- Зарегистрирован: Пн фев 09, 2009 22:19:49
- Откуда: Когда-то был прекрасный город для людей
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Надо же - еще жив, этот курилка... Я уже лет двадцать о нем упоминаний не встречал... Думал, вместе с Фортраном и Лиспом вымер.
Спору нет - язык этот вкупе с транслятором со свойствами интерпретатора к тому же имеет ряд изюминок, которые интересны для слабых процессоров- но из проведенных у нас в лаборатории попыток работы на нем энтузиастов продолжить использовать его не нашлось. Слишком большие затраты времени нужны при кодировании в нем. А по объему кода оказалось, что Турбо Паскаль его опережает, - и по скорости счета, а уж по удобству и возможностям языка - так вообще - земля и небо.
Слишком неуклюжий и коварный он в использовании и заточен под счетные операции. С польской логикой.... это, знаете ли, только для поляков наверно удобно...
Спору нет - язык этот вкупе с транслятором со свойствами интерпретатора к тому же имеет ряд изюминок, которые интересны для слабых процессоров- но из проведенных у нас в лаборатории попыток работы на нем энтузиастов продолжить использовать его не нашлось. Слишком большие затраты времени нужны при кодировании в нем. А по объему кода оказалось, что Турбо Паскаль его опережает, - и по скорости счета, а уж по удобству и возможностям языка - так вообще - земля и небо.
Слишком неуклюжий и коварный он в использовании и заточен под счетные операции. С польской логикой.... это, знаете ли, только для поляков наверно удобно...
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Использование simple-forth-c для обработки прерывания по exti0 на плате stm32f0discovery
мы будем использовать кнопку для включения и выключения светодиода который находится на PORTC 8
вот код данного примера
после загрузки необходимо вызвать слова led_init и exti0_init
или для автоматического вызова прописать их в слово BOOT
мы будем использовать кнопку для включения и выключения светодиода который находится на PORTC 8
вот код данного примера
Код: Выделить всё
HEX
: led_init # настрока PORTC 8 на выход для led
40021014 @ # считываем значения регистра разрешения тактирования
80000 OR # включаем тактирования порта C
40021014 ! # записываем значения в регистр
48000800 @ FFFCFFFF AND # считываем значения настройки порта C
10000 OR 48000800 ! # настраиваем PORTC 8 на выход
48000804 @ FEFF # настраиваем PORTC 8 push-pull
AND 48000804 ! #
48000808 @ FFFCFFFF # Настраиваем PORTC 8 medium spead
AND 10000 OR 48000808 ! #
4800080C @ FFFCFFFF # очищаем
AND 4800080C !
;
: led_on
48000818 @ 100 OR 48000818 !
# Включаем светодиод
;
: led_off
48000818 @ 1000000 OR 48000818 !
# Выключаем светодиод bit set
;
HEX
: exti0_interrupt # создаем слово обработчик прерывания EXTI0
1 40010414 ! # очищаем флаг прерывания EXTI0
." CLICK " CR # выводим в терминал сообщения
48000810 @ 100 AND # проверяем включен ли PORTC 8
IF # Слово IF берет верхнее число со стека и если оно не равно 0
# то интерпретирует его как истина
led_off # Если включен то выключаем
ELSE
led_on # Иначе включаем
THEN
;
FIND exti0_interrupt # находим адрес слова обработчика прерыванием
8000054 # адрес прерывания EXTI0
INTERRUPT # регистрируем слово exti0_interrupt как прерывания по адресу 0x8000054
: exti0_init # создаем слово настройки EXTI0
40021014 @ 20000
OR 40021014 ! # Включаем тактирования PORTA
48000000 @ FFFFFFFFC
AND 48000000 ! # Настраиваем pin0 PORTA как вход
E000E100 @ 20
OR E000E100 ! # включаем прерывания EXTI0
40010408 @ 1
OR 40010408 ! # включаем прерывания по переднему фронту сигнала
40010400 @ 1
OR 40010400 ! # включаем прерывания по заднему фронту сигнала
;
или для автоматического вызова прописать их в слово BOOT
Код: Выделить всё
: BOOT
led_init
exti0_init
;
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Сравните с записью на C инициализации порта.
По сравнению с вашей записью - это один большой комментарий. Т.е. надо понимать - не тот язык программирования хорошь, на котором можно кратко записать мысли. Хорошь язык, на котором мысли записаны понятно.
Потому как написание кода это совсем не главное в жизни программы. Ваш вариант - это сидит программист. Пока он работает в фирме - код работает, когда он уволился - код придется выкинуть.
Код: Выделить всё
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
Потому как написание кода это совсем не главное в жизни программы. Ваш вариант - это сидит программист. Пока он работает в фирме - код работает, когда он уволился - код придется выкинуть.
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Уважаемый balmer, у меня есть только одно замечания. Ваш приведенный код это не С а C с использованием STM32 Standard Peripheral Libraries а сравниваете данный код с простым FORTH, по моему это сравнения слегка не корректно. Так как если и проводит сравнение простого FORTH то пожалуйста с чистым ANSI C без использование каких либо библиотек. И тогда ваш пример будет иметь вид похожий на етот
вот теперь можно сравнивать. Но по моему в данном примере читаемость кода аналогична примеру с использованием FORTH.
Код: Выделить всё
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_gpioc.h"
RCC_AHBENR |= 0x80000 ;
GPIOC_MODER &= 0xFFFCFFFF;
GPIOC_MODER |= 0x10000;
GPIOC_OSPEEDR &= 0xFFFCFFFF;
GPIOC_OSPEEDR |= 0x10000;
GPIOC_OTYPE &= 0xFEFF;
GPIOC_PUPDR &= 0xFFFCFFFF;
- balmer
- Это не хвост, это антенна
- Сообщения: 1433
- Зарегистрирован: Вс дек 02, 2012 03:13:48
- Откуда: Калининград
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
fenphys, вы совершенно правы. На С тоже можно наговнокодить. Но не нужно.
Вопрос скорее в другом - могли бы вы Forth привести пример нормального кода?
Вопрос скорее в другом - могли бы вы Forth привести пример нормального кода?
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Вышла новая версия simple-forth-c v0.2 теперь она запакована в инсталяционый файл в котором находятся: исходники ядра, ide разработчика , необходимые утилиты для сборки и загрузки системы.
Поскольку инсталятор для кота тяжеловат то вот ссылка на него https://sourceforge.net/projects/simple ... e/download
а во вложении описано как с помощью ide установить simple-forth-с на систему
Поскольку инсталятор для кота тяжеловат то вот ссылка на него https://sourceforge.net/projects/simple ... e/download
а во вложении описано как с помощью ide установить simple-forth-с на систему
- Вложения
-
- install_sfc_on_boars.rus.pdf
- (94.81 КБ) 288 скачиваний
-
Мурато Мяуконни
- Прорезались зубы
- Сообщения: 203
- Зарегистрирован: Сб ноя 19, 2016 21:05:48
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Оуфак! А почему бы не писать на машинных кодах сразу???? Мама-мия. Без коммента тут нивжисть не поймешь, что означает запись. А отыскать ошибки и опечатки - это будет поистине каторжный труд! Вы в состоянии запомнить адреса всех регистров и положение всех битов? Тогда настройте-ка ЮСБ в 103-м и наладьте связь с компом по-молодецки. А я посмотрю, сколько дней у вас займет листание списка регистров и битов.вот код данного примера
10000 OR 48000800 ! # настраиваем PORTC 8 на выход
E000E100 @ 20
OR E000E100 ! # включаем прерывания EXTI0
Блин, нафик я это на ночь посмотрел, теперь заснуть же не смогу от ужаса. До чего же можно изгадить простые понятные вещи. Кашшшшмар
Нет, вы не правы.Ваш приведенный код это не С а C с использованием STM32 Standard Peripheral Libraries
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- это самый настоящий язык Си. Всё по стандарту Си - функция с параметрами, обращение к элементу структуры, присваивание ему значения. Язык си - он аппаратно независимый, посему, не важно, на каких элементах он написан, язык в чистом виде не привязан к какой-либо аппаратной платформе. Но то, что мы можем писать на Си прогу для микроконтроллера - это результат работы огромной кучи файлов, подгоняющих чистый Си под аппаратную платформу. Без нее вы не подступитесь к конкретному микроконтроллеру.
А то, что пытаетесь состряпать вы со своими цифрами - это прямая аппаратная привязка в самом исходнике, да еще в жутко изувеченной форме, с перевернутым с ног на голову порядком записи. Совершенно никакой выгоды в этом нет. Одна опечатка в цифрах - и всё, фейл и краш системы.
Раз уж хотите что-то написать, какой-нибудь плагин, то напишите какой-нибудь интерпретатор внешних команд, принимаемых по УАРТу или читаемых с текстового файла с флешки или УСБ. Но опять же, это должно быть какое-то осмысленное специализированное устройство, к которому могут быть прикручены самописные плагины, загружаемые извне и совершенно не касающиеся аппаратной части микроконтроллера.
Подпись убрал вместе с автором. aen
Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Интересно!
Искал - что бы такое встроить в автономный контроллер для умного дома дабы закодить там самую минимальную логику когда отваливается основной моск и контроллер должен что то самое простое делать сам (так то на нём только датчики и выхода). Купился на коммент на хабре про размер, но 6.5кБ это всё же для такой минималистичной штуки - многовато.
Искал - что бы такое встроить в автономный контроллер для умного дома дабы закодить там самую минимальную логику когда отваливается основной моск и контроллер должен что то самое простое делать сам (так то на нём только датчики и выхода). Купился на коммент на хабре про размер, но 6.5кБ это всё же для такой минималистичной штуки - многовато.


