본문 바로가기
코스웨어/15년 스마트컨트롤러

20150414 -21번- 여지윤 - 인터럽트 / 구조체와 사용자 정의

by 알 수 없는 사용자 2015. 4. 14.
728x90
반응형

1~4교시

☆H/W★



● 인터럽트 방식으로 LED 순차적 활성화


- 어제는 LED 한개를 이용하여 불을 켰다면, 이번에는 하강엣지 트리거를 이용하여 스위치를 작동 시킬때마다 LED를 순차적으로 켜보기로 하였다.


□ Code




□ Result



- 위와 같은 결과가 나오게 된다.


5~8교시

★S/W☆


● 구조체 용량


-  어제 배운 구조체에서는 현재 배치되어 있는 구조체의 용량에 대해서 알아보았다.




-  구조체의 용량을 줄일수 있는 방법을 찾아보도록 하자.


 

- 위와 같이 봤을때 구조체의 자리만 바꿨을 뿐인데 용량이 줄어든것을 확인 할 수 있다.


- 즉 컴파일러는, 4byte로 제일 최적화가 잘 되어 있기때문에 맞춰서 표기를 시켜준다. 그러므로 24byte로 줄일수가 있었다.


- 하지만 원래 용량은 23byte인데 23byte로 나타내는 방법도 있다.



- pragma pack()을 사용하여 나타 낼 수도 있다.


- 여기서 pragma의 의미는 컴파일러에게 직접정으로 다음 명령을 세팅 하라는 의미를 부여한다.


- 그리고 뒤에 나오는 pack()은 사이즈를 측정하는것이며, pack(1)이라고 적게 되면, 현재 위치에서부터 다음 세팅을 하라고 명령할때까지 그 용량으로 초기화 시키는 것이다.


- 즉 #pragma pack(1)이라고 하면 1byte로 최적화 시켜라 라는 의미가 되므로 총 구조체 용량의 값은 23이 되는것이다.


- 하지만 제일 최적화 하기 좋은 용량은 4byte이므로 위의 예제에서와 같이 smart 와 smart1을 주로 사용하고, 정말 필요할 때에만 smart2번방식을 사용하도록 한다.


● 함수로의 구조체 변수 전달과 반환


□ 함수의 인자로 전달되고 return 문에 반환되는 구조체 변수


- 인자로 전달되는 변수의 값은 매개변수에 복사가 된다. 마찬가지로 함수의 인자로 구조체 변수가 전달 될 수 있으며, 이러한 인자를 전달받을 수 있도록 구조체 변수가 매개벼수의 선언으로 올 수 있다. 그리고 전달 되는 구조체 변수의 값은 매개 변수에 통째로 복사가 된다.


예제)


- 여기서 나오는 지역변수 cen 의 return 값들은 초기화가 된 후 레지스터에 저장이 된다.


- 인자를 Point구조체를 받아서 그대로 입력이 된다 (ShowPosition(curPos)) 


- 구조체를 많이 사용하게 되면 편하긴 하지만 용량을 많이 사용하게 되는 역효과가 나타나게 된다.


□ 구조체의 배열 복사



- 실행 결과는 인자의 전달과정에서, 그리고 값의 반환과정에서 구조체의 멤버로 선언된 배열도 통째로 복사됨을 보이고 있다.


- 이렇게 실행을 하게 되면 매우 큰 용량을 잡아먹고 속도가 줄어든다. 이것을 주소형식으로 바꾸면 용량도 줄어들며 속도도 빨라진다.


- 모든 방식을 주소로 바꾸어서 사용하였다


□ 구조체의 배열 복사와 대칭 이동



- 위 예제의 9행에 정의된 함수에서 보이는 바와 같이 구조체의 포인터 변수도 매개변수로 선언되어서 call by reference 형태의 함수호출을 구성할 수 있다.


□ 구조체 변수를 대상으로 가능한 연산



- 언뜻봐서는 구조체 변수를 대상으로 하여서 덧셈과 뺄셈을 하게 되면 컴파일러 에러가 난다.


- 이유는 구조체 안에는 배열이 존재 할 수도 있고 포인터 변수도 존재 할 수도 있다. 뿐만 아니라 다른 구조체 변수도 존재 할 수 있기때문이다.


- 구조체변수 대상의 덧셈과 뺄셈연산의 결과를 정형화 시키는데는 무리가 있다.



●  구조체의 유용함에 대한 논의와 중첩구조체


□ 중첩된 구조체의 정의와 변수 선언


- 배열이나 포인터 변수가 구조체 멤버로 선언될 수 있듯이, 구조체 변수도 구조체의 멤버로 선언 될 수 있다.


- 이것을 '구조체의 중첩' 이라고 한다.



- 위에서 본것과 같이 Point 가 위에 있을때 밑에 구조체 안에서 또다시 한번 쓸수가 있다. 만약 Point가 밑에 있었다면 컴파일 에러가 났을 것이다.


- 그리고 Circle 안 c1에서 중괄호를 치면 xpos , ypos 관계없이 그대로 나열이 되며, c2에서 중괄호가 없으면 순서대로 나열된다.


- main 함수안의 Circle을 풀어서 사용이 가능하다.


- 위와 같은 방식으로 나열해서 표기도 가능하다.


● 공용체의 정의와 의미 (Union Type)


□ 구조체와 공용체의 비교



- 위에서 컴파일을 시켜본 결과가가 각각 나온다.


- 처음 struct 구조체를 이용하여 값을 구했을때에는 각각의 변수에 맞게 방을 형성하여 값을 구했다.


- 하지만 union 공용체를 사용했을때에는 제일 큰 변수 방 하나에 몰아서 넣은 값이 나오게 된다.


- 공용체는 그렇게 주로 사용하는것은 아니지만, 정말 필요할때에 쓰인다.


- 다음 예제는 처음 men 1의 값이 20인걸 알수 있다. 하지만 men3이 실수를 저장하기때문에 앞에 있는 수들은 전부 실수로 저장 해버렸다.


- 그렇기때문에 men1 과 2의 값은 알 수 없는 값이 나오게 된다.


- 하지만 3번은 실수 그대로를 저장하였으므로 그대로 7.15가 나오게 된다.


□ 공용체의 유용함은 다양한 접근방식을 제공


- 결과적으로 공용체는 하나의 메모리 공간을 둘 이상의 방식으로 접근 할 수 있다.




● 열거형의 정의와 의미 (Enumerated Type)


- 열거형이라는것도 구조체나 공용체와 마찬가지로 자료형을 정의하는 방법으로 사용이 된다. 따라서 열거형 기반의 자료형 정의방법은 구조체 및 공용체와 유사하고 정의된 열거형 기반의 변수선언 방법은 구조체 및 공용체와 완전히 동일하다.



- 그리고 case 문에 쓰인 Do, Re, Mi ... 들을 숫자 1 ~7 까지 바꿔주어도 컴파일러에는 변함이 없다. 이유는 열거형 상수들은 int형으로 표현되는 상수 이기때문이다.


- 따라서 int형 데이터가 올 수 있는 위치에는 열거형 상수 가 올 수 있다.



- enum을 조금더 자세하게 알아보기 위해서는 enum의 열거형 구조체를 만든다.


- 위의 예제를 확인해보면 Zero 값에 초기화를 시킬 수 있다. 즉, 열거형 구조체는 #define을 해놓은것과 같은 이치가 성립이 된다.


- 또한 똑같은 숫자만 나열을 할수 있는것이 아니라 중간에 값을 바꿀수도 있다.


- 메인함수 안에서는 smart e1을 넣어도 되며, e1이 int형이므로 int e1으로 해도 컴파일은 문제 없이 성립이 된다.


- printf 내에서도 아까 말했듯이 #define과 같은 의미이기 때문에 enum에 선언된 열거형 상수 값을 그대로 집어 넣어도 값은 나온다.




★ 오늘 하루 수고 하셨습니다☆

728x90