Задачи в ESP32: рекомендации, а не мигающий пример
Я использую ESP8266 для устройств Интернета вещей.
Я хочу работать с ESP32 и пользоваться его преимуществами — для управления подключением WiFi и MQTT.
Большинство примеров задач очень простые и совершенно одинаковые (мигающие светодиоды). Но для приложения реального времени требуется больше данных, для которых я не могу найти руководство.
Например:
- когда использовать
core0
илиcore1
? - Как оценить размер стека, необходимый для задачи?
- Есть ли какие-либо ограничения для задачи? Является ли
mqtt.loop()
, например, ligit, мудрым с точки зрения памяти?
Я был бы рад прочитать о реальной реализации задач (особенно о том, что "можно" и "нельзя")
Пример использования из ESP32 DOCS
// Измеряет буфер, который создаваемая задача будет использовать в качестве своего стека.
// ПРИМЕЧАНИЕ. Это количество байтов, которое будет храниться в стеке, а не количество
// слова, найденные в vanilla FreeRTOS.
#define STACK_SIZE 200
// Структура, в которой будет храниться TCB создаваемой задачи.
StaticTask_t xTaskBuffer;
// Буфер, который создаваемая задача будет использовать в качестве своего стека. Обратите внимание, что это
// массив переменных StackType_t. Размер StackType_t зависит от
// порт ОСРВ.
StackType_t xStack[ STACK_SIZE ];
// Функция, реализующая создаваемую задачу.
void vTaskCode( void * pvParameters )
{
// Ожидается, что значение параметра равно 1, так как 1 передается в
// Значение pvParameters в вызове xTaskCreateStatic().
configASSERT( ( uint32_t ) pvParameters == 1UL );
for( ;; )
{
// Здесь находится код задачи.
}
}
// Функция, создающая задачу.
void vOtherFunction( void )
{
TaskHandle_t xHandle = NULL;
// Создаем задачу без использования динамического выделения памяти.
xHandle = xTaskCreateStatic(
vTaskCode, // Функция, реализующая задачу.
"NAME", // Текстовое название задачи.
STACK_SIZE, // Размер стека в байтах, а не в словах.
( void * ) 1, // Параметр передается в задачу.
tskIDLE_PRIORITY,// Приоритет создания задачи.
xStack, // Массив для использования в качестве стека задачи.
&xTaskBuffer ); // Переменная для хранения структуры данных задачи.
// puxStackBuffer и pxTaskBuffer не были NULL, поэтому задача будет иметь
// создан, а xHandle будет дескриптором задачи. Используйте ручку
// для приостановки задачи.
vTaskSuspend( xHandle );
}
@Guy . D, 👍0
1 ответ
в приложении реального времени требуется больше данных, для которых я не могу найти руководства
Это потому, что его нет. Требуемый объем памяти полностью определяется приложением и задачей, которую вы хотите запустить, поэтому никакие "руководства" могу сказать вам, что это будет.
Вам нужно будет проанализировать фактическое программное обеспечение, которое вы хотите запустить, чтобы увидеть, что оно делает и как оно работает, чтобы оценить вероятный размер необходимого стека (примечание: стек используется для локальных (нестатических) переменных, а также для хранения для регистров при вызове функций). Это полностью зависит от вас, чтобы решить это. Основное предположение (поскольку SDK предназначен для профессиональных пользователей, а не для любителей, как типичные пользователи Arduino) заключается в том, что вы знаете, что делает ваше программное обеспечение, поскольку вы пишете это программное обеспечение.
когда использовать core0 или core1?
Когда вам нужно сбалансировать вычислительную нагрузку. Опять же, это полностью зависит от вашего программного обеспечения и от того, как вам нужно, чтобы оно работало. Возможно, у вас есть одна задача, которая должна почти исключительно использовать ядро — в этом случае вы привязываете все, кроме этой задачи, к одному и тому же ядру и размещаете эту задачу на своем собственном ядре. Или, может быть, вы просто хотите равномерно распределить задачи. Это ваш выбор.
Есть ли какие-либо ограничения для задачи?
Да. Чип имеет только конечную память. Вы не можете дать задаче больше памяти, чем есть. Также имейте в виду, что за вашими задачами может следить сторожевой таймер, поэтому вы должны быть уверены, что «выгнали» его. регулярно и не блокировать слишком долго.
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Питание esp32cam от аккумулятора
- Контакты RX и TX на esp32
- ESP32: отключить детектор отключения питания