시스템 소프트웨어-2
- 컴퓨터공학
- 2022. 9. 21. 06:00
마이크로프로세서는 주변장치를 단순 메모리로 인식한다.
(주변장치로부터 데이터를 받을 때는 마치 메모리에 읽거나 쓰는 것처럼 처리한다)
memory mapped I/O : 입출력 장치들이 사용하는 메모리가 따로 정해져 있지 않아 개발자가 직접 지정
I/O mapped I/O : 입출력 장치들이 사용하는 메모리가 미리 정해져있어서 지정된 메모리를 사용
입출력포트 : 외부에서 데이터가 입력되거나 외부로 데이터를 출력하는 과정을 중간에서 연결지어준다.
char *p = (char *)0x30000000; <1byte=8bit—8개의 핀을 사용할 수 있음>
/*메모리 3000_0000번지로부터 1바이트를 할당 받아서 지정된 포트를 사용할 수 있다. 여기는 LED연결*/
*p = 0; //레지스터 클리어, 모든 LED켜짐
*p |= 0x1<<6; //LED2만 끔 0x1000000 | or연산
PA가 사용하는 모든 메모리를 0으로 초기화한 꼴...LED가 사용하는 PA[7:5] 비트만 사용해야 한다. 다른 비트를 함께 수정하면 다른 장치들이 오작동하게 된다.
특정비트를 1로 설정하려면 지정된 위치의 비트를 1과 |(or)연산한다.
ex) 5번비트를 1로 설정 a |= 0x00100000; <=> a |= 0x1<<5;
ex) 5,3,2번비트를 1로 설정 a |= (0x1<<5)+(0x1<<3)+(0x1<<2); <=> a |= (0x1<<5)+(0x3<<2)
ex) 5,4,3번비트를 1로 설정 a |= (0x7<<3);
특정비트를 0으로 클리어하려면 지정된 위치의 비트를 0과 &(and)연산한다. 나머지는 1과 &시킨다.
ex) 0x1<<5 == 0x0010_0000
~(0x1<<5) == 0x1101_1111
ex) 2번 비트를 0으로 클리어 a &= ~(0x1<<2);
ex) 5,3,2번 비트를 클리어 a &= ~( (0x1<<5)+(0x3<<2) );
특정비트를 반전시키려면 비트를 1과 ^연산한다. (같으면 0, 다르면 1) 1^1=0, 0^1=1
ex) 5번 비트 반전 a ^= 0x1<<5;
ex) 5,3,2번 비트 반전 a ^=(0x1<<5)+(0x3<<2);
특정비트가 0인지 1인지 검사할 때: a & (0x1<<5) unsigned char a = 0xf0; //11110000 (2)
특정비트를 추출하고자 할 때: ex) [6:4] 비트만 추출 : b = (a>>4) & 0x7 /* 0000_0111 */
EX) 값을 무조건 4의 배수로 만들어야 한다.
start = 100;
scanf(“%d”,&x);
start += x;
start += 0x3; //더해서 4의 배수 이상으로 만들고
start &= ~(0x3); //마지막 2비트는 클리어로 내림
macro.h
//한 비트 클리어
#define clear_bit(data,loc) ((data) &= ~(0x1<<(loc)))
//연속된 비트 클리어
#define clear_bits(data,area,loc) ((data) &= -((area)<<(loc)))
//한 비트 설정
#define set_bit(data,loc) ((data) |= (0x1)<<(loc)))
//연속된 비트 설정
#define set_bits(data,area,loc) ((data) |= ((area)<<(loc)))
//한 비트 반전
#define invert_bit(data,loc) ((data) ^= (0x1<<(loc)))
//연속된 여러비트 반전
#define inver_bits(data,area,loc) ((data) ^= ((area)<<(loc)))
//비트 검사
#define check_bit(data,loc) ((data) & (0x1<<(loc)))
//비트 추출
#define extract_bits(data,area,loc) (((data)>>(loc)) & (area))
#include <stdio.h>
#include “macro.h”
void main(void) {
unsigned char a = 0xf0;
unsigned char b;
clear_bit(a,5); //5번 비트 클리어
clear_bits(a,0x7,3); //5,4,3번의 연속 3비트 클리어
set_bit(a,5); //5번 비트 설정
set_bits(a,0x7,3); //5,4,3번의 연속 3비트 설정
invert_bit(a,5); //5번 비트 반전
invert_bits(a,0x7,3); //5,4,3번 연속 3비트 반전
if (check_bit(a,5)) printf(“true“); //5번 비트가 어떤값인지 체크__1이면1반환 ,0이면 0반환
else printf(“false“); //1이면 true를 0이면 false를 출력
b=extract_bits(a,0x7,4); //6,5,4번 비트를 추출하여 b에 대입
}
%%함정%%
#define ADD(X) X+X
void main(void) { 출력해보면 0나온다. 왜?
int k; -5+5 로 인식한다
k= -ADD(5); 따라서 #define ADD(x) (X+X)로 수정
}
%%함정%%
#include <stdio.h>
#define SQUARE(X) (X*X) 49를 결과로 기대했지만 17이 출력! 왜?
a+5*a+5 로 인식.....괄호가 필요하다
void main(void) { #define SQUARE(X) ((X)*(X))로 수정
int a =2;
printf(“%d”, SQUARE(a+5));
}
'컴퓨터공학' 카테고리의 다른 글
시스템 소프트웨어-4 (1) | 2022.09.21 |
---|---|
시스템 소프트웨어-3 (1) | 2022.09.21 |
시스템 소프트웨어-1 (2) | 2022.09.21 |
IPv6 주소 할당 방식 (0) | 2021.06.18 |
라즈베리 파이 시작해보기 (3) | 2020.06.12 |
이 글을 공유하기