2017-01-10 7 views
0

저는 zynq 장치를 사용하여 독립 실행 형 프로그램 (OS없이)에서 DRAM의 데이터를 ARM의 주변 장치로 전송하려고합니다. 예제 코드에서이 코드는 트랜잭션의 소스 주소와 대상 주소를 선언하는 코드입니다.임베디드 암 프로세서의 특정 물리적 메모리에서 메모리 조각을 어떻게 할당합니까?

volatile static u8 SrcBuffer[BUFFER_BYTESIZE] __attribute__ ((aligned (64))); 
volatile static u8 DestBuffer[BUFFER_BYTESIZE] __attribute__ ((aligned (64))); 

OS가 없으므로 주소의 가치는 무엇입니까? 어떻게 변경할 수 있습니까? 이미로 다른 물건이있을 것이다 링커 파일에서

__attribute__ ((section ("your_section")))

(:

+2

RAM의 특정 영역을 특별한 용도로 사용하려면 예약하기 위해 링커 스크립트를 설정하는 것이 좋습니다 그 지역은 다른 용도로 사용되지 않습니다. 그런 다음 간단히 메모리 시작 포인터를 사용하십시오. –

+0

예를 들어 DMA를 사용 했습니까? – Lundin

+0

예, DMA를 사용합니다. srcBuffer 및 DestBuffer는 DMA 트랜잭션을위한 것입니다. –

답변

3

당신은 링커 파일의 섹션 A를 정의한 다음 (GCC를 위해)를 사용하여 그 안에 데이터를 배치해야 추천 웰) 일 : 정보의 단편을 보면

MEMORY 
{ 
    ....will be other stuff here 
    .... 
    YOUR_MEMORY_NAME : ORIGIN = 0xWhatever, Length = a_length // Creates a memory region 
} 

SECTIONS 
{ 
    ... 
    ... 

    .something_data : 
    { 
     *(your_data) 
    } > YOUR_MEMORY_NAME 

    ... 

} 
+0

그것이 작동합니다! 고맙습니다! –

+0

일부 니트. 나는 "your_data"와 "your_section"이 같은 단어 일 필요가 있다고 생각합니까? 또한 누군가가'YOUR_MEMORY_NAME'에 다른 섹션을 잠재적으로 추가 할 수 있기 때문에'.something_data'를 64 바이트 정렬하는 것이 좋습니다. 링커가 이러한 작업을 수행하는 데 더 좋은 도구라는 데 동의하지만 OP가 해결 된 방법을 알지 못합니다. 어쩌면 그는 메모리에 대한 컴파일 시간 주소를 원할 것입니까? –

+0

"your_data"가 정확하고 "your_section"은 같은 단어 여야합니다. 아마 정렬도 현명합니다. –

0

는 코드 및 상기 마이크로 컨트롤러의 주변의 특정 하드웨어 버퍼 레지스터에 DRAM에서 DMA를하고있는 것 같다 제공.

하드웨어 주변기기 레지스터 주소가 SBUF 또는 I2C_DATA_REG 또는 이와 유사한 코드로 사용되어야합니다. 두 버퍼의 주소를 알고 싶다면 두 어레이의 주소를 볼 수있는 디버거가 필요하거나 UART가 작동 중이면 콘솔에서 인쇄 할 수 있습니다. 두 버퍼의 메모리를 수정하려면 @Realtime Rik이 제안한 것을 따라야합니다.