반응형

시스템 소프트웨어-2

마이크로프로세서는 주변장치를 단순 메모리로 인식한다.

(주변장치로부터 데이터를 받을 때는 마치 메모리에 읽거나 쓰는 것처럼 처리한다)

 

memory mapped I/O : 입출력 장치들이 사용하는 메모리가 따로 정해져 있지 않아 개발자가 직접 지정

I/O mapped I/O : 입출력 장치들이 사용하는 메모리가 미리 정해져있어서 지정된 메모리를 사용

입출력포트 : 외부에서 데이터가 입력되거나 외부로 데이터를 출력하는 과정을 중간에서 연결지어준다.

 

LED1  제어시  PA0포트에 접근, PA0가 사용하는 메모리PA[7]에 데이터 쓴다

 

 

 

char *p = (char *)0x30000000; <1byte=8bit8개의 핀을 사용할 수 있음>

/*메모리 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이면 true0이면 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

댓글

Designed by JB FACTORY