ARM2010. 6. 22. 16:38

다음은 ARM의 여러가지 동작모드 가운데 유저모드 FIQ모드 IRQ모드 3가지를 사용할 때 쓰이는 레지스터의

모습을 그림으로 나타낸 것 이다.

검은색 삼각형이 없는 레지스터는 모든 동작모드에서 구별하지 않고 동일하게 사용되는 범용 레지스터이다.

검은색 삼각형은 해당하는 모드에서 자신만이 쓰는 레지스터이다. 

여기서 FIQ모드가 IRQ보다 빠른 이유는 먼저 유저모드에서 IRQ로 모드가 변환될 때 IRQ의 값을 스택에 저장하게 된다.

여기서 자기만이 쓰는 레지스터(r13_irq,r14_irq)는 스택에 복사되지 않고 범용 레지스터 부분만 스택에 저장하게 되며

다시 유저모드로 돌아갈 때 r0 ~ r12까지의 값을 다시 가져오게 된다.

반면에 FIQ모드는 자기만이 쓰는 r8_fiq ~ r14_fiq는 스택에 저장하지 않고 r0 ~ r7만 스택에 저장하고 다시 모드가 변환

될 때 r0 ~ r7레지스터만 불러오기 때문에 상대적으로 12개의 레지스터를 저장하고 불러오는 IRQ모드보다 8개의

레지스터만 사용하는 FIQ모드가 보다 빠르다.


'ARM' 카테고리의 다른 글

ADS(ARM Developer Suite) 설정하기  (0) 2010.06.21
Posted by 해해해해해해해해
C++2010. 6. 22. 10:52

클래스를 헤더파일과 구현 파일에 나누어 담는 방법을 배워보자. 우선은 point 클래스의 최종 소스코드를 보자.

소스코드가 딱 봐도 복잡하기 때문에 나누어 담아주는 것이 좋다.

#include <iostream>
using namespace std;

class point
{
public:
  void print();

  point();
  point(int initialx, int initialy);
  point(const point& pt);

  void setx(int value)
  {
    if(value < 0)      x = 0;
    else if(value > 100)  x = 100;
    else          x = value;
  }

  void sety(int value)
  {
    if(value < 0)      y = 0;
    else if(value > 100)  y = 100;
    else          y = value;
  }
  int getx()  {return x;};
  int gety()  {return y;};

private:
  int x;
  int y;
};

point::point(const point& pt)
{
  x = pt.x;
  y = pt.y;
}
point::point(int initialx, int initialy)
{
  setx(initialx);
  sety(initialy);
}
point::point()
{
  x = 0;
  y = 0;
}
void point::print()
{
  cout<< "( " << x << ", " << y << ")\n";
}

int main()
{
  point pt(-50,200);

  pt.print();
  
  return 0;
}

위의 코드를 다음과 같이 3개의 파일로 나누어 작성해보자.

point.h - 클래스 정의 헤더파일

point.cpp - 클래스 멈버구현

main.cpp - main함수 구현

<point.h>

#ifndef POINT_H
#define POINT_H

class point
{
public:
  void print();
  
  point();
  point(int initialx, int initialy);
  point(const point& pt);
  
  void setx(int value)
  {
    if(value < 0)      x = 0;
    else if(value > 100)  x = 100;
    else          x = value;
  }
  
  void sety(int value)
  {
    if(value < 0)      y = 0;
    else if(value > 100)  y = 100;
    else          y = value;
  }
  int getx()  {return x;};
  int gety()  {return y;};
  
private:
  int x;
  int y;
};
#endif

<point.cpp>

#include "point.h"
#include <iostream>

using namespace std;

point::point(const point& pt)
{
  x = pt.x;
  y = pt.y;
}
point::point(int initialx, int initialy)
{
  setx(initialx);
  sety(initialy);
}
point::point()
{
  x = 0;
  y = 0;
}
void point::print()
{
  cout<< "( " << x << ", " << y << ")\n";
}

<main.c>

#include "point.h"

int main()
{
  point pt(-50,200);
  
  pt.print();
  
  return 0;
}

이렇게 나누면 다음과 훨씬 코드가 간결해져서 읽기가 편해진다.

파일을 나눌때 주의해야 할 점은 point.h파일에서와 같이 처음부분에 #ifndef POINT.H와 #define POINT.H 그리고 마지막줄에 #endif를 추가해줘야한다.

ifndef의 역할은 헤더파일이 겹치는 것을 막는 일종의 매크로이다. 




Posted by 해해해해해해해해
ARM2010. 6. 21. 17:01

1. [File] - [New]를 클릭하면 다음과 같은 화면이 나오는데 ARM Executable Image를 클릭한후 프로젝트 이름을 test로 입력한다. 경로는 아무곳이나 상관없다. 확인 클릭


2. 확인을 클릭하면 다음과 같은 화면이 나오는데 화면에 대고 우클릭하면 add files 와 create group 두가지가 나온다

먼저 create group을 클릭한 후  Cstartup이라는 부트코드 폴더를 만들고 부트코드를 추가한다.

3. 그럼 Cstartup이라는 부트코드를 담을 폴더가 생긴다 . 다시 이 폴더에 마우스 우클릭을 하면 add files와 creat group

그리고 delete가 뜬다. 그럼 add files를 클릭한 후 부트코드를 추가한다. 

4. 그리고 다음화면이 나오면 그냥 OK.

5. 다음과 같이 나오면 성공적으로 부트코드를 추가한 것이다.

6. 다시 다음화면에서 아무데나 우클릭하면 add files과 create group이 나오는데 create group을 클릭한후 source폴더를 만든다. source폴더에 우클릭하고 add files를 클릭한다.

7. 그리고 작성한 소스코드를 추가한다.

8. 그리고 main.c를 더블클릭한 후 [project] - [compile] 클릭 후 다시 [project] - [make]를 누르면 다음과 같이 

successful!!



'ARM' 카테고리의 다른 글

ARM-state general registers and program counter  (0) 2010.06.22
Posted by 해해해해해해해해