Пробую использовать в проекте на msp430 scmRTOS.
Возник вопрос.
Использую событие TEventFlag, проверяю установленно или нет, ну и далее там.
======== Пример ==============
Код
extern OS::TEventFlag g_SF_Initialization;
OS_PROCESS void TTaskZonesDetection::Exec()
{
// ждем пока наш модуль не будет сконфигурирован
if( !g_SF_Initialization.IsSignaled() )
{
g_SF_Initialization.Wait();
}
OS_PROCESS void TTaskZonesDetection::Exec()
{
// ждем пока наш модуль не будет сконфигурирован
if( !g_SF_Initialization.IsSignaled() )
{
g_SF_Initialization.Wait();
}
============================
Функция g_SF_Initialization.IsSignaled() всегда возвращает "false", даже если событие установлено.
Немного проясняет листинг, сперва идёт сравнение, потом восстанавливается регистр SR, где флаги после сравнения.
Естественно флаги портятся, и команда JEQ выполняется как душе угодно.
======== Листинг ==============
Код
26 OS_PROCESS void TTaskZonesDetection::Exec()
\ __code __task void OS::process<OS::pr4, (word)56U>::Exec()
\ ??Exec:
27 {
\ 000000 2183 SUB.W #0x2, SP
28 // ждем пока наш модуль не будет сконфигурирован
29 if( !g_SF_Initialization.IsSignaled() )
\ 000002 81420000 MOV.W SR, 0x0(SP)
\ 000006 32C2 DINT
\ 000008 0343 NOP
\ 00000A D293.... CMP.B #0x1, &g_SF_Initialization + 2
\ 00000E 2241 MOV.W 0x0(SP), SR
\ 000010 0524 JEQ ??Exec_3
30 {
31 g_SF_Initialization.Wait();
\ 000012 0E43 MOV.W #0x0, R14
\ 000014 3C40.... MOV.W #g_SF_Initialization, R12
\ 000018 B012.... CALL #??Wait
32 }
\ __code __task void OS::process<OS::pr4, (word)56U>::Exec()
\ ??Exec:
27 {
\ 000000 2183 SUB.W #0x2, SP
28 // ждем пока наш модуль не будет сконфигурирован
29 if( !g_SF_Initialization.IsSignaled() )
\ 000002 81420000 MOV.W SR, 0x0(SP)
\ 000006 32C2 DINT
\ 000008 0343 NOP
\ 00000A D293.... CMP.B #0x1, &g_SF_Initialization + 2
\ 00000E 2241 MOV.W 0x0(SP), SR
\ 000010 0524 JEQ ??Exec_3
30 {
31 g_SF_Initialization.Wait();
\ 000012 0E43 MOV.W #0x0, R14
\ 000014 3C40.... MOV.W #g_SF_Initialization, R12
\ 000018 B012.... CALL #??Wait
32 }
==========================================
IAR пробовал и 3.41 и 4.20.1 - ведут себя одинаково.
Только если выключить всю оптимизацию, в листинге будет правильно работающий код,
но тогда scmRTOS не работает, нужны inline - функции.
Как заставить компилятор генерить работоспособный код?
Или что-то я не понимаю?