Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Порт для Cortex-M1, GCC
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
injen-d
Выкладываю.
Нажмите для просмотра прикрепленного файла


ОПИСАНИЕ

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


Так как в своем проекте я активно использовал стандартную библиотеку, то решил добавить в ОС
эту опцию, не дожидаясь когда появятся глюки в многопоточных приложениях.
В реальной полезности опции до конца не уверен. По крайней мере, с ней все работает.
Данная опция не имеет непосредственного отношения к предлагаемому порту ОС.
Если никому не интересно, могу вырезать это с корнями.
Lmx2315
QUOTE (injen-d @ Nov 9 2014, 01:32) *
Если кому интересно, выложу. Надо только в нормальный вид привести.

..интересно конечно, выложите если не жалко.
Если здоровье позволит - самому скоро 1986ВЕ1Т пробовать на зуб.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.