Эта тема время от времени всплывает и у меня мысль проскакивала, но
вот первый раз формулирую в виде текста.
TCritSect сейчас определён в OS_Target.h
И для <<по умолчанию>> он вполне годится. Но для систем с вложенными
прерываниями И с возможностью регулировать приоритет ядра процессора
может хотеться самым приоритетным дать возможность работать всегда при
условии, что они обещают не пользоваться сервисами ОС. Как они при
этом общаются с процессами ОС -- отдельный разговор. Всегда можно
придумать, скажем, в нужные моменты активировать какое-то другое
прерывание ниже приоритетом, которое будет разрешено после выхода из
критической секции и тогда отмахнёт ОС. Или вообще через флаги
поллингом. Но иногда бывают прерывания, для которых хотлеось бы
минимальные задержки. Впрочем, как раз недавно у меня такое было на
одной старой плате с atmega64, а там нет вложенных приоритетных
прерываний, поэтому пришлось на прототредах сделать.
Предлагается в OS_Target.h обернуть TCritSect в #ifndef
TCRIT_SECT_DEFINED или какое-то более подходящее имя.
Таким образом в scmRTOS_TARGET_CFG.h можно будет задать свою крит.
секцию и задать такой #define.
Такая крит. секция будет просто повышать приоритет ядра до такого, при
котором <<внеосевые>> приоритеты разрешены, а <<осевые>> запрещены.
Может быть полезно для кортексов, STM8 и если доберусь до XMEGA -- тоже
неплохо будет.
--
wbr,
ReAl
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ Cortex-О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫" О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ TCritSect.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫.
On Thu, 19 Apr 2012 01:03:01 +0300
Oleksandr Redchuk <oleksand...@gmail.com> wrote:
> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫!
>
> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫
> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
>
> TCritSect О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫лёО©╫ О©╫ OS_Target.h
> О©╫ О©╫О©╫О©╫ <<О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫>> О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫. О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫нёО©╫ О©╫О©╫. О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ atmega64, О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
>
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ OS_Target.h О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ TCritSect О©╫ #ifndef
> TCRIT_SECT_DEFINED О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫.
> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ scmRTOS_TARGET_CFG.h О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.
> О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ #define.
> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫ <<О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫>> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ <<О©╫О©╫О©╫О©╫О©╫О©╫>> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, STM8 О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ XMEGA -- О©╫О©╫О©╫О©╫
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
>
> --
> wbr,
> ReAl
>
> --
> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ -- http://groups.google.com/group/scmrtos-ru
--
Oleg Gladyshev <gla...@mail.ru>
OR> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫
OR> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫.
[...]
OR> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ OS_Target.h О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ TCritSect О©╫ #ifndef
OR> TCRIT_SECT_DEFINED О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫.
OR> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ scmRTOS_TARGET_CFG.h О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.
OR> О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ #define.
OR> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫
OR> О©╫О©╫О©╫О©╫О©╫О©╫О©╫ <<О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫>> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ <<О©╫О©╫О©╫О©╫О©╫О©╫>> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
OR> О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, STM8 О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ XMEGA -- О©╫О©╫О©╫О©╫
OR> О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫щё О©╫ scmRTOS_defs.h О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
//----------------- scmRTOS_USER_DEFINED_CRITSECT_ENABLE -------------
#ifndef scmRTOS_USER_DEFINED_CRITSECT_ENABLE
#define scmRTOS_USER_DEFINED_CRITSECT_ENABLE 0
#endif
#if (scmRTOS_USER_DEFINED_CRITSECT_ENABLE < 0) ||
(scmRTOS_USER_DEFINED_CRITSECT_ENABLE > 1)
#error "Error: scmRTOS_USER_DEFINED_CRITSECT_ENABLE must have values 0 or 1
only!"
#endif
О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫сё О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ - О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫сё О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫?
--
H.Z.
### О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
OR>> Предлагается в OS_Target.h обернуть TCritSect в #ifndef
OR>> TCRIT_SECT_DEFINED или какое-то более подходящее имя.
HZ> Согласен. Нормальное решение, не вызывает коллизий с совместимостью и
HZ> реализует нужную хотелку. Как я понимаю, ещё в scmRTOS_defs.h надо добавить:
HZ> //----------------- scmRTOS_USER_DEFINED_CRITSECT_ENABLE -------------
HZ> #ifndef scmRTOS_USER_DEFINED_CRITSECT_ENABLE
HZ> #define scmRTOS_USER_DEFINED_CRITSECT_ENABLE 0
HZ> #endif
Ну тут не знаю, насколько оно надо. Это полностью замыкается в порте,
сама ОС и знать ничего не будет.
HZ> Ну, и остальное, как ты написал. Тогда всё будет гуд - и фича
HZ> конфигурируемая, и совместимость прозрачна - кто не использует, даже не
HZ> заметит.
HZ> Сам добавишь всё это хозяйство или мне?
Надо посоображать сначала.
Оно-то замыкается полностью в порте, но хочется однородности.
Т.е. надо обдумать как оно может захотеться для разных архитектур и
сделать так, чтобы было однотипным, рекомендации какие-то выдать.
Похоже, в таком случае стоит делать enum с уровнями (у STM8 они идут
не подряд по кодам, у разных других может быть 0 = все разрешены или 0
= все запрещены).
Далее пользователь, который сам знает, как он распределил приоритеты,
должен для конструктора TCritSect() дать аргумент уровня со значением
по умолчанию, соответствующим запрету до самого высокого приоритета,
используемого в ОС. Тогда в ОС TCritSect cs; воспользуется значением
по умолчанию, а пользователь в своём коде сможет тем же классом
запрещать и сильнее, когда ему надо будет пообщаться с приоритетными
прерываниями в стиле "volatile-флаги в две стороны и их опрос".
Макрос ENABLE_NESTED_INTERRUPTS() тоже должен в таком случае получить аргумент?
Или нет, так как он может использоваться в ОС, а там не должно быть
нужно ничего менять.
Тогда, пожалуй, добавлять макрос в духе ENABLE_NESTED_LEVEL(level), а
старый разрешает все.
Думаю, срочности в этом нет, стоить обсудить.
--
wbr,
ReAl
HZ> Как я понимаю, ещё в scmRTOS_defs.h надо добавить:
HZ> //----------------- scmRTOS_USER_DEFINED_CRITSECT_ENABLE -------------
HZ> #ifndef scmRTOS_USER_DEFINED_CRITSECT_ENABLE
HZ> #define scmRTOS_USER_DEFINED_CRITSECT_ENABLE 0
HZ> #endif
Так и не пойму, стоит ли это делать. "Коммуникация" начинается в
scmRTOS_TARGET_CFG.h и заканчивается в OS_Target.h, дальше этим
макросом никто не пользуется. Будет просто другое определение класса
TCritSect, прозрачно для кода ОС.
Но в какой-то порт может захотеться сразу внести два варианта, такой,
как сейчас с полным запретом (более простой, меньше кода) и с заданием
уровней. И тогда в scmRTOS_TARGET_CFG.h для _этого_ порта нужно будет
внести ещё конфигурационный макрос. Его тоже потом в scmRTOS_defs.h
добавлять для всех?
И пока кроме оборачивания в OS_Target.h
// #ifndef scmRTOS_USER_CRITSECT_DEFINED
#if scmRTOS_USER_DEFINED_CRITSECT_ENABLE == 0
class TCritSect
{
public:
TCritSect () : StatusReg(get_interrupt_state()) { disable_interrupts(); }
~TCritSect() { set_interrupt_state(StatusReg); }
private:OS_
status_reg_t StatusReg;
};
#endif
ничего и не делать.
Даже enum для приоритетов вложенных прерываний может оказаться
невозможным поместить в OS_Target.h.
Для Cortex-ов он должен быть в scmRTOS_TARGET_CFG.h, так как только
пользователь знает, как он настроил обработку прерываний и сколько
уровней вытеснения у него вышло.
Для STM8 число приоритетов фиксировано и enum можно разместить в
OS_Target.h выше точки включения scmRTOS_TARGET_CFG.h Возможно, и всю
реализацию сразу в OS_Target.h, там оно единственным образом может
быть сделано и без дополнительных расходов.
Единственное, что можно было бы внести в соглашение о стиле -- имя для
этого enum и стиль имён констант.
И обдумать способ передачи в system_timer_isr()
Сейчас в большинстве портов в OS_Target_cpp.cpp
#if scmRTOS_SYSTIMER_NEST_INTS_ENABLE == 1
ENABLE_NESTED_INTERRUPTS();
#endif
но для имеющих вложенные прерывания может захотеться задавать уровень.
А это другой макрос.
HZ> Сам добавишь всё это хозяйство или мне?
HZ> --
HZ> H.Z.
HZ> ### Если добровольцев не будет, мне придется их назвать.
Да я бы и доброволец, но пока не утряслось в голове.
Ау! Кому это уже было нужно -- ваше мнение по организации? Я пока не
вижу всех вохможных нюансов реализаций, а сделать что-то, что потом
почти сразу менять -- не хочется.
--
wbr,
ReAl
Добавил в scmRTOS_defs.h проверку значения макроса и в OS_Target.h
всех портов условную компиляцию для TCritSect
Нужно еще одно сделать.
Если пользователь переопределяет TCritSect, то ему нужно отдать и это:
#define SYS_TIMER_CRIT_SECT() TCritSect cs
#define CONTEXT_SWITCH_HOOK_CRIT_SECT() TCritSect cs
так как они могут иметь разные крит. секции, по крайней мере теоретически.
Соответственно, в OS_Target.h нужно подвинуть эти два макроса ниже
определения TCritSect и там дать варианты по умолчанию.
#ifndef SYS_TIMER_CRIT_SECT
#define SYS_TIMER_CRIT_SECT() TCritSect cs
#endif
При необходимости пользователь заменит на TCritSect с нужным порогом.
Но сейчас сервер репозитория то
svn: Server sent unexpected return value (500 Internal Server Error)
то ещё что-то в этом духе выдаёт.
--
wbr,
ReAl