누구나 다음 문제를 처리하는 방법을 알고 있습니까?
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에 배치된다는 것입니다).
위 예제에서 함수 을 다루고 있지만 처음부터 초기화해야하는 변수가있는 경우 위의 방법은 변수를 사용하여 변수를 배치하는 것이지만 초기화하는 함수는 어떻습니까? 변수? 초기화 함수를 어디에 둘 것인지를 제어하고 싶습니다. – maximus
@maximus 필자가 인용 한 예제는 사용자가 질문 한 내용에 대한 것이기 때문에 특별히 함수에 대한 예입니다. 그러나 동일한 방법이 함수와 변수 모두에 적용됩니다. 링크 된 참조 가이드 또는 특정 칩에 적용 할 수있는 참조 가이드에서 "메모리의 데이터 및 기능 배치 제어"섹션을 참조하십시오. –
설명서를 읽었습니다. 그리고 나는 그 질문을 갱신했다. 다시 참조 할 수 있습니까? – maximus