Представляю вашему вниманию систему 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 кбайт памяти.
Вложения:
Комментарий к файлу: система simple-forth-c.zip [61.4 KiB]
Скачиваний: 354
Для примера работы продемонстрируем как засветит светодиоды на плате stm32f0discovery данный код необходимо ввести в программе терминала которая подключенна к порту 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 ;
данная программа создаст два новых слова LED_INIT и LEDS_ON чтобы светодиоды зажигались при загрузке микроконтроллера необходимо создать слово BOOT с таким содержимым
Забавный язык программирования Но боюсь что отсутствие типизации и "Основная проблема при программировании больших систем на форте - необходимость постоянно контролировать состояние стека после работы слова." - это стразу ставит крест на использовании.
И немножко овлеченного философствования. Языки программирования они развивались от "свободы и расхлябанности" к "жесткой дисциплине и тоталитарности".
Например типизация переменных в C не дает нам возможность не совершить кучу ошибок. Как только мы попытаемся сделать подобное int a=1; char* b = a; - компилятор заругается.
Структуры и классы в С++ позволяют избавиться от еще пачки ошибок. Более того, благодаря ним програма начинает обладать свойствами "самодокументированности".
В Java и C# есть еще одно ограниячение - нельзя куда попало писать в память программы. Т.е. выделили массив на 100 элементов, при записи в 101 элемент программа упадет.
И это хорошо, потому как "один плохой программист" не сломает систему, в которой 10 Мб кода.
Я не соглашусь с balmer так как данная реализация FORTH не предназначенна для десктопа а только для микроконтроллеров, и я не встречал реализацию java или C# которую можна воткнуть в stm32f030f4 с 16 кбайт. флеши, а FORTH свободно встанет и еще место останется. А по поводу философствования да в Java и C# один программист может быть и не сломает систему, но он может написать абсолютно не сопровождаемый код или дописать костыль что бы быстро добавить какойто функционал и в результате чего вся программа в конечном итоге будет состоять из костылей. Так что я считаю что на любом языке можно написать как "самодокументируемый код" так и "абсолютно не сопровождаемое поделие".
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Отсутствие типизации, когда ты ложишь какоето число в стек, а потом случайно выбираешь его другого типа. Там даже "заплатка" типизации придуманна - выделить для float отдельный стек. Большинство языков ругнулись бы на такое, и программист исправил бы. А так ищи-свищи по мегабайтам кода.
Про "необходимость постоянно контролировать состояние стека после работы" - тоже совершенна дурная работа. В C/C++ кода мы добавляем еще один аргумент в функцию - он везде поругается, где вызывалась функция с неправильным количеством аргументов. FORTH - это схавает, потом упадет когда нибудь. Это АД!
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
balmer, по поводу ограниченного применения FORTH в больших системах ты прав, но данная конкретная реализация FORTH задумана быстрее как аналог arduino для Corex-M, чтобы можно была быстро запрограммировать простую "ногодрыгальную программу". Но в тоже время FORTH в отличие от arduino дает полный контроль над железом. То есть допустим человек захотел познакомится с stm32 он скачивает FORTH собирает ядро например для stm32f051R8 прошивает через загрузчик и получает работающую систему и он теперь может в реальном времени менять значения регистров конфигурации периферии и смотреть как система реагирует на это.
в 80е у меня знакомый был - большой энтузиаст писать на Forth для Z80. утверждал тогда , что на Форте шаттлы летают регистры налету менять это интересно.
Цитата:
ложишь какоето число в стек, а потом случайно выбираешь его другого типа.
а ты работай только с инт32 и все нормально будет. Форт - это же польский калькулятор.
Ну если рассматривать Forth как скриптовый язык для микроконтроллеров , чтобы побыстрому написать немножко строчек кода - то таки да, имеет право на жизнь. Причем микроконтроллер должен быть мелким, иначе начнут заруливать более высокоуровневые скриптовые языки, например LUA или Python.
Заголовок сообщения: Re: Система forth для микроконтроллеров stm32f0xx stm32f1xx
Добавлено: Ср апр 27, 2016 16:47:52
Друг Кота
Карма: 94
Рейтинг сообщений: 3479
Зарегистрирован: Пн фев 09, 2009 22:19:49 Сообщений: 17569 Откуда: Когда-то был прекрасный город для людей
Рейтинг сообщения:0
Надо же - еще жив, этот курилка... Я уже лет двадцать о нем упоминаний не встречал... Думал, вместе с Фортраном и Лиспом вымер.
Спору нет - язык этот вкупе с транслятором со свойствами интерпретатора к тому же имеет ряд изюминок, которые интересны для слабых процессоров- но из проведенных у нас в лаборатории попыток работы на нем энтузиастов продолжить использовать его не нашлось. Слишком большие затраты времени нужны при кодировании в нем. А по объему кода оказалось, что Турбо Паскаль его опережает, - и по скорости счета, а уж по удобству и возможностям языка - так вообще - земля и небо.
Слишком неуклюжий и коварный он в использовании и заточен под счетные операции. С польской логикой.... это, знаете ли, только для поляков наверно удобно...
Использование simple-forth-c для обработки прерывания по exti0 на плате stm32f0discovery мы будем использовать кнопку для включения и выключения светодиода который находится на 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 ! # включаем прерывания по заднему фронту сигнала ;
после загрузки необходимо вызвать слова led_init и exti0_init или для автоматического вызова прописать их в слово BOOT
По сравнению с вашей записью - это один большой комментарий. Т.е. надо понимать - не тот язык программирования хорошь, на котором можно кратко записать мысли. Хорошь язык, на котором мысли записаны понятно.
Потому как написание кода это совсем не главное в жизни программы. Ваш вариант - это сидит программист. Пока он работает в фирме - код работает, когда он уволился - код придется выкинуть.
Уважаемый balmer, у меня есть только одно замечания. Ваш приведенный код это не С а C с использованием STM32 Standard Peripheral Libraries а сравниваете данный код с простым FORTH, по моему это сравнения слегка не корректно. Так как если и проводит сравнение простого FORTH то пожалуйста с чистым ANSI C без использование каких либо библиотек. И тогда ваш пример будет иметь вид похожий на етот
Вышла новая версия simple-forth-c v0.2 теперь она запакована в инсталяционый файл в котором находятся: исходники ядра, ide разработчика , необходимые утилиты для сборки и загрузки системы. Поскольку инсталятор для кота тяжеловат то вот ссылка на него https://sourceforge.net/projects/simpleforthc/files/install/SFCide-0.1.exe/download а во вложении описано как с помощью ide установить simple-forth-с на систему
вот код данного примера 10000 OR 48000800 ! # настраиваем PORTC 8 на выход E000E100 @ 20 OR E000E100 ! # включаем прерывания EXTI0
Оуфак! А почему бы не писать на машинных кодах сразу???? Мама-мия. Без коммента тут нивжисть не поймешь, что означает запись. А отыскать ошибки и опечатки - это будет поистине каторжный труд! Вы в состоянии запомнить адреса всех регистров и положение всех битов? Тогда настройте-ка ЮСБ в 103-м и наладьте связь с компом по-молодецки. А я посмотрю, сколько дней у вас займет листание списка регистров и битов. Блин, нафик я это на ночь посмотрел, теперь заснуть же не смогу от ужаса. До чего же можно изгадить простые понятные вещи. Кашшшшмар
Цитата:
Ваш приведенный код это не С а C с использованием STM32 Standard Peripheral Libraries
Нет, вы не правы. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- это самый настоящий язык Си. Всё по стандарту Си - функция с параметрами, обращение к элементу структуры, присваивание ему значения. Язык си - он аппаратно независимый, посему, не важно, на каких элементах он написан, язык в чистом виде не привязан к какой-либо аппаратной платформе. Но то, что мы можем писать на Си прогу для микроконтроллера - это результат работы огромной кучи файлов, подгоняющих чистый Си под аппаратную платформу. Без нее вы не подступитесь к конкретному микроконтроллеру. А то, что пытаетесь состряпать вы со своими цифрами - это прямая аппаратная привязка в самом исходнике, да еще в жутко изувеченной форме, с перевернутым с ног на голову порядком записи. Совершенно никакой выгоды в этом нет. Одна опечатка в цифрах - и всё, фейл и краш системы.
Раз уж хотите что-то написать, какой-нибудь плагин, то напишите какой-нибудь интерпретатор внешних команд, принимаемых по УАРТу или читаемых с текстового файла с флешки или УСБ. Но опять же, это должно быть какое-то осмысленное специализированное устройство, к которому могут быть прикручены самописные плагины, загружаемые извне и совершенно не касающиеся аппаратной части микроконтроллера.
_________________ Подпись убрал вместе с автором. aen
Интересно! Искал - что бы такое встроить в автономный контроллер для умного дома дабы закодить там самую минимальную логику когда отваливается основной моск и контроллер должен что то самое простое делать сам (так то на нём только датчики и выхода). Купился на коммент на хабре про размер, но 6.5кБ это всё же для такой минималистичной штуки - многовато.
Сейчас этот форум просматривают: john1770 и гости: 32
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения