Доступ к буферу всегда возвращает 0, хотя фактическое значение отображается в Atmel Studio Debugger. - PullRequest
2 голосов
/ 21 апреля 2020

это действительно конкретный c вопрос, который может не иметь прямого ответа, поэтому любая идея приветствуется.

Справочная информация: Я разрабатываю приложение для микропроцессора SAME70Q21 с использованием C в Атмел Студио. Приложение обменивается данными через USB с хостом P C. Я использовал драйверы ASF, поставляемые с Atmel Studio, для создания USB-устройства c, определяемого поставщиком, и написал собственный драйвер на основе WinUSB. При получении пакета данных от хоста модуль приемника копирует полученный пакет, используя DMA, в буфер, который указан моей программой при запуске приемника. После этого вызывается прерывание. Внутри этого прерывания моя программа должна скопировать сообщение из буфера в стек сообщений, а затем перезапустить приемник.

Проблема: Теперь, когда получено сообщение, программа действует так, как если бы в буфере нет содержимого. Копирование сообщения из буфера возвращает нули. Взаимодействие с буфером (buffer [0] ++, buffer [0] +4 и т. Д.) Приводит к тому, что адресное значение внутри буфера переходит на 0.

Я наблюдал за программой, используя отладчик Atmel Studio , Буфер содержит полученное сообщение, но, видимо, микроконтроллер не может получить к нему доступ. Сообщение также отображается в памяти (см. Рисунок). Я также попытался напрямую обработать адрес буфера с помощью указателей и memcpy без какого-либо результата. Когда я изменяю одно значение в буфере с помощью отладчика, весь буфер становится доступным, но только до получения следующего сообщения.

Код обработчика прерываний:

void main_vendor_bulk_out_received(udd_ep_status_t status,
    iram_size_t nb_transfered, udd_ep_id_t ep)
{
    UNUSED(ep);
    if (UDD_EP_TRANSFER_OK != status) {
        return; // Error in USB module, abort without restarting the receiver
    }

    //signal main loop that a message has been received
    bulk_rx_received = true; 

    //this was a test, copy first value from the buffer bulk_rx_buf to a local var, this always returns 0
    uint8_t x = bulk_rx_buf[0];

    //this is supposed to copy the data to the message stack, but the copy will always contain only zeroes
    memcpy(message_stack[message_stack_pointer], bulk_rx_buf, BULK_BUFFER_SIZE);
    message_stack_pointer++;
    if(message_stack_pointer == 32){
        message_stack_pointer = 0;
    }

    //restart the USB endpoint service, contains pointer to buffer, its size, pointer to callback
    udi_vendor_bulk_out_run(bulk_rx_buf, BULK_BUFFER_SIZE, main_vendor_bulk_out_received);
}

Изображение средства просмотра памяти, полученное сообщение «RUNA»

1 Ответ

1 голос
/ 23 апреля 2020

Я нашел решение: Видимо, буфер все еще заблокирован DMA в точке, где вызывается прерывание. Поэтому полученное сообщение не может быть обработано внутри прерывания. Решение состоит в том, чтобы использовать прерывание только для переключения используемого буфера, а затем прочитать сообщение в главном l oop после того, как новый буфер был передан USB-приемнику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...