Я некоторое время думал о своем дизайне, но не мог найти лучшего способа справиться с переполнением буфера при множественных прерываниях.
Чип 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-карту?
dsPIC33EP предоставляет интерфейс DMA для UART (см. главу 8 таблицы данных ). Если вы настроите буфер, достаточно большой для 20 мс данных, вы можете настроить DMA для записи в этот буфер, а затем читать результаты между обновлениями экрана. Обратите внимание, что:
В качестве альтернативы вы можете выполнить фактическое чтение буфера в прерывании (вместо опроса флага). Однако в большинстве случаев это плохая идея по нескольким причинам:
Короче говоря, DMA создан для описанной вами ситуации. Обычно это болезненный процесс настройки и отладки нескольких передач DMA, но он позволяет чистое обновление дисплея из-за более длительных операций чтения и записи без вмешательства ЦП.
Тимтяньянг
Скотт Уиндер