Обработка нескольких прерываний dsPIC

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

Чип dsPIC33EP подключен к TFT-дисплею, датчику UART, карте micro-SD и камере UART. Скорость датчика UART составляет 921600 бод , а камеры (50k на фото) — 57600 бод . Время записи сектора SD-карты (512 байт) составляет чуть меньше 2 мс. Экран (EVE FT800) обновляется за 20 мс .

Цель состоит в том, чтобы реагировать на датчик UART (минимум каждые 30 мс) и соответствующим образом обновлять экран (обновлять метки) и в то же время записывать изображения на SD-карту.

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

Процедура прерывания:

volatile unsigned char buff[512];
volatile unsigned int ptr=0;
volatile unsigned char EOF=0;
volatile unsigned char buffReady=0;
void ISR(){
    static unsigned char temp;
    temp=UART_Read();
    buff[ptr++]=temp;
    if(ptr==512){ptr=0;buffReady=1;}
    if(...){EOF=1;}
}

Пока программа зациклена на проверке флага EOF

while(1){
   if(buffReady){SD_Write_Sector(buff);buffReady=0;}//write 512 bytes of image to SD card
   if(EOF){break;}//jump out if the image has been finished
}

Меня беспокоит, как мне включить процедуры для обновления экрана при получении данных от датчика UART? Похоже, флаг buffReady нужно проверять постоянно. Любая задержка между каждой проверкой может привести к потере пары байтов, поскольку они перезаписываются новыми байтами.

Поскольку размер изображения составляет около 50 КБ, а скорость составляет 57600 бод, каждую миллисекунду с камеры будет поступать шесть байтов. Если на экране появится задержка в 20 мс , изображение обязательно будет повреждено.

Я думал об использовании большего буфера для хранения изображений, но больший буфер требует больше времени для записи на SD-карту.

Как организовать экран обновления и записать образ на SD-карту?

Ответы (1)

dsPIC33EP предоставляет интерфейс DMA для UART (см. главу 8 таблицы данных ). Если вы настроите буфер, достаточно большой для 20 мс данных, вы можете настроить DMA для записи в этот буфер, а затем читать результаты между обновлениями экрана. Обратите внимание, что:

57 , 600   б п с 0,02   с е с "=" 1152   б я т с "=" 144   б у т е с
Если вы используете SPI для записи на SD-карту, DMA также может использоваться там, чтобы ограничить нагрузку на ЦП во время больших операций записи (драйвер может уже иметь встроенную поддержку DMA).

В качестве альтернативы вы можете выполнить фактическое чтение буфера в прерывании (вместо опроса флага). Однако в большинстве случаев это плохая идея по нескольким причинам:

  • В прерывания следует помещать как можно меньше кода, чтобы уменьшить задержку системы;
  • Это зависит от метода, используемого для управления дисплеем, но вполне вероятно, что прерывания чтения, полученные во время обновления экрана, приведут к визуальным сбоям;
  • Вызовы функций из прерываний редко бывают хорошей идеей — они обычно увеличивают объем кода до и после прерывания, написанного компилятором (для экономии регистров и т. д.), и создают возможности для взаимоблокировок, которые были бы более очевидны для встроенного кода. .

Короче говоря, DMA создан для описанной вами ситуации. Обычно это болезненный процесс настройки и отладки нескольких передач DMA, но он позволяет чистое обновление дисплея из-за более длительных операций чтения и записи без вмешательства ЦП.

Спасибо за предложение. Раньше я думал о DMA, но драйвер SD-карты его не поддерживает. Я все еще тестирую его, используя правильное прерывание и буфер большего размера. Если это не сработает, я думаю, добавление еще одного чипа является окончательным решением.
Если у вас есть исходный код драйвера SD-карты, вы можете изменить его, чтобы использовать DMA для записи. Это, вероятно, будет проще, чем добавить еще один микро в дизайн. Часто причина, по которой DMA не поддерживается драйвером, заключается в том, что он создает потенциальные конфликты с другими вариантами использования DMA в системе, но, поскольку вы являетесь владельцем системы, это не проблема.