본문 바로가기

카테고리 없음

.lsl를 사용한 Memory Section 이동 예제 4

.lsl를 사용해서 함수나 변수의 메모리 section을 수정 할 수 있다.

이 작업은 Linking 단계에서 수행되기 때문에 Compile에러가 아닌 Linking에러가 발생한다.
비 의도적인 작업이 진행 되어도 알기 어렵고, 사용자 실수로 인한 의도치 않은 메모리 충돌이 발생할 수 있으므로 반드시 Memory Section 설계자와 의논하여 수정하는 것을 권장한다.

<소스코드>

char var;
char __private0 var0;
char __private1 var1;
char __private2 var2[10];


void func0(void){
	var = 10;
	var0 = var;
}
void func1(void){
	var1 = var;
}
void func2(void){
	var2[1] = var;
}

int main(void)
{

	func0();
	func1();
	func2();
	printf( "Hello world\n" );
}

초기 함수 주소 위치 확인(Map 파일)

1. func0주소를 0x80000024 주소에 위치(.lsl파일 수정)

section_layout mpe:vtc:linear
{
	group code (ordered, run_addr=0x80000024)
	{
		select ".text.TASKING_EDU.func0";
	}	
}

1.1 func0 주소가 0x80000024로 변경된 것을 확인

1.2 func0주소를 0x80000012 주소에 위치

void __at(0x80000012) func0(void){
	var = 10;
	var0 = var;
}

1.3 func0주소를 0x80000012 주소 확인

 

<기존 위치>

2. func1 함수를 RAM(pspr0)에서 동작
mem(메모리):mpe(모든 코어):pspr0(메모리 섹션)

section_layout mpe:vtc:linear
{


	group (run_addr=mem:mpe:pspr0, ordered, copy) 
	{
		select ".text.TASKING_EDU.func1";
	}	
	
}

2.1 func1 함수를 RAM(pspr0) 위치한 것을 확인

3. func2함수를 pflash1에 위치

section_layout mpe:vtc:linear
{

	group (run_addr=mem:mpe:pflash1, ordered) // 링커가 자동으로 주소를 매칭시켜주지만 ordered를 사용하면 개발자가 원하는 위치에 작업하라는 명령이다. 
	{
		select ".text.TASKING_EDU.func2";
	}
	
}

3.1 func2함수를 pflash1에 위치한 것을 확인

4. var1 변수를 DSPR0로 이동

기존 위치

.lsl 수정

section_layout mpe:vtc:abs18
{
	group (	run_addr=mem:mpe:dspr0, ordered)
	{
		select ".zbss.TASKING_EDU.var1";
	}
}

.lsl에 명시된 dspr0 주소번지
변경된 위치

Tasking에서도 UI로 확인 가능하다. '프로젝트명' > Preference > C/C++ Build > Memory

반응형
사업자 정보 표시
라울앤알바 | 장수호 | 서울특별시 관악구 봉천로 13나길 58-10, 404호(봉천동) | 사업자 등록번호 : 363-72-00290 | TEL : 010-5790-0933 | Mail : shjang@raulnalba.com | 통신판매신고번호 : 2020-서울관악-0892호 | 사이버몰의 이용약관 바로가기