반응형

시스템 소프트웨어-4

728x90
반응형

dead code 제거 : 도달되지 않는 코드, 컴파일러 입장에서 불필요한 코드라고 판단되는 코드는 삭제해버린다.

 

<volatile> : 휘발성의, 변덕스러운, 순간적인

변수의 값은 현재 프로그램 내에서 뿐만 아니라 다른 프로세스나 하드웨어에 의해서 변할 수도 있다. 이러한 경우, 현재 프로그램 내에서는 이 변수의 값이 전혀 변하지 않는 것처럼 보인다. 컴파일러 눈에는 현재 프로그램 소스만 보이기 때문에 변수가 다른 요소에 의해서 변한다는 것을 이해할 수 없다. 그러므로 최적화를 수행하면 메모리로부터 새로운 값을 읽어오지 않고, 기존의 초기 값으로 프로그램을 수행시킨다.

 

#define TEMP       (*(unsigned int *)0x001)
 		     	   //온도센서가 사용할 주소

void main(void) {
    int a[10],i,j;
    TEMP=0x0;	   //온도 데이터 초기화
    for (i-0;i<10;i++) {
        a[i]=TEMP; //센서에서 읽어온 데이터 저장
        for(j=0;j<100000;j++); //delay
	}

    for(i=0;i<10;i++)
        print(“a[%d] = %d \t ” , i, a[i]); 
}

 

프로그램 실행 결과

0 0 0 0 0 0 0 0 0 0

 

why? TEMP 값은 초기화 이후 코드 내에서 값이 변하는 부분이 없다 따라서 컴파일러는 a[i]=TEMP; 지우고 0(초기값)으로 집어 넣었기 때문이다.

 

%%보통 프로그램 실행시 속도를 위해 데이터를 메모리에서 직접 읽어오지 않고 캐시에서 읽어오는데, 하드웨어에 의해서 변경되는 값들은 캐시에 바로 반영되지 않는다. 그러므로 데이터를 캐시가 아닌 메모리에서 직접 읽어오도록 구현해야 한다. volatile의 기능적 의미는

no-cache 이므로 하드웨어가 사용하는 메모리는

volatile 로 선언해야 변경된 값들이 제대로 반영된다.

volatileno-cache 외에 컴파일러 최적화가 임의로 코드를 변경하는 것을 막을 수 있다. 그래서 volatile 로 선언된 변수가 사용된 부분은 최적화에서 제외된다.

 

 

#define TEMP       (*(volatile unsigned int *)0x001)
 		     		//온도센서가 사용할 주소
void main(void) {
    int a[10],i;
    volatile int j;
    TEMP=0x0;		//온도 데이터 초기화
    for (i-0;i<10;i++) {
        a[i]=TEMP; //센서에서 읽어온 데이터 저장
        for(j=0;j<100000;j++); //delay
    }
    
    for(i=0;i<10;i++)
        print(“a[%d] = %d \t ” , i, a[i]); 
 }

%인터럽트에 의한 변수 변경

*인터럽트 형태 : 등록된 하드웨어에서 이벤트가 발생하면 하드웨어적으로 해당 인터럽트 서비스 루틴을 호출해주므로, 이벤트의 발생 여부를 수시로 검사할 필요없다.

하지만 인터럽트 서비스 루틴이 하드웨어적으로 호출되므로 컴파일러는 서비스루틴이 코드에서는 호출되지 않으므로 불필요한 코드로 판단하고 최적화시 해당 코드를 제거해버린다. -> 최적화가 아닌 먹통이 된다.

 

int time;
void interrupt_handler(void) {
	time++;
}

void main(void) {
	time = 0;
	while(1) {
		if((time%0) == 0 && time != 0)
			beep();
	}
}

이 코드는 타이머가 1초마다 인터럽트를 발생시키고 프로세서는 이에 대한 응답으로 핸들러를 실행시킨다. 그래서 10초마다 비프음을 내게 한다.

 

하지만 코드 상으로만 본다면 beep() 함수는 절대 호출될 것 같아보이지 않는다. time 값이 0으로 초기화 된 이 후에 변경하는 코드가 안 보이기 때문이다, 그래서 최적화 시, 컴파일러는 필요없는 코드라고 보고 빼려고한다

 

volatile int time ; // 단 한줄의 수정으로 정상작동함.

 

728x90
반응형

'컴퓨터공학' 카테고리의 다른 글

시스템 소프트웨어-3  (1) 2022.09.21
시스템 소프트웨어-2  (0) 2022.09.21
시스템 소프트웨어-1  (2) 2022.09.21
IPv6 주소 할당 방식  (0) 2021.06.18
라즈베리 파이 시작해보기  (3) 2020.06.12

댓글

Designed by JB FACTORY