반응형

시스템 소프트웨어-3

십진수 3 = 011 (2) 
->LED2,3의 불이 켜지도록 한다.
해당 포트에 0을 쓰면 ON, 1을 주면 OFF

char *p = (char *)0x30000000;

void init(void);
void display(int digit);

void main(void) {
    int I,j;
    init();
    while(1) {
        for(i=0;i<8;i++) {
            display();
            for(j=0;j<100000;j++);
        }
	}
}

void init(void) 
{	
	*p |= (0x7<<5);
}
//메모리(PA[7:5]를 1로 설정하여 LED모두 끈다.

void display(int digit) {
    init();
    switch(digit) {
        case 1: // 001 = LED3번 켠다
            *p &= ~(0x1<<5);//PA[5]를 0 클리어
            break;
        case 2: // 010 = LED2번 켠다
            *p &= ~(0x2<<5);//PA[6]를 0 클리어
            break;
        case 3: // 011 = LED1번 켠다
            *p &= ~(0x3<<5);//PA[7]를 0 클리어
            break;
        case 4: // 100 = 2,3번 켠다
            *p &= ~(0x1<<7);//PA[6:5] 0 클리어
            break;
        case 5: // 101 = 1,3번 켠다
            *p &= ~(0x5<<5);//PA[7],PA[5]
            break;
        case 6 // 110 = 1,2번 켠다
            *p &= ~(0x3<<6);//PA[7:6] 클리어
            break;
        case 7 // 111 = 1,2,3번 켠다
            *p &= ~(0x7<<5);//PA[7:5] 클리어
            break;	
 	}
}

메모리 직접 접근으로 포인터가 없이 메모리 접근가능.

 

0x30000000 = 100 ; //상수에 상수대입 오류남

 

*(*)0x30000000 = 100;

괄호: 포인터로 타입캐스팅-> 주소라는 표시

바깥 * : 레퍼런스-> 값을 나타냄

 

100을 메모리 주소에 저장하려면 할당받을 메모리의 크기가 지정되어 있어야 한다.

*(int *) 0x30000000 = 100;

 

주로 데이터 값들은 양수로 표현되므로

*(unsigned int *) 0x30000000 = 100;

 

*(volatile unsigned int *) 0x30000000 = 100;

 

#define PA (*(volatile unsigned char*) 0x30000000)

void init(void) {
	PA |= (0x7<<5); 
} //간단하게 매크로 사용

 

중간에 포인터를 둔다는 것은 메모리에 값을 읽거나 쓸 때 한 단계 더 거치는 것으로 속도 효율성이 떨어진다.

#왼쪽의 코드에서 *pPA로 바꿔서 작성할수 있다.

 

#코드 줄이기 : 왼쪽 코드는 십진수 값을 이용하여 1~7까지 7가지를 구현했지만 이진수 값을 이용하면 3비트만 검사하므로 구현해야 할 경우가 3가지로 감소

 

void display(int digit) {
	//들어온 이진수의 1의 자리가 1이면 LED3 ON
	(digit & 0x1) ? (PA &= ~(0x1<<5)) : (PA |= (0x1<<5));
 		비트검사         1이면 ON	     	 0이면 OFF

	//들어온 이진수의 10의 자리가 1이면 LED2 ON
	(digit & 0x2) ? (PA &= ~(0x1<<6)) : (PA |= (0x1<<6));
		비트검사         1이면 ON	     	 0이면 OFF
        
	//들어온 이진수의 100의 자리가 1이면 LED1 ON
	(digit & 0x4) ? (PA &= ~(0x1<<7)) : (PA |= (0x1<<7));
  		비트검사         1이면 ON	         0이면 OFF
}

 

매크로를 이용하여 다시 한번 수정

#define clear_bit(data, loc)    ((data)&=(0x1<<(loc)))
#define set_bit(data, loc)       ((data)|=(0x1<<(loc)))
#define check_bit(data, loc)     ((data)&(0x1<<(loc)))

void display(void) {

    check_bit(digit,0) ?  clear_bit(PA,5) : set_bit(PA,5);
    check_bit(digit,1) ?  clear_bit(PA,6) : set_bit(PA,6);
    check_bit(digit,2) ?  clear_bit(PA,7) : set_bit(PA,7);
}

 

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

시스템 소프트웨어-4  (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