Atmel Studio Debugger에서 실제 값을 볼 수 있지만 버퍼에 액세스하면 항상 0을 반환합니다.

사 불라 니스

이것은 직접적인 답변이 없을 수도있는 정말 구체적인 질문이므로 어떤 아이디어라도 감사하겠습니다.

배경 : Atmel Studio에서 C를 사용하여 SAME70Q21 마이크로 프로세서 용 애플리케이션을 개발 중입니다. 응용 프로그램은 USB를 통해 호스트 PC와 데이터를 교환합니다. Atmel Studio와 함께 제공된 ASF 드라이버를 사용하여 공급 업체별 USB 장치를 빌드하고 WinUSB를 기반으로하는 사용자 지정 드라이버를 작성했습니다. 호스트에서 데이터 패킷을 수신하면 수신자 모듈은 DMA를 사용하여 수신 된 패킷을 수신자를 시작할 때 내 프로그램에서 지정한 버퍼에 복사합니다. 그 후 인터럽트가 호출됩니다. 이 인터럽트 내에서 프로그램은 버퍼에서 메시지 스택으로 메시지를 복사 한 다음 수신자를 다시 시작해야합니다.

문제점 : 이제 메시지가 수신 될 때마다 프로그램은 버퍼에 내용이없는 것처럼 작동합니다. 버퍼에서 메시지를 복사하면 0이 반환됩니다. 버퍼 (버퍼 [0] ++, 버퍼 [0] +4 등)와 상호 작용하면 버퍼 내의 주소 지정 값이 0으로 점프합니다.

Atmel Studio Debugger를 사용하여 프로그램을 시청했습니다. 버퍼에는 수신 된 메시지가 포함되어 있지만 분명히 마이크로 컨트롤러가 액세스 할 수 없습니다. 메시지는 메모리에서도 볼 수 있습니다 (그림 참조). 나는 또한 결과없이 포인터와 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"입니다.

사 불라 니스

해결책을 찾았습니다. 이것은 ARM-Type MCU에 대한 경험이 없기 때문에 실수였습니다. DMA가 USB 데이터를 RAM에 복사 한 후 프로세서의 캐시를 수동으로 새로 고쳐야합니다. DMA는 새로 고침 이벤트를 트리거하지 않습니다.

ASF를 사용하는 경우

SCB_InvalidateDCache_by_Addr (BULK_BUFER_ADRESS, BULK_BUFFER_SIZE);

MCU가 캐시 된 버전의 버퍼를 새로 고치도록합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관