시스템 소프트웨어-3
- 컴퓨터공학
- 2022. 9. 21. 12:00
십진수 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);
} //간단하게 매크로 사용
중간에 포인터를 둔다는 것은 메모리에 값을 읽거나 쓸 때 한 단계 더 거치는 것으로 속도 효율성이 떨어진다.
#왼쪽의 코드에서 *p를 PA로 바꿔서 작성할수 있다.
#코드 줄이기 : 왼쪽 코드는 십진수 값을 이용하여 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 |
이 글을 공유하기