======Использование RTX OS Keil в 1986ВЕ1====== При использовании Pack от Миландр для Keil 5 можно заметить, что нет возможности подключить поставляемую вместе с Keil систему реального времени к 1986ВЕ1, так же легко, как это можно сделать для микроконтроллеров 1986ВЕ9х. При создании проекта для 1986ВЕ9х, RTOS выбирается одной галочкой в "Manage Runtime Environment". {{prog:spec:rtos_libs.png}} //В микроконтроллере 1986ВЕ1Т присутствует неустранимая ошибка системного таймера, который используется системой реального времени. Системный таймер работает правильно только при частоте ядра до 25МГц. При более высоких частотах времена растягиваются. Подробнее в файле Errata, ошибка "0011" - [[http://ic.milandr.ru/products/mikrokontrollery_i_protsessory/32_razryadnye_mikrokontrollery/1986ve1t/?tab=DOCS| Спецификация на микросхему 1986ВЕ1Т errata]]// =====Подключаем файлы RTOS===== Но, тем не менее, использовать RTOS в 1986ВЕ1 можно. Надо лишь самостоятельно подключить в проект необходимые файлы. Вот как выглядит дерево проекта при подключении RTOS к нашему примеру [[PROG:Start:HelloWord|Hello World - светодиод]]. {{prog:spec:rtos_ve1_proj.png}} Пути по которым лежат подключаемые файлы: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Source\rtx_lib.c C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Library\ARM\RTX_CM0.lib !Эти файлы лучше скопировать к себе в проект, как это делает среда для 1986ВЕ9х: C:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.1\CMSIS\RTOS2\RTX\Config RTX_Config.c RTX_Config.h и этот путь необходимо указать в закладке C/C++. RTE\CMSIS\ RTX_Config.c RTX_Config.h Пути, которые необходимо подключить в проекте, закладка С/С++: {{prog:spec:rtos_ve1_path.png}} Можно заметить, что мы подключили библиотеку RTX_CM0.lib, а в папке по этому пути лежат также RTX_CM3.lib, RTX_CM4F.lib. То есть библиотеки к соответствующему ядру Cortex, а для Cortex-M1 отдельной библиотеки нет. Я думаю, это связано с тем, что ядра M0 и M1 имеют одну архитектуру ARMv6-M, а так же одинаковый набор инструкций. Убедиться в этом можно здесь [[https://en.wikipedia.org/wiki/ARM_Cortex-M|ARM Cortex-M instruction variations]]. Кроме этого, применимость RTX_CM0.lib для ядра М1 обозначена в документации к RTOS [[https://www.keil.com/pack/doc/CMSIS/RTOS/html/dirstructfiles.html|CMSIS-RTOS RTX Library Files]]. =====Hello World на RTOS===== Для проверки работоспособности проекта реализуем мигание светодиодом, при этом слегка модифицируем код [[PROG:Start:HelloWord|Hello World - светодиод]] для использования RTOS. Итоговый код "main.c": #include #include #include // Структура настроек для потока typedef struct { uint32_t Led_PortPin; uint32_t Led_Delay; } LED_ThreadCfg; // Задержка мигания светодиодов в миллисекундах #define Led_Delay_VD6 200 #define Led_Delay_VD7 400 #define Led_Delay_VD8 800 // Функция потока - исполняется в отдельном потоке void Thread_LED (void *argument) { // Структура для настройки портов PORT_InitTypeDef GPIOInitStruct; // Параметры для функции, задаются извне LED_ThreadCfg cfgThread = *(LED_ThreadCfg *)(argument); // Включение тактирования RST_CLK_PCLKcmd (RST_CLK_PCLK_PORTD, ENABLE); // Настройка вывода порта PORT_StructInit(&GPIOInitStruct); GPIOInitStruct.PORT_Pin = cfgThread.Led_PortPin; GPIOInitStruct.PORT_OE = PORT_OE_OUT; GPIOInitStruct.PORT_SPEED = PORT_SPEED_SLOW; GPIOInitStruct.PORT_MODE = PORT_MODE_DIGITAL; PORT_Init(MDR_PORTD, &GPIOInitStruct); // Цикл исполнения - мигание светодиодом while (1) { PORT_SetBits(MDR_PORTD, cfgThread.Led_PortPin); osDelay(cfgThread.Led_Delay); PORT_ResetBits(MDR_PORTD, cfgThread.Led_PortPin); osDelay(cfgThread.Led_Delay); } } int main(void) { // Настройки для потоков LED_ThreadCfg Cfg_Thread1 = {PORT_Pin_7, Led_Delay_VD6}; LED_ThreadCfg Cfg_Thread2 = {PORT_Pin_8, Led_Delay_VD7}; LED_ThreadCfg Cfg_Thread3 = {PORT_Pin_9, Led_Delay_VD8}; // Инициализация RTOS osKernelInitialize(); // Создание потоков мигания светодиодом osThreadNew (Thread_LED, &Cfg_Thread1, NULL); osThreadNew (Thread_LED, &Cfg_Thread2, NULL); osThreadNew (Thread_LED, &Cfg_Thread3, NULL); // Запуск RTOS osKernelStart(); } Здесь мы создали три потока, в каждый из которых передали свою структуру, определяющую каким светодиодом и с каким периодом необходимо мигать. =====FreeRTOS на Форуме===== На форуме можно найти примеры использования FreeRTOS для 1986ВЕ1, [[http://forum.milandr.ru/viewtopic.php?f=34&t=405&p=10381&hilit=FreeRTOS#p10377|ссылка]].