ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
8 октября
1606878 Топик полностью
Argon (Сегодня, 08:38, просмотров: 63)
В нюансах scmRTOS кто-нибудь шарит? Не удается въехать, почему не передается тело OS::message между процессами. Т.е. событие send передается, но на приемной строне в "теле" сообщения - мусор. 

Сейчас для отладки просто пытаюсь тупо передать раз в 500мс без всякой лишней логики.

struct UiMsg 
{ UiEvent event; 
int16_t value; // для энкодера — количество шагов, для кнопки — код
};

Собственно сообщение:

OS::message<UiMsg> ui_msg;

Отправка из процесса 1 раз в 500мс:

        for (;;)
        {
            // process_encoders();
            // process_encoder_buttons();
            // scan_matrix();
            // Период опроса 5–10 мс
            //        OS::sleep(5);          // или sleep_ms(5) в зависимости от вашей версии scmRTOS
            OS::sleep(500);
            send_event(UiEvent::Enc1BtnDown, 0);
        }


static void send_event(UiEvent ev, int16_t val = 0)
{
     UiMsg m{ev, val};
     ui_msg = m;
     ui_msg.send();
}

Прием в процессе 2:

        for (;;)
        {
            if (ui_msg.wait())
            {                    
                UiMsg m;                       //Вот здесь структура данных ui_msg уже содержит мусор
                ui_msg.out(m);
                switch (m.event)
                {
} }

По отладчику вижу, что данные в ui_msg в порядке до самого конца, то бишь окончания ожидания события ui_msg.wait(), которое наступает регулярно и своевременно. Как только случилось - мусор!
ИЧСХ, дебаг даже по недрам scmRTOS пока не выявил ничего подозрительного.
Боюсь, что внезапно заработает, а я не пойму причину.

p.s. размер стеков обоих процессов 1000 байт, по-моему, с запасом.