포함
포함 관계는 어떤 객체가 다른 객체를 포함하고 있는 관계를 의미한다. 즉 객체를 멤버로 갖는 클래스이다. 이러한 객체 멤버들은 생성자 초기화 리스트에서 초기화 해야 한다. 소멸자는 객체를 포함하고 있는 객체의 소멸자부터 호출되고, 그 다음 멤버 객체들의 소멸자들이 호출된다.

 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(10203040);

  // 내용 출력
  rc1.Print();
  
  // 값을 바꿔본다.
  rc1.SetTopLeft(Point(2020));

  // 내용 출력
  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....
// 8번 핀으로 인터럽트를 입력받고, 인터럽트가 걸리면 4번핀에 연결된 LED가 한번 깜빡 거리는 코드이다. 인터럽트는 positive edge에서 발생하며, 인터럽트가 발생 했을 시 ledToggle 함수를 실행하게 된다. ledToggle 함수에서는 LED를 한번 깜빡 거리고, PIO_ISR 레지스터를 읽어서 인터럽트를 다시 사용할 수 있게 초기화 한다.

//---------- 인터럽트 제어기 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....
// 8번, 9번핀으로 인터럽트를 입력받아 각각 처리 해주는 예제이다. 8번핀에 인터럽트가 걸리면 0번부터 7번에 연결된 LED가 하나씩 켜지며, 반대로 9번핀에 인터럽트가 걸리면 하나씩 LED가 꺼진다. PIO_Ext01 함수에서 어느 핀의 인터럽트가 걸렸는지 판별하여 각각의 동작을 정의한다.



+ Recent posts