Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-дек-15 09:17

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: scmRTOS, порт для Cortex-M1, GCC
СообщениеДобавлено: 2014-дек-02 21:27 
Не в сети

Зарегистрирован: 2009-май-25 20:31
Сообщения: 9
Откуда: Воронеж
Делал специально для 1986ВЕ1Т. За основу был взят порт для Cortex-M3.
Пол-года юзаю - полет нормальный
Вложение:
scmRTOS.4.00.Cortex-M1.GCC.7z [18.31 КБ]
Скачиваний: 292



ОПИСАНИЕ

scmRTOS v4
Cortex-M1
GCC

Что было изменено относительно порта для Cortex-M3:

1. Замена неподдерживаемых инструкций.
Файл OS_Target_asm.S, функция PendSV_Handler().
Cortex-M1 не поддерживает инструкции STMDB R0!, {R4-R11} и LDMIA R0!, {R4-R11}.
Инструкции заменены на соответствующие последовательности поддерживаемых инструкций.

2. Добавлена возможность выбора в качестве системного таймера TIMER1 или SystemTimer.
Поскольку порт делался конкретно под 1986ВЕ1Т, а в нем присутствует бага в железе,
из-за которой в большинстве случаев невозможно корректно настроить частоту SystemTimer,
то пришлось в качестве системного использовать TIMER1.

В файл scmRTOS_CONFIG.h был добавлен макрос scmRTOS_USE_SYSTICKTIMER.
В файлах:
OS_Kernel.h,
OS_Target_asm.S,
OS_Target_cpp.cpp,
scmRTOS_TARGET_CFG.h
добавлены директивы условной компиляции, позволяющие переключаться между TIMER1 или SystemTimer.
Инициализация TIMER1 должна быть произведена до запуска ОС.

3. Добавлена возможность использования уникальной структуры _reent для каждого процесса.
Это позволяет сделать реентерабельными функции стандартной библиотеки, но приведет к
дополнительному расходу ОЗУ. Чтобы уменьшить дополнительный расход ОЗУ на хранение
структур _reent, рекомендуется добавить ключ компиляции -D_WANT_REENT_SMALL

Для включения данной опции, в файл scmRTOS_CONFIG.h был добавлен макрос scmRTOS_REENT_STDLIB.
В файлах:
OS_Kernel.h,
OS_Kernel.cpp,
OS_Target.h
добавлены директивы условной компиляции.

Пример объявления процессов с этой опцией:
Код:
#if scmRTOS_REENT_STDLIB==1
        _reent reent_struct_USB                 =_REENT_INIT(reent_struct_USB);
        _reent reent_struct_terminal            =_REENT_INIT(reent_struct_terminal);
        _reent reent_struct_measurement    =_REENT_INIT(reent_struct_measurement);
        TProc_USB            Proc_USB(&reent_struct_USB);
        TProc_terminal        Proc_terminal(&reent_struct_terminal);
        TProc_measurement    Proc_measurement(&reent_struct_measurement);
#else
        TProc_USB            Proc_USB;
        TProc_terminal        Proc_terminal;
        TProc_measurement    Proc_measurement;
#endif    //scmRTOS_REENT_STDLIB==1


Так как в своем проекте я активно использовал стандартную библиотеку, то решил добавить в ОС
эту опцию, не дожидаясь когда появятся глюки в многопоточных приложениях.
В реальной полезности опции до конца не уверен. По крайней мере, с ней все работает.
Данная опция не имеет непосредственного отношения к предлагаемому порту ОС


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: scmRTOS, порт для Cortex-M1, GCC
СообщениеДобавлено: 2018-окт-22 12:02 
Не в сети

Зарегистрирован: 2018-сен-14 15:48
Сообщения: 15
injen-d писал(а):
Инициализация TIMER1 должна быть произведена до запуска ОС.


Доброго времени суток. Нужно ли что-либо делать с таймером помимо инициализации?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: scmRTOS, порт для Cortex-M1, GCC
СообщениеДобавлено: 2018-окт-23 09:01 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 201
Откуда: ПКК "Миландр"
С дистрибутивом не знаком, но обычно все что требуется от таймера - это генерация прерываний. В них происходит отработка переключения задач.

В 1986ВЕ1Т согласно errata системный таймер работает некорректно - останавливается счет при отработке задержки Delay при доступе к EEPROM (на частотах выше 25МГц). Поэтому прерывания от него при не нулевом Delay работают не равномерно и период прерываний "гуляет" в большую сторону. Там где переключение задач не критично можно пользоваться системным таймером.

А там где критично - вместо системного таймера подключается периферийный таймер (нет проблемы с Delay). Его задача делать тоже самое, что делал бы системный - генерировать прерывания.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB