본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP] 업무일지 - 김기찬 - 20100615

by 알 수 없는 사용자 2010. 6. 15.
728x90
반응형
오전수업

 오전에는 class 에 대해서 배웠다. class 는 구조체와 유사한 개념이다. class 가 구조체와 다른점은 구조체는 멤버로 변수만 오지만 class 의 경우에는 멤버로 함수도 쓸 수 있다는 점이다.

class 를 사용하는 간단한 예제이다. 먼저 class 를 정의해 준다. 위의 코드에서 class 의 이름은 Point 이고 멤버로는 int x, int y 그리고 함수 Printf 가 있다. class 내부의 public 은 class 에 대한 접근을 제어 하는 것으로 public 이 들어가 있으면 외부에서 접근할 수 있다.
 예제를 해본 결과 class를 사용하는 방법은 구조체를 사용하는 방법과 거의 똑같았다. class의 객체를 선언하는 것도 구조체 변수를 선언하는 것과 같고 class 내부의 멤버에 접근하는 것도 구조체와 똑같은 연산자를 사용했다.

class 함수는 class 외부에서 정의 할 수 도 있다. 원래 함수가 그렇듯이 class 내부에 함수의 기본형만 작성하고 class 외부에서 함수의 몸체를 정의해도 된다.

 class 를 사용하여 객체를 선언하게 되면 가장 먼저 생성자 함수가 호출되게 된다. 책에서는 "생성자 함수는 class 사용을 준비하는 함수다." 라고 되어 있었는데 정확한 의미는 아직 이해하지 못했다. 생성자 함수는 많은 정의하기에 따라 많은 기능을 할 수 있는데 오늘 배운것은 생성자 함수를 이용해 class 내부의 변수를 초기화 하는 것이다.
 생성자 함수는 class 와 이름이 똑같고 반환타입이 없다.

 그 전에 class 내부의 함수도 오버로딩과 디폴트 인자를 사용 할 수 있다. 그리고 객체도 구조체 변수와 마찬가지로 같은 형태일 경우 복사나 대입이 가능하다.
 위의 코드를 살펴보면 class Point 내부에 생성자 함수가 오버로딩 되어있다. 첫번째 생성자 함수는 레퍼런스로 인자로 받는다. 두번째 생성자 함수는 인자를 받지 않고, 세번째 생성자 함수는 int형 인자 2개를 받는다. 그리고 메인 함수에서 객체로 pt1, pt2, pt3 를 선언했다. 그리고 pt1 과 pt2는 선언과 동시에 상수 2개를 넣어서 세번째 생성자 함수로 초기화 했다.
 그리고 pt3는 pt1 을 레퍼런스로 받아서 첫번째 생성자 함수로 초기화 했다. 그렇게 출력한 결과는 pt3 에 pt1이 복사된 결과가 나왔다. 이렇게 초기화 할 때 다른 객체를 복사하여 초기화 하는 것을 복사 생성자 라고 한다. 그리고 pt3 에 pt2를 대입해서 출력했지만 생성자는 객체가 선언될때 한번만 한번만 동작 하므로 이것은 복사생성자가 아니라 단순 대입이 된다.

다음으로 과제코드 4개를 작성했다.
첫번째 과제는 3자리 정수를 입력 받아서 각 자리의 숫자의 합을 더하는 코드이다. 변수를 5개를 선언해서 첫번째 변수는 숫자를 입력받는 변수로 사용했다. 그리고 두번째, 세번째, 네번째 변수에 각각 백의 자리수, 십의 자리수, 일의 자리수가 들어가게 작성하고 마지막 변수에 변수를 더한 값을 대입하여 출력했다. 코드를 작성하는 것 보다는 각 자리의 숫자를 구해내는 방법을 생각하는게 어려운 문제였다.

두번째 코드는 10진수의 값을 8진수로 나타내는 것이다. 대신 cout에 oct를 사용하지 않고 10진수와 8진수 사이의 대응관계를 넣어서 출력하도록 작성한 코드이다. 8진수의 경우 0 ~ 7까지이고 8이되면 자리수가 1자리 올라가게 된다. 이 관계를 이용해 8진수를 출력하되 10진수를 8로 나눈 몫에 10을 곱해서 출력하는 변수에 더해서 출력했다.

세번째 코드는 0 ~ 255 사이의 숫자를 입력하고 입력한 숫자의 각 bit가 1일 경우에는 1을 0일 경우에는 0을 출력하는 코드이다. 숫자를 입력받도록 변수 1개를 선언하고 초기값이 1인 변수를 하나 선언한다. 숫자1의 경우는 진수와 상관없이 다 똑같고 메모리에는 "0000 0001" 로 저장되게 된다. 입력한 숫자 역시 2진수 형태로 저장된다. 그 다음에 입력된 변수와 1을 AND 연산하게 되면 입력된 숫자의 오른쪽 끝의 bit가 1이면 1이 되고 0이면 1이된다. 그리고 "0000 0001"을 쉬프트 연산으로 왼쪽으로 1칸씩 밀어주면서 AND 연산을 반복하면 각 bit 의 값이 1인지 0인지 알 수 있다. 끝으로 이렇게 알게 된 값을 출력해주기만 하면 된다.

마지막 코드는 rand() 함수를 이용해서 주사위 값이 나오게 하는 코드이다. rand() 함수는 난수를 만드는 함수 이지만 이것역시 일정한 변수와 일정한 규칙으로 동작하기 때문에 반복해도 같은 값이 나오게 된다. 이것을 해결하기 위해 srand()를 사용했다. srand() 와 rand()의 관계를 정확히는 모르지만 srand()가 rand() 함수의 변수를 설정하는 역활을 하는 것이라고 한다. 그래서 (srand(unsigned)time(NULL)) 을 사용하면 현재의 시간을 변수로 돌려주기 때문에 계속해서 rand() 가 계속해서 다른 값을 뽑아내게 된다.
그렇게 뽑아낸 함수에 %6의 연산을 하고 +1 을 해서 출력한다. %7 이 아니라 %6 + 1을 하는 이유는 0을 없애고 6까지 출력하기 위함이다.

오후수업

오후에는 ATMega 128의 스펙을 보면서 I/O 레지스터에 대해서 배웠고 그것을 통해서 DDR 과 PORT, 그리고 PIN에 대한 내나름대로의 개념을 잡을 수 있었다.

그 다음 DK128의 FND에 출력하는 예제 코드를 작성하고 3개의 과제를 수행했다.
이 코드는 예제 코드로서 unsigned char 형 변수 i 와 a 를 선언했다. 그리고 i = 0 으로 초기화 하고 a는 눌린 스위치를 정수값을 받도록 했다. 그 다음에 반복문으로 a가 1보다 작을 때까지 2로 계속 나누었고 한번 나눌때 마다 i가 1씩 증가하도록 했다. 그리고  while 문이 끝나면 i값이 PORTF 를 통해 FND로 출력되고 다시 초기화하여 반복되도록 작성했다. 
그 결과 첫번째 스위치를 누르면 FND에 1이 출력되고 두번째를 누르면 2 ... 마지막 스위치를 누르면 8이 출력되었다.

첫번재 과제 코드이다. 이것은 실습 코드를 약간 수정해서 스위치를 누르면 FND 2개에 같은 숫자가 나오도록 한 것이다. 먼저 예제 코드에 변수 하나를 더 선언한다. 새로 선언한 변수 j에 i<<4 값을 넣는다. 그리고 출력은 j 와 i를 더한값을 출력하게 했다. PORT 출력 8bit 중에서 앞의 4bit 는 왼쪽 FND, 뒤의 4bit는 오른쪽 FND 에 출력된다. 따라서 각각 4bit 가 같은 값을 가지게 되면 양쪽 FND에 똑같은 숫자가 출력되게 된다.

두번째 과제는  0 ~ 99까지 FND 로 카운트 되게 하는 코드이다. 변수 i 와 j 를 선언한다. 변수 i는 일단위 출력으로 오른쪽 FND 출력이고, j는 십단위 출력으로 왼쪽 FND 출력이다. 그다음 출력을 PORTF = i + (j<<4) 로 한다. 그리고 i를 0 ~ 9 까지 증가하게 하고 10이 되면 j 를 1증가 시키고 0으로 초기화 되도록 한다. 그리고 j 역시 증가하다가 10이 되면 다시 0으로 초기화되도록 작성했다.  
 
마지막 코드는 3번째 코드에서 아주 간단한 부분을 추가한 것이다. 맨 마지막에 딜레이 주기 전에 조건문을 주어서 어떤 것이든 스위치가 눌러지게 되면 FND가 "00" 으로 초기화 되도록 작성해 주었다.

728x90