dma가 데이터를 쓰는 메모리에서 읽는 것이 안전한지 궁금합니다.STM32 dma 대상 위치에 액세스
나는 adc 설정이있는 stm32F1을 사용하여 지속적으로 변환을 수행하고 dma를 사용하여 램 버퍼로 데이터를 전송합니다. adc 인터럽트를 사용하여 안전하게 버퍼에 액세스 할 수 있지만 비 인터럽트 컨텍스트에서 버퍼에 액세스하는 방법은 무엇입니까? dma가 쓴 동일한 위치에서 읽으려고하면 데이터가 손상 될 수 있습니까?
dma가 데이터를 쓰는 메모리에서 읽는 것이 안전한지 궁금합니다.STM32 dma 대상 위치에 액세스
나는 adc 설정이있는 stm32F1을 사용하여 지속적으로 변환을 수행하고 dma를 사용하여 램 버퍼로 데이터를 전송합니다. adc 인터럽트를 사용하여 안전하게 버퍼에 액세스 할 수 있지만 비 인터럽트 컨텍스트에서 버퍼에 액세스하는 방법은 무엇입니까? dma가 쓴 동일한 위치에서 읽으려고하면 데이터가 손상 될 수 있습니까?
데이터가 손상되지 않습니다.이 칩은 DMA 또는 CPU (코드)에 대한 버스 (RAM 메모리)에 대한 액세스를 허용하는 버스 조정자를 가지므로 각 트랜잭션 (RAM에 대한 단일 액세스 전체 변수에 대한 액세스)은 원자 적입니다.
RM0008 참조 설명서에서이 정보를 참조하십시오 :
3.1 시스템 아키텍처
을 ...
버스 매트릭스는
버스 매트릭스는 코어 시스템 버스 사이의 액세스 중재를 관리 및 DMA 마스터 버스. 중재는 Round Robin 알고리즘을 사용합니다. 연결 라인 장치에서 BusMatrix는 5 개의 마스터 (CPU DCode, 시스템 버스, 이더넷 DMA, DMA1 및 DMA2 버스)와 3 개의 슬레이브 (FLITF, SRAM 및 AHB2APB 브리지)로 구성된 입니다. 다른 장치에서 BusMatrix는 4 개의 마스터 (CPU DCode, 시스템 버스, DMA1 버스 및 DMA2 버스)와 4 개의 슬레이브 (FLITF, SRAM, FSMC 및 AHB2APB 브리지)로 구성됩니다. AHB 주변 장치는 BusMatrix를 통해 시스템 버스 에 연결되어 DMA 액세스를 허용합니다.
액세스 포인터 나 dma가 서로 통과하면 부실 데이터를 다시 읽거나 읽지 않은 데이터를 보게됩니다. 보통 사람들이하는 일은 dma가 다른 쪽을 채우는 동안 버퍼의 절반을 읽는 것입니다. –