Обработка задач в режиме отключения питания с помощью ОСРВ CMSIS

#c #embedded #rtos #cmsis

#c #встроенный #ОСРВ #cmsis

Вопрос:

Я работаю над устройством с батарейным питанием, которое имеет CMSIS RTOS v2 и STM32 F4, где устройство включается и выключается на основе прерывания кнопки. При получении прерывания GPIO устройство включается и выключается при других прерываниях. Наряду с этим у меня запущено 2 задачи: захват данных датчика и их обработка, а также другие, отправка данных по RF, если таковые имеются.

Все работает нормально, за исключением того, что я хочу остановить работу датчиков и радиочастотных устройств, поскольку устройство не должно работать, и для экономии заряда батареи, когда кнопка находится в выключенном состоянии.

Я могу определять включенное и выключенное состояние устройства, и перед переходом в выключенное состояние я отключаю сенсор и радиочастотные операции. Проблема в том, что задачи все еще выполняются.

Ниже приведена псевдо-реализация

 void SensorTask(void *argument)
{
    while (1)
    {
        if (device_state == DEVICE_ON)
        {
            // perform expected task
        }
    }
}

void RFTask(void *argument)
{
    while (1)
    {
        status = osMessageQueueGet(rfTaskQueueId, rf_task_msg, 0, osWaitForever);
        if (status == osOK)
        {
        }
    }
}

void enter_sleep_mode(void)
{
    // disable peripherals
    // configure wakeup interrupt
}
 

С вышеуказанной реализацией; задача датчика продолжает проверять состояние устройства, поскольку она использует код на основе опроса, а rftask ожидает отправки сообщения.
Я думаю, что сам этот процесс может истощить некоторое количество энергии, и может быть лучший способ реализовать это.

Является ли osThreadSuspend лучшим выбором здесь или есть какой-то другой способ реализовать это?

Комментарии:

1. Кнопка прерывания должна посылать сигнал (используя мьютекс, событие или очередь) задаче, чтобы разбудить ее. Таким образом, задача будет приостановлена, но это не сильно поможет с отключением питания, планировщик все еще работает. Для экономии энергии mcu должен перейти в один из режимов глубокого сна — Stop или Standby и выйти из него с помощью кнопки.