Я планирую использовать плату STM32 для отправки CAN-кадров. Я реализовал простой планировщик, который содержит 10 задач: одна задача будет отвечать за отправку фреймов.Планирование передачи кадров в RTOS
Чтобы сделать работу я объявленную структуру для CAN кадра:
typedef struct
{
unsigned int id;
unsigned char data[];
unsigned char dlc;
unsigned int timeOfSend //This is the time in ms in which a frame should be sent
}tFrame;
А потом я объявленную таблицу кадров для отправки
aubFrames[MAX_FRAMES] = {
{0x12, 0xAABBCC, 4, 100},
{0x12, 0xAABBCC, 4, 1000},
{0x12, 0xAABBCC, 4, 2000},
{0x12, 0xAABBCC, 4, 2010}
};
Это сказать совет, чтобы отправить первый кадр после 100 мс, второй после 1000 мс и т. д.
Что я на самом деле делаю:
Я добавил новую задачу в планировщик с периодом 10 мс. Эта задача проверит таблицу aubFrames, и если пришло время отправить фрейм, он отправит соответствующий фрейм, иначе ничего не будет сделано. Проблема с этим решением заключается в том, что существует большая потеря времени. Например, чтобы отправить первый кадр, планировщик получит доступ к этой задаче девять раз, но ничего не делать.
Есть ли другое решение, чтобы планирование было более эффективным?
Я думал использовать прерывание по таймеру, но я не думаю, что это хорошее решение, поскольку на плате есть только четыре таймера, а количество кадров - больше четырех, поэтому, на мой взгляд, настройка таймеров для генерации прерывания для разных периодов времени не будут работать.
Какие RTOS вы используете? – kkrambo
Имея больше кадров, чем таймеры, не имеет значения. Один таймер может выполнить эту работу. Установите таймер для первого кадра, когда он срабатывает, сбросьте его для второго кадра и так далее. Не уверен, что так у вас уже есть настройка, но (на всякий случай у вас нет) обычно проще использовать «дифференциальные» времена, а не абсолютные. Таким образом, вместо каждого кадра, имеющего точное время с msec с начала (100, 1000, 2000, 2010), используйте «дифференциальное» время от предыдущего или «сейчас» в терминах процедуры обслуживания таймера. Пример: 100, 900, 1000, 10. Делает работу проще и текущая запись дает следующий раз. – tonypdmtr
@kkrambo Я разработал ОС самостоятельно, у вас есть какие-либо предложения об операционной системе, которые могут быть полезны для меня – fedi