ARM 7S 256 메모리 구조
Internal Memories (256MB) : 메모리 영역 (Code/Data 영역)
Undefinde(Abort) (3584MB) : 회로가 없어서 사용하지 못한다. (확장가능)
Internal Peripherals (256MB) : CPU 영역
Flash before Remap & SRAM after Remap : 이 영역은 실제로 메모리가 존재하지 않지만 플래시 메모리 또는 SRAM이 이곳으로 맵핑되어 메모리가 존재하는 것처럼 동작하는 영역이다.
PMC(Power Management Controller) : 전력관리 제어기
TC : Timer Count
PIO (병렬 입출력 제어기)
PIO_PUER : PIO Pull-Up Enable Register
PIO_PUSR : PIO Pull-Up Status Register
PIO_PUDR : PIO Pull-Up Disable Register
PIO_ASR : PIO Peripheral A Select Register
PIO_BSR : PIO Peripheral B Select Register
PIO_BSR : PIO Peripheral AB Select Register
PIO_OER : PIO Output Enable Register
PIO_OSR : PIO Output Status Register
PIO_ODR : PIO Output Disable Register
PIO_PER : PIO PIO Enable Register
PIO_PSR : PIO PIO Status Register
PIO_PDR : PIO PIO Disable Register
PIO_SODR : PIO Set Output Data Register
PIO_CODR : PIO Clear Output Data Register
PIO_ODSR : PIO Output Data Status Register
* PIO는 32비트의 병렬 입출력 비트를 제어한다. 각 비트의 신호선은 범용의 병렬 I/O 포트 PA31 ~ PA0으로 사용될 수도 있고, Peripheral A 또는 주변장치 관련 신호선으로 다중송신 되어 사용될 수도 있다.
* PMC에서 PIO에 클록을 공급해야만 동작하므로 PMC_PCER 레지스터를 사용하여 클럭을 공급하도록 설정한다.
* 1개의 라이트 명령으로 32비트를 동시시켜 출력할 수 있다.
WINAPI
1.TextOut
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //메시지처리 함수
HINSTANCE g_hInst;
LPCSTR lpszClass = TEXT("Text Out");
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
while(GetMessage(&Message, NULL, 0, 0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(iMessage)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 70, 40, "Beautiful Korea", 15);
EndPaint(hWnd, &ps);
return 0;
}
return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}
TextOut(hdc, 70, 40, "Beautiful Korea", 15);
이 호출문을 말로써 풀어본다면 "Beautiful Korea"라는 15자 길이의 문자열을 (70, 40) 좌표에 출력하되 출력에 필요한 기타 정보들은 모두 hdc에서 지정하는 정보를 사용하라는 뜻이다. hdc의 정보를 변경하면 문자의 모양이나 크기, 색상, 정렬 상태, 좌표 해석 방법 등의 여러가지 변형을 줄 수 있다.
<결과>
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
SetTextAlign(hdc, TA_CENTER);
MyTextOut(hdc, 100, 40, TEXT("beautiful Korea"));
MyTextOut(hdc, 100, 60, TEXT("is My"));
MyTextOut(hdc, 100, 80, TEXT("Lovely Home Country"));
EndPaint(hWnd, &ps);
return 0;
UINT SetTextAlign(HDC hdc,UINT fMode);
첫번째 인수로 DC의 핸들 즉, hdc을 받아 들이고 있다. 두번째 인수 fMode가 지정하는 정렬 정보에 따라 hdc의 정렬 상태를 변경하게 되며 이후부터 hdc를 참조하여 출력되는 모든 문자열은 이 함수가 지정한 정렬 상태를 따르게 된다. fMode의 값은 다음과 같으며 두 개 이상의 플레그를 OR로 연결하여 사용한다.
값
설명
TA_TOP
지정한 좌표가 상단좌표가 된다.
TA_BOTTOM
지정한 좌표가 하단 좌표가 된다.
TA_CENTER
지정한 좌표가 수평 중앙 좌표가 된다.
TA_LEFT
지정한 좌표가 수평 왼쪽 좌표가 된다.
TA_RIGHT
지정한 좌표가 수평 오른쪽 좌표가 된다.
TA_UPDATECP
지정한 좌표대신 CP를 사용하며 문자열 출력후에CP를 변경한다.
TA_NOUPDATACP
CP를 사용하지 않고 지정한 좌표를 사용하며 CP를 변경하지 않는다.
디폴트 정렬 상태는 TA_TOP | TA_LEFT로 되어 있으며 지정한 좌표를 좌상단으로 하여 문자열이 출력된다. 물론 정렬 상태를 변경하면 지정한 좌표를 문자열의 어느 지점으로 사용할 것인가를 변경할 수 있다.
수평 정렬 위치를 변경하는 플레그가 세 개 있고 수직 정렬 위치를 변경하는 플레그가 두 개 있다. 이런 정렬 옵션을 사용하면 다음과 같이 여러개의 문자열을 중앙 정렬하여 출력할 수 있게 된다.
<결과>
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
SetTextAlign(hdc, TA_UPDATECP);
MyTextOut(hdc, 200, 100, TEXT("ONE "));
MyTextOut(hdc, 200, 120, TEXT("TWO "));
MyTextOut(hdc, 200, 140, TEXT("THREE"));
EndPaint(hWnd, &ps);
return 0;
case WM_PAINT:
<결과>
hdc = BeginPaint(hWnd, &ps);
wsprintf(str, TEXT("현재 점수는 %d점입니다."), Score);
MyTextOut(hdc, 50, 40, str);
EndPaint(hWnd, &ps);
return 0;
윈도우즈 환경에서 TextOut 출력문은 오로지 문자열만 다룰 수 있다. 정수나 실수를 출력하는 함수는 따로 없으므로 sprintf나 wsprintf 같은 함수로 서식화하여 문자열로 만들어서 출력해야한다.
<결과>
2.DrawText
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("DrawText");
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 400,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
while(GetMessage(&Message, NULL, 0, 0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rt = {100, 20, 400, 300};
TCHAR *str = TEXT("님은 갔습니다. 아아 사랑하는 나의 님은 갔습니다. 푸른 산빛을 "
"꺠치고 단풍나무 숲을 향하여 난 작은 길을 걸어서 차마 떨치고 갔습니다."
"황금의 꽃같이 굳고 빛나던 옛 맹세는 차디찬 티끌이 되어 한숨의 미풍에 "
"날아갔습니다.");
switch(iMessage)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
DrawText(hdc, str, -1, &rt, DT_CENTER | DT_WORDBREAK | DT_NOCLIP);
EndPaint(hWnd, &ps);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
int DrawText( HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat ); 이 함수는 사각영역을 정의하여 영역안에 문자열을 출력할 수 있으며 여러가지 포멧을 설정할 수 있는 기능이 있다. 윈도우즈에서 사각영역을 정의할 때는 RECT구조체를 사용하며 다음과 같이 정의되어 있다.
typedef struct _RECT // rc
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
DrawText의 4번째 인수는 이 구조체의 포인터이며 문자열이 출력될 사각 영역을 지정한다. 첫번째 인수는 물론 hdc이며 두번째 인수가 출력할 문자열, 세번째 인수는 출력할 문자열의 길이이되 이 값이 -1이면 널 종료 문자열로 간주한다. 다섯 번째 인수 uFormat은 DrawText 함수가 문자열을 출력할 방법을 지정하는 플레그이다.
값
설명
DT_LEFT
수평 왼쪽 정렬한다.
DT_RIGHT
수평 오른쪽 정렬한다.
DT_CENTER
수평 중앙 정렬한다.
DT_BOTTOM
사각 영역의 바닥에 문자열을 출력한다.
DT_VCENTER
사각 영역의 수직 중앙에 문자열을 출력한다.
DT_WORDBREAK
사각영역의 오른쪽 끝에서 자동 개행되도록 한다.
DT_SINGLELINE
한줄로 출력한다.
DT_NOCLIP
사각 영역의 경계를 벗어나도 문자열을 자르지 않고 그대로 출력한다.
<결과>
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
[내장형]이성재 2011년 9월1일 일일보고서 (15) | 2011.09.01 |
---|---|
[내장형]김수만_일일보고서 2011년 8월 31일 (14) | 2011.09.01 |
[내장형]이상만_2011년 8월 30일_일일보고서 (9) | 2011.08.30 |
[내장형]윤병도_2011년 8월 26일_일일보고서 (11) | 2011.08.26 |
[내장형]백길남_2011년 8월 23일_일일보고서 (10) | 2011.08.23 |
[내장형]박춘우_2011년 8월 22일 월요일 Daily Report (16) | 2011.08.22 |
[내장형]한원우_8월 19일 일일보고서 (11) | 2011.08.21 |
[내장형]이동현_08월18일_일일보고서 (8) | 2011.08.19 |