Как использовать прерывание и не получить его случайное возникновение, проблема с реализацией кольцевого буфера - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь использовать прерывание DMA, чтобы указать, что новые данные доступны из интерфейса DCMI, который подключен к камере.

Содержимое буфера DMA (изображение) затем используется в главном цикле для отправки данных изображения на дисплей. Запись и передача на дисплей происходит довольно медленно, поэтому бывает, что новое изображение готово, когда старое изображение не полностью записано на дисплей, а запись изображений перекрывается.

Я читал о производителе-потребителе / ​​очереди буфера / циклическом буфере, но не уверен, что понимаю, как это реализовать.

Одна из моих проблем, почему я не могу реализовать буферную очередь (с головой и хвостом), заключается в том, что DMA записывает весь массив данных в массив, а не каждый пиксель может отслеживаться при записи. С другой стороны, изображение (сохраненное в массиве) читается попиксельно.

Вот пример кода:

void DMA_IRQ(void)
{
    if (DMA_Full && DMA_Enabled)
    {
        DMA->CLEARFLAG = CLEAR; //Clear Interrupt Flag

        //Now in the Background the variable
        //dma_frame_buffer is filled with read data of the DMA

        //DMA Indicator
        dma_frame_read = 1;
    }
}

По моему главное выглядит примерно так:

int main (void)
{
    if(dma_frame_read == 1)
    {
    for(int pixel_counter=0; pixel_counter<253; pixel_counter++)
    {
          ILI9341_Color_Send(dma_frame_buffer[pixel_counter]);
      dma_frame_read = 0;
    }
}
...