Download presentation
Presentation is loading. Please wait.
1
임베디드 시스템을 위한 C프로그래밍 기법 3.7 ~ 4.5 장 Raphael
2
목차 3.7 리얼타임 운영체제 4. 임베디드 프로그램의 관용구 비트제어 버퍼제어 메모리 배치 포트로의 액세스
3
리얼타임 운영체제 임베디드 소프트웨어 산업 실태조사(일본) 추천 도서 전체 시스템 중 75% 이상이 특정 운영체제 사용
절반 이상이 리얼타임 운영체제 사용 추천 도서 임베디드 소프트웨어 엔지니어를 마스터하자 리얼타임 운영체제와 임베디드 기술의 기초(TECH I vol.17) 책 315 쪽 참조
4
리얼타임 운영체제 운영체제를 사용하는 장점(운영체제의 역할) 멀티태스킹(병행 처리)를 쉽게 실현할 수 있다.
재사용성의 향상이 기대된다. 멀티태스킹을 실현할 수 있다는 점에서 단순한 기능을 가진 태스크의 집합으로 구현할 수 있기 때문 운영체제는 하드웨어를 추상화한다.
5
리얼타임 운영체제 운영체제를 사용하는 단점 CPU 오버헤드가 발생한다. 메모리 풋프린터가 소비된다. 비용이 발생한다.
구매비용, 런타임 라이선스 비용, 유지보수 비용 등 시스템에 블랙박스 부분이 생기게 된다.
6
비트제어 MSB(Most Significant Bit) LSB(Least Significant Bit)
7
비트제어 논리곱(AND) 특정 비트를 마스킹 또는 제로 클리어 특정 비트가 0인지, 1인지 체크 특정 비트만 클리어
/* 0x02 == */ Ex1) data = cdata & 0xFF00; Ex2) if(cdata & 0x02){ ; } Ex3) cdata &= (~0x02);
8
비트제어 논리합(OR) 특정 비트만 1로 만든다 Ex1) cdata |= 0x02; Ex2) 비트필드 사용
9
비트제어 배타적 논리합(EX-OR) 특정 비트의 반전 체크 변수의 값을 0/1 토글
Ex1) if(cdata ^ cdata_save) & 0x02){ ; } Ex2) cdata ^= 1;
10
비트제어 비트 시프트 2의 거듭제곱의 곱셈 2의 거듭제곱의 나눗셈 정수 데이터를 1비트 왼쪽으로 이동시키면 2배(2^1)
정수 데이터를 2비트 왼쪽으로 이동시키면 4배(2^2) 2의 거듭제곱의 나눗셈 정수 데이터를 오른쪽으로 이동(시프트)
11
비트제어 비트 시프트 (Cont.) 부동 소수점 데이터의 경우 내부 표현 형식 때문에 ‘시프트=2의 곱셈/나눗셈’이 안됨
부호 있는(signed) 정수형의 시프트에서는 부호비트의 움직임 주의
12
버퍼제어 사이클링 버퍼 버퍼의 마지막 다음이 버퍼의 선두가 되는 버퍼 통신버퍼, 기록버퍼(Log) 등에 자주 사용
13
버퍼제어 사이클링 버퍼 (Cont.) 버퍼의 크기를 2의 거듭제곱의 크기로 하면 첨자(포인터)의 처리가 간단함
2의 거듭제곱이 아닌 경우 오버플로우를 처리하기 위해 반드시 if문을 처리해야 함 Ex) #define BUFSIZE (1024) unsigned char buff[BUFSIZE], cval; short int bufpnt=0; buff[bufpnt++] = cval; bufpnt &= (BUFSIZE-1);
14
버퍼제어 캐스트로 버퍼의 초기화를 고속화 1바이트 정수 배열을 4바이트 정수 배열로 캐스트 하여 초기화 하면 처리량 ¼
단, 배열이 워드 얼라인먼트가 확립되어 있지 않은 어드레스에 배치된 경우 정상적으로 동작하지 않는 경우가 있음 Ex) #define BUFSIZE (1024) signed char buff[BUFSIZE]; short int i; long int *p; p = (long int *)buff; for(i=0; i<BUFSIZE/sizeof(long int)); i++) { *p++ = 0; }
15
메모리 배치 워드 얼라인먼트 변수를 워드 크기의 정수배 어드레스에 배치
배열이나 구조체의 크기가 CPU 처리 단위 보다 작을 경우 사용 union을 사용하여 강제로 배치 할 수 있음 배열의 전체 크기는 얼라인먼트에 사용하는 변수보다 크게 설정 Ex) union name { char id[10]; long int dummy; }
16
포트로의 액세스 포트 입출력 Ex) /* 어드레스 0xff00의 8비트 폭의 포트 */
unsigned char cdata, *p_port; p_port = (volatile unsigned char *)0xff00; cdata = *p_port; // 읽기 *p_port = cdata; // 쓰기
17
Q&A 감사합니다.
Similar presentations