На сегодняшний день без МК не обходится ни одно электронное устройство. Кофеварки, микроволновки, стиралки, планшеты… продолжать можно бесконечно. Микроконтроллеры стремительно качественно прогрессируют. Больше оперативной и флешь памяти, выше частота и мощность процессора, богаче периферия. На заре микроконтроллерной эпохи, когда ресурсов не хватало, программисты вынуждены были использовать различные ухищрения, чтобы код получился как можно меньше и быстрее.
Сейчас микроконтроллеры имеют большой запас и этого делать уже не нужно. Практические задачи остались прежними, а способы их решения упростились за счёт большего расточительства. Когда у тебя в кране полно воды, будешь ли ты пить её, как в пустыне, экономя каждый глоток?
Об одном из уникальных средств приятного расточительства, упрощающего разработку сложных микроконтроллерных систем, и хотелось бы поговорить. Это так называемые операционные системы. Их достаточно большое количество.
Я для работы использую среду разработки CooCox IDE и считаю её лучшей. А CooCox CoOS это многозадачная операционная система реального времени (ОСРВ) для встраиваемых систем.
Содержание статьи / Table Of Contents
После старого доброго WinAVR и IAR создается впечатление, будто пересел с простого автомобиля на тачку бизнес класса. Поэтому предлагаю начать именно с нее. К тому же эта среда является бесплатной.
Использовать для первого опыта будем микроконтроллер STM32F100RBT6 установленный на бюджетной отладочной плате STM32VL-Discovery, которую на время эксперимента я взял у друга. На ней как раз установлено два светодиода, темп мигания которых мы установим независимо друг от друга, каждый с произвольной частотой.
Использование операционной системы - это неоспоримое преимущество перед написанием самостоятельного софта, непосредственно дергающего выводы микроконтроллера.
Сперва я обратил внимание на операционную систему FreeRTOS. Собрал первый проект на ней, но так и не запустил, так как не хватило оперативной памяти у имеющегося на плате STM32VL-Discovery микроконтроллера. Установил в настройках среды разработки более мощный контроллер 103-й серии и у меня всё отлично откомпилировалось, но реального железа не было, чтобы проверить.
Позже, совершенно случайно обнаружил среди встроенных в CooCox IDE библиотек ядро операционной системы и решил ещё раз попробовать.
Поискал в интернете информацию и ничего об этой операционной системе не нашёл, а в последствии оказалось - классная штука, после сборки заработала с первого раза. Меня это удивило, так как с первого раза обычно ничего не работает. В CooCox есть example (пример) её использования, который я переделал под поставленную задачу мигания светодиодами.
Принцип создания продукта прост. Отдельно мы разрабатываем задачи, это похоже на то, как мы пишем функцию вне основного тела main. А задачи мы создаём с помощью функции, встроенной в ядро системы и предназначенной для создания задач уже в теле main.
Выполняет ранее созданные задачи операционная система самостоятельно после запуска встроенной в неё функции старта.
↑ Рассмотрим все подробнее
Прежде чем приступить к написанию исходного кода программы необходимо установить среду CooCox IDE и настроить её под наш проект.В конце статьи будут приложены файлы проекта, поэтому после установки необходимого программного обеспечения, мы можем открыть готовый проект, подключить отладочную плату STM32VL-Discovery, прошить и получить быстрый результат.
А уже после провести серию экспериментов над кодом. Например, изменить частоту мигания светиков, добавить еще задач и т. п.
↑ Настройка среды
После установки CooCox IDE нам нужно указать путь к компилятору, программе, которая собственно и превращает наш исходный текст программы в машинный код микроконтроллера. Для этого заходим во вкладку Project –> Select Toolchain Patch и выбираем путь к компилятору arm_2011.03_coocox\bin, жмём ОК.Далее необходимо выбрать отладчик, в нашем случае это ST-LINK. Вкладка Debug –> Debug Configuration –> ST-Link, нажать Apply. Не забываем установить драйвера для этого отладчика с сайта производителя.
Если Вы не желаете собирать проект сами, можете открыть проект, который находится в приложении. Для этого вкладка Project –> Open Project и выбрать путь к файлу проекта - CooOStest.cob.
Далее подключить плату STM32VL-Discovery к Вашему компьютеру. Для прошивки микроконтроллера вкладка Flash –> Program Download. На плате при этом на пару секунд должен замигать красный светодиод, означающий, что идет обмен данными между компьютером и микроконтроллером. После этого на плате замигают два светодиода, зеленый и синий, с разными частотами мигания.
В случае самостоятельной сборки необходимо создать новый проект. Вкладка Project –> New Project.
Затем придумать имя проекту, например CooCoxOStest. Жмем Finish.
Перед вами в центре среды появится вкладка Repository.
Шаг 1. Выбираем фирму производителя микроконтроллера, в нашем случае для STM32VL-Discovery это ST.
Далее получаем следующий шаг.
Шаг 2. Выбираем контроллер STM32F100RB.
Шаг 3. В появившемся окне ставим галочку GPIO. Автоматически установятся еще три галочки CMSIS core, CMSIS Boot и RCC. Эти библиотеки необходимы для того чтобы включить периферию, те порты ввода вывода GPIO (ноги контроллера), тактирование внутренних шин (RCC) и вспомогательные библиотеки для работы с ядром.
Осталось подключить ядро ОС. Для этого прокруткой попадаем в самую нижнюю строку Repository и ставим галочку напротив CooCox OS.
Настройки готовы. Осталось в левом нижнем окошке Project открыть файл main.c
И в появившейся вкладке main.c написать текст программы, подобно тому, как будет описано дальше.
В исходном коде программы подключаем файлы ядра и стандартных CMSIS библиотек.
#include "CoOS.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
Определяем под каждую необходимую нам задачу размер оперативной
памяти под стек. Если ее выделить мало, задача не сможет быть выполнена до конца. Если слишком много, то, при увеличении числа задач, памяти может не хватить.
#define STACK_SIZE_TASKA 128 //128 – это и есть наш размер стека
#define STACK_SIZE_TASKB 128
OS_STK taskA_stk[STACK_SIZE_TASKA];
OS_STK taskB_stk[STACK_SIZE_TASKB];
Независимо от того, насколько хороша наша операционная система, нам в первую очередь необходимо настроить внутреннюю периферию контроллера, для этого собственно мы и подключали выше стандартные библиотеки МК от производителя.
void InitPort(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
↑ Пример программы
Далее нам необходимо составить саму задачу на примере задачи А.Исключён фрагмент. Полный вариант доступен меценатам и полноправным членам сообщества.
Наконец-то компилируем, нажав F7, прошиваем и любуемся результатом.
↑ Прошивка чипа на демоплате
Вариант 1. Вкладка Flash -> жмем Program download. В процессе (пара секунд) на плате мигает красный светодиод, после чего плата стартует автоматически.
Вариант 2. Кнопка с зеленой иконкой, как на скриншоте, всплывающая подсказка Download Code To Flash. Эффект такой же.
Видео в низком разрешении, извините, но суть понятна.
↑ Файлы
🎁CooOStest.7z 195.57 Kb ⇣ 32↑ Ссылки
• Заказать себе демо-плату STM32VL Discovery• Драйвер для этой платы - STM32 ST-LINK utility
• CooCox CoIDE
• CooCox CoOS
• CooCox компилятор
• FreeRTOS
Спасибо за внимание!
Камрад, рассмотри датагорские рекомендации
🌼 Полезные и проверенные железяки, можно брать
Опробовано в лаборатории редакции или читателями.