это действительно конкретный 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»