Нажмите для просмотра прикрепленного файла
ОПИСАНИЕ
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
_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
Так как в своем проекте я активно использовал стандартную библиотеку, то решил добавить в ОС
эту опцию, не дожидаясь когда появятся глюки в многопоточных приложениях.
В реальной полезности опции до конца не уверен. По крайней мере, с ней все работает.
Данная опция не имеет непосредственного отношения к предлагаемому порту ОС.
Если никому не интересно, могу вырезать это с корнями.