포함
포함 관계는 어떤 객체가 다른 객체를 포함하고 있는 관계를 의미한다. 즉 객체를 멤버로 갖는 클래스이다. 이러한 객체 멤버들은 생성자 초기화 리스트에서 초기화 해야 한다. 소멸자는 객체를 포함하고 있는 객체의 소멸자부터 호출되고, 그 다음 멤버 객체들의 소멸자들이 호출된다.
Rect.h
Rect.cpp
main.cpp
ARM 인터럽트 실습
ARM에서는 각 장치별로 인터럽트 설정이 가능하다. 즉 PIO핀들에 설정 가능한 인터럽트 루틴은 하나다. 그러므로 이 인터럽트 루틴에서 어떤 핀이 인터럽트가 걸렸는지 판별하여 처리하도록 작성해야 한다.(Atmega128에서는 인터럽트로 이용 가능한 핀들이 미리 정해져 있고, 이 핀 마다 각기 인터럽트 루틴을 작성할 수 있다) 또한 ARM에서는 인터럽트 처리의 신뢰성을 위하여 인터럽트 상태를 확인 할 수 있도록 설계되었다. ARM에서는 인터럽트가 걸린 후 핀 상태를 확인함으로써 인터럽트가 초기화 되고 다시 사용가능하게 된다.
// 8번 핀으로 인터럽트를 입력받고, 인터럽트가 걸리면 4번핀에 연결된 LED가 한번 깜빡 거리는 코드이다. 인터럽트는 positive edge에서 발생하며, 인터럽트가 발생 했을 시 ledToggle 함수를 실행하게 된다. ledToggle 함수에서는 LED를 한번 깜빡 거리고, PIO_ISR 레지스터를 읽어서 인터럽트를 다시 사용할 수 있게 초기화 한다.
// 8번, 9번핀으로 인터럽트를 입력받아 각각 처리 해주는 예제이다. 8번핀에 인터럽트가 걸리면 0번부터 7번에 연결된 LED가 하나씩 켜지며, 반대로 9번핀에 인터럽트가 걸리면 하나씩 LED가 꺼진다. PIO_Ext01 함수에서 어느 핀의 인터럽트가 걸렸는지 판별하여 각각의 동작을 정의한다.
포함 관계는 어떤 객체가 다른 객체를 포함하고 있는 관계를 의미한다. 즉 객체를 멤버로 갖는 클래스이다. 이러한 객체 멤버들은 생성자 초기화 리스트에서 초기화 해야 한다. 소멸자는 객체를 포함하고 있는 객체의 소멸자부터 호출되고, 그 다음 멤버 객체들의 소멸자들이 호출된다.
Rect.h
#ifndef RECT_H
#define RECT_H
#include "Point.h"
class Rect
{
public:
// 생성자
Rect();
// 각 점의 값 지정/얻기
void SetTopLeft(const Point& topLeft);
void SetBottomRight(const Point& bottomRight);
void SetRect(int left, int top, int right, int bottom);
Point GetTopLeft() const;
Point GetBottomRight() const;
void GetRect(int& left, int& top, int& right, int& bottom);
// 넓이, 높이 계산
int GetWidth() const;
int GetHeight() const;
// 내
용 출력
void Print() const;
protected:
Point _topLeft;
Point _bottomRight;
};
#endif
Rect.cpp
#include "Rect.h"
#include <iostream>
using namespace std;
Rect::Rect()
{
}
void Rect::SetTopLeft(const Point& topLeft)
{
_topLeft = topLeft;
}
void Rect::SetBottomRight(const Point& bottomRight)
{
_bottomRight = bottomRight;
}
void Rect::SetRect(int left, int top, int right, int bottom)
{
_topLeft.SetX(left);
_topLeft.SetY(top);
_bottomRight.SetX(right);
_bottomRight.SetY(bottom);
}
Point Rect::GetTopLeft() const
{
return _topLeft;
}
Point Rect::GetBottomRight() const
{
return _bottomRight;
}
void Rect::GetRect(int& left, int& top, int& right, int& bottom)
{
left = _topLeft.GetX();
top = _topLeft.GetY();
right = _bottomRight.GetX();
bottom = _bottomRight.GetY();
}
int Rect::GetWidth() const
{
return (_bottomRight.GetX() - _topLeft.GetX() + 1);
}
int Rect::GetHeight() const
{
return (_bottomRight.GetY() - _topLeft.GetY() + 1);
}
void Rect::Print() const
{
cout << "{L=" << _topLeft.GetX() << ", T=" << _topLeft.GetY();
cout << ", R=" << _bottomRight.GetX() << ", B=" <<
_bottomRight.GetY() << "}\n";
}
main.cpp
#include "Rect.h"
#include <iostream>
using namespace std;
int main()
{
// Rect 객
체 생성
Rect rc1;
// 내용 출
력
rc1.Print();
cout << (*((int *)(&rc1)+1)) << endl;
// 값을 바꿔본다.
rc1.SetRect(10, 20, 30, 40);
// 내용 출력
rc1.Print();
// 값을 바꿔본다.
rc1.SetTopLeft(Point(20, 20));
// 내용 출력
rc1.Print();
cout << (*((int *)(&rc1)+1)) << endl;
cout << (*((int *)(&rc1)+2)) << endl;
cout << (*((int *)(&rc1)+3)) << endl;
// 넓
이, 높이 출력
cout << "rc1.GetWidth() = " << rc1.GetWidth() << endl;
cout << "rc1.GetHeight() = " << rc1.GetHeight() << endl;
cout << "rc1 size = " << sizeof(rc1) << endl;
return 0;
}
ARM 인터럽트 실습
ARM에서는 각 장치별로 인터럽트 설정이 가능하다. 즉 PIO핀들에 설정 가능한 인터럽트 루틴은 하나다. 그러므로 이 인터럽트 루틴에서 어떤 핀이 인터럽트가 걸렸는지 판별하여 처리하도록 작성해야 한다.(Atmega128에서는 인터럽트로 이용 가능한 핀들이 미리 정해져 있고, 이 핀 마다 각기 인터럽트 루틴을 작성할 수 있다) 또한 ARM에서는 인터럽트 처리의 신뢰성을 위하여 인터럽트 상태를 확인 할 수 있도록 설계되었다. ARM에서는 인터럽트가 걸린 후 핀 상태를 확인함으로써 인터럽트가 초기화 되고 다시 사용가능하게 된다.
//---------- 인터럽트 제어기 IO설정
#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120) // 인터럽트 허
용 레지스터
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124) // 인터럽트 금지 레지스터
#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128) // 인터럽트 클리어 레지스터
#define AIC_ISCR (*(volatile unsigned int *) 0xFFFFF12C) // 인터럽트 세트 레지스터
#define AIC_SMR ((volatile unsigned int *) 0xFFFFF000) // AIC 소스 모드 레지스터
#define AIC_SVR ((volatile unsigned int *) 0xFFFFF080) // AIC 소
스 벡터 레지스터
//---------- 입출
력 IO설정
#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460) // PIO Pull-Up Disable Register
#define PIO_PUER (*(volatile unsigned int *) 0xFFFFF464) // PIO Pull-Up Enable Register
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440) // PIO Interrupt Enable Register
#define PIO_IDR (*(volatile unsigned int *) 0xFFFFF444) // PIO Interrupt Disable Register
#define PIO_IMR (*(volatile unsigned int *) 0xFFFFF448) // PIO Interrupt Mask Register
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C) // PIO Interrupt Status Register
#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420) // PIO Glitch Input Filter Enable Register
#define PIO_IFDR (*(volatile unsigned int *) 0xFFFFF424) // PIO Glitch Input Filter Disable Register
#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음
#define PIO_OER (*(volatile unsigned int *) 0xFFFFF410) //출력 방향 설정
#define PIO_ODR (*(volatile unsigned int *) 0xFFFFF414) //출력 방향 설정
#define PIO_PER (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제
어 레지스터 병렬 입출력 포트로 사용한다.
//---------- 전
력 제어 설정
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define MASTERCLOCK 48000000
#define INTERR 0x00000100
#define LED 0x00000010
//--------- 전역 변수
void Delayms(unsigned int ms) //딜레이 함
수..
{
volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;
for(count = 0; count < countmax; count++);
}
void ledToggle()
{
unsigned int clear;
PIO_SODR = 0x00000010;
Delayms(500);
PIO_CODR = 0x00000010;
Delayms(500);
clear = PIO_ISR; // 인터럽트 초
기화를 위해 PIO_ISR 값을 읽음
}
int main(void)
{
// PMC setting
PMC_PCER = 0x00000004; // PMC_PCER = (unsigned int)1 << 2;
// PIO setting
PIO_PER = 0x00000110; // PIO_PER = 0x00000FFF;
PIO_IER = 0x00000100;
PIO_IFER = 0x00000100;
PIO_PUER = 0x00000100; // PIO_PUER = 1 << 8;
PIO_ODR = 0x100;
// PIO_ODR = 0x100;
PIO_OER = 0x00000010;
// AIC setting
AIC_IDCR = (unsigned int)1 << 2;
AIC_SMR[2] = 0x00000065;
AIC_SVR[2] = (unsigned int)ledToggle;
AIC_ICCR = 0x00000004;
AIC_IECR = 0x00000004; // AIC_IECR = (unsigned int)1 << 2;
while(1)
{
}
return 0;
} // End Main....
//---------- 인터럽트 제어기 IO설정
#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120) // 인터럽트 허
용 레지스터
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124) // 인터럽트 금지 레지스터
#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128) // 인터럽트 클리어 레지스터
#define AIC_ISCR (*(volatile unsigned int *) 0xFFFFF12C) // 인터럽트 세트 레지스터
#define AIC_SMR ((volatile unsigned int *) 0xFFFFF000) // AIC 소스 모드 레지스터
#define AIC_SVR ((volatile unsigned int *) 0xFFFFF080) // AIC 소
스 벡터 레지스터
//---------- 입출
력 IO설정
#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460) // PIO Pull-Up Disable Register
#define PIO_PUER (*(volatile unsigned int *) 0xFFFFF464) // PIO Pull-Up Enable Register
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440) // PIO Interrupt Enable Register
#define PIO_IDR (*(volatile unsigned int *) 0xFFFFF444) // PIO Interrupt Disable Register
#define PIO_IMR (*(volatile unsigned int *) 0xFFFFF448) // PIO Interrupt Mask Register
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C) // PIO Interrupt Status Register
#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420) // PIO Glitch Input Filter Enable Register
#define PIO_IFDR (*(volatile unsigned int *) 0xFFFFF424) // PIO Glitch Input Filter Disable Register
#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음
#define PIO_OER (*(volatile unsigned int *) 0xFFFFF410) //출력 방향 설정
#define PIO_ODR (*(volatile unsigned int *) 0xFFFFF414) //출력 방향 설정
#define PIO_PER (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제
어 레지스터 병렬 입출력 포트로 사용한다.
//---------- 전
력 제어 설정
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)
#define MASTERCLOCK 48000000
#define INTERR 0x00000100
#define LED 0x00000010
void PIO_Ext02(void);
void Delayms(unsigned int ms) //딜레이 함
수..
{
volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;
for(count = 0; count < countmax; count++);
}
void PIO_Ext01(void)
{
static unsigned int i=0;
unsigned int status;
status=PIO_ISR;
if(status == (unsigned int)0x00000100)
{
if(i==0)
i =1;
else if(i&0x80)
return;
else
i|=i<<1;
PIO_SODR=i;
}
else if(status ==(unsigned int)0x00000200)
{
if(i==0)
return;
else
i =i>>1;
PIO_CODR=0xFF;
PIO_SODR=i;
}
}
void PIO_Ext02(void)
{
unsigned int i;
for(i=1; i<=3; i++)
{
PIO_SODR=0x000000ff;
Delayms(300);
PIO_CODR=0x000000ff;
Delayms(300);
}
}
int main(void){
PMC_PCER = (unsigned int)1<<2;
PIO_PER = 0x00000FFF; //병렬 I/O포
트로 사용 설정 디폴트로 I/O포트로 사용 하도록 되어 있다.
PIO_PUER=0x300;
PIO_ODR = 0x300; //출력 버퍼 금지 레지스터 설정
Delayms(50);
PIO_OER = 0x00000FFF;
PIO_IFER=0x00000300; //글리치 필터 사용
PIO_IER=0x00000300; //인터럽트 인애이블 레지스터
AIC_IDCR=(unsigned int)1<<2; //마스크 설정
AIC_SVR[2]=(unsigned int)PIO_Ext01; //인터럼트 함수 설정
AIC_SMR[2]=5; //
AIC_ICCR=(unsigned int)1<<2; //
AIC_IECR=(unsigned int)1<<2; //마스크 해지
while(1);
return 0;
} // End Main....