.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";
}
}
Tasking에서도 UI로 확인 가능하다. '프로젝트명' > Preference > C/C++ Build > Memory
반응형