2012-12-07 2 views
3

누구나 다음 문제를 처리하는 방법을 알고 있습니까?
IAR Embedded Workbench가 있습니다. 이 프로젝트는 코드와 플래시 ROM을 실행하기 위해 SDRAM을 사용하고 있습니다. SDRAM 용 코드는 SD 카드에서로드됩니다. 그러나 SDRAM에는 전역 변수 또는 정적 변수와 같은 일부 데이터가 저장됩니다. 그들 중 일부는 초기화되어야합니다. 초기화 단계 인 iar_data_init3 함수 호출은 low_level_init 함수 뒤에옵니다. 따라서 문제는 SDRAM의 일부 변수를 초기화 할 때 이니셜 라이저 함수가 iar_data_init3에서 호출되며 그 코드는 SDRAM 내부에 있습니다. SD 카드에서 SDRAM 코드를로드하는 작업이 아직 완료되지 않았기 때문에 잘못되었습니다.IAR 이니셜 라이저 기능 배치

C/C++ 개발 안내서에 설명 된대로 수동 초기화를 시도했지만 도움이되지 않았습니다.

호출되는 함수는 변수의 초기화를 제공하는 __sti__routine입니다. 이 모든 기능은 IAR에 의해 생성됩니다. 링커에게 이니셜 라이저 기능을 플래시 ROM에 넣도록 지시 할 방법이 있습니까?

EDIT 1 : 여기 는 C/C에 대한 설명서 IAR ++ 정보이다. 수동 초기화를 사용하는 방법의 예입니다.

initialize manually { section MYSECTION }; 

그런 다음 IAR 설명서를 말한다 :

#pragma section = "MYSECTION" 
#pragma section = "MYSECTION_init" 
void DoInit() 
{ 
char * from = __section_begin("MYSECTION_init"); 
char * to = __section_begin("MYSECTION"); 
memcpy(to, from, __section_size("MYSECTION")); 
} 

나는 이해할 수 없다 :

당신은 섹션을 초기화하기 위해 소스 코드 예제를 사용할 수있는 링커 설정 파일에서

그러나 우선, MYSECTION_init와 MYSECTION의 차이점은 무엇입니까? 내가 전역 변수가있는 경우 끄트머리는 :

SomeClass myclass; 

그리고는 SDRAM에 배치해야합니다, 는 어떻게 초기화가 수행됩니다 무엇입니까? 수동으로 변수 을 초기화하고 플래시 ROM에 초기화 기능을 넣으려고합니다. (문제는 SDRAM에 변수를 배치함으로써 초기화 기능도 SDRAM에 배치된다는 것입니다).

답변

4

pragma 사전 처리기 지시문을 사용하여 변수와 함수의 위치를 ​​지정할 수 있습니다. 미리 정의 된 섹션 중 하나를 사용해야하거나 자신을 정의해야합니다.

사용중인 IAR의 특정 맛은 언급하지 않았습니다. 다음은 Renesas IAR Compiler Reference Guide에서 왔지만 올바른 참조 가이드를 확인하여 구문이 완전히 동일하고 사전 정의 된 섹션이 무엇인지 알아야합니다.

각 객체의 제어를 명시하지 않고,라는 세그먼트 를 함수 나 전역 변수 및 정적 그룹을 배치 @ #pragma 오퍼레이터 또는 위치 지시자를 사용한다. 변수는 __no_init 또는 const으로 선언 된 이어야합니다. 세그먼트는 예 : 의 경우 특정 메모리 영역에 배치하거나 초 기화하거나세그먼트 시작 및 끝 연산자를 사용하여 제어 된 방식으로 복사 할 수 있습니다. 예를 들어 응용 프로그램 프로젝트와 부트 로더 프로젝트와 같이 별도로 단위의 인터페이스를 연결하려는 경우에도 유용합니다. 개별 변수의 배치 에 대한 절대적인 제어가 필요하지 않거나 유용하지 않을 때 명명 된 세그먼트를 사용하십시오.

__code32 void f(void) @ "FUNCTIONS"; 

: 기본 세그먼트 할당을 무시하려면라는 이름의 세그먼트

void f(void) @ "FUNCTIONS"; 

void g(void) @ "FUNCTIONS" 
{ 
} 

#pragma location="FUNCTIONS" 
void h(void); 

에 기능을 배치하는

예를 들면, 당신은 명시 적으로 메모리가 기본 이외의 속성 를 지정할 수 있습니다 수정

주석에 따라 메모리 영역을 정의하는 generic_cortex.icf이라는 링커 파일이 있어야합니다. 그것은 다음과 다소 유사한 지시해야한다 년 :

/* Define the addressable memory */ 
define memory Mem with size = 4G; 

/* Define a region named SDCARD with start address 0xA0000000 and to be 256 Mbytes large */ 
define region SDCARD = Mem:[from 0xA0000000 size 0xFFFFFFF ]; 

/* Define a region named SDRAM with start address 0xB0000000 and to be 256 Mbytes large */ 
define region SDRAM = Mem:[from 0xB0000000 size 0xFFFFFFF ]; 

/* Place sections named MyCardStuff in the SDCARD region */ 
place in SDCARD {section MyCardStuff }; 

/* Place sections named MyRAMStuff in the SDRAM region */ 
place in SDRAM {section MyRAMStuff }; 

/* Override default copy initialization for named section */ 
initialize manually { section MyRAMStuff }; 

실제 이름, 주소, 크기는 다를 수 있지만 유사합니다. 난 그냥 datasheet에서 처음 두 동적 메모리 영역의 전체 크기를 사용하고 있습니다. 여기서 일어나는 일은 서로 다른 유형의 메모리 (예 : SD 카드 및 SDRAM)의 주소 공간에 이름을 할당하여 컴파일 중에 명명 된 섹션이 링커에 의해 올바른 위치에 배치되도록하는 것입니다. 가능한 주소 기억

define memory 지시어는 주어진 크기의 메모리 공간을 정의의

최대 크기, 가능한 최대 값 :

그래서 우선은 define memory와 주소 공간을 정의해야합니다 주소 가능한 메모리의 양. 은 필수적으로 사용할 수 없습니다.

그리고 칩이 define region와 함께 어디로 가야하는 그것을 말해 :

사용 가능한 물리적 메모리 define region 지시어는 사용 가능한 메모리에 영역을 정의

있는 응용 프로그램 코드의 섹션의 특정 섹션 애플리케이션 데이터를 배치 할 수 있습니다. 유사한 속성을 가진 지역

섹션의 place atplace into 지침 장소 세트를

배치 섹션 : 다음 링커가 이름 sectionplace in과를 배치하는 것을 region 알아야 할

이전에 정의 된 영역으로.

그리고 당신이 초기화가 initialize manually로의 일부를 대체하려면 링커에게 : 응용 프로그램을

지시어 initialize과 응용 프로그램이 시작되는 방법 do not initialize 컨트롤을 초기화

합니다. 이러한 지시문을 사용하면 응용 프로그램 은 시작할 때 전역 심볼을 초기화하고 코드 조각을 복사 할 수 있습니다.

마지막으로, C 파일에서 manually을 선언 어떤 섹션 및 초기화하는 방법 섹션으로가는 것을 컴파일러에게. 여러 다른 메모리 장치간에 시작 초기화를 정의하기 위해

SomeClass myClass @ "MyCardStuff"; 

#pragma section = "MyCardStuff" 
#pragma section = "MySDRAMStuff" 
void DoInit() 
{ 
    /* Copy your code and variables from your SD Card into SDRAM */ 
    char * from = __section_begin("MyCardStuff"); 
    char * to = __section_begin("MySDRAMStuff"); 
    memcpy(to, from, __section_size("MySDRAMStuff")); 

    /* Initialize your variables */ 
    myClass.init(); 
} 

, 당신은 매우 신중하게 IAR Development Guide for ARM을 연구해야합니다. 또한 --log initialization 옵션을 켜고 로그와 맵 파일을 연구하여 원하는 결과를 얻고 있는지 확인하십시오.

+0

위 예제에서 함수 을 다루고 있지만 처음부터 초기화해야하는 변수가있는 경우 위의 방법은 변수를 사용하여 변수를 배치하는 것이지만 초기화하는 함수는 어떻습니까? 변수? 초기화 함수를 어디에 둘 것인지를 제어하고 싶습니다. – maximus

+0

@maximus 필자가 인용 한 예제는 사용자가 질문 한 내용에 대한 것이기 때문에 특별히 함수에 대한 예입니다. 그러나 동일한 방법이 함수와 변수 모두에 적용됩니다. 링크 된 참조 가이드 또는 특정 칩에 적용 할 수있는 참조 가이드에서 "메모리의 데이터 및 기능 배치 제어"섹션을 참조하십시오. –

+0

설명서를 읽었습니다. 그리고 나는 그 질문을 갱신했다. 다시 참조 할 수 있습니까? – maximus