-
20140410 (프로그램 실행 구조, AvrStudio4 실행, 구조체 포인터, typedef struct)부산IT학원/스마트컨트롤러 2014. 4. 10. 15:57
39일차
---------------------
프로그램 실행 구조
---------------------
- PC와 ATMega128의 구조를 보자
우선 PC에서 프로그램이 실행되는 순서를 보자.
소스코드가 실행파일로 바뀌어 HDD에 저장되어 있다가
실행하면 Loader에 의해 Memory로 Loading된다.
그리고 CPU가 그것을 실행한다.
H/W와 S/W의 구조는 이렇게 되어있다.
H/W 와 같은 자원(키보드, USB, CPU...)들을 제어하는 각각의 Device Driver가 있다.
운영체제에서 Device Driver를 관리한다.
예를 들어 C로 프로그램을 짜는데 키보드에 입력을 받아 그것을 화면에 출력한다는 프로그램을 만들었다면, 운영체제에서 Driver들을 통해 키보드 입력을 제어 하고 화면에 표시하는 제어를 한다. 이런식으로 흘러 간다.
앞으로 배울 ATMega128은 우리가 직접 H/W를 조작하는 구조이다.
그래서 더 적합하게 움직이지만 더 심각한 오류도 날 수있다.
- AvrStudio4
AvrStudio4 는 프로그램 작성, ATMega128에 프로그램을 지우고 심어주는 프로그램이다.
PC에서 컴파일해서 ATMega로 넣어주는데 이런것을 Cross compile이라 부르고, AvrStudio4를 Cross Compiler라고 부른다.
아래는 프로그램을 넣는 과정.
Erase Device는 안에 있는 내용을 지우기이다.
먼저 지우고 Program을 누르면 프로그램이 들어간다.
- main.c
ATMega에서 main.c 소스를 보면 윈도우와 다르다.
makefile이 같은 폴더에 있어야 하고,
return 전에 무한 루프를 항상 갈겨줘야 한다는것!?
int main()
{
while(1);
return 0;
}
위에 프로그램 구조에서 보았듯이 윈도우 프로그램은 프로그램이 끝나면 돌아갈 곳(?)인 OS가 있지만,
ATMega의 경우 돌아갈 곳(?)이 없기 때문에 끝내버리면 대부분 멈추지만 가끔 오작동을 일으키는 경우가 있다고 하니 무한루프를 걸어준다.
돌아갈 곳이라니 뭔가 좀 웃기구만....
---C
--------------------
구조체 포인터
--------------------
---------------------------------
--- void형 포인터로 가리킬 경우
ex)
struct smart
{
int a;
short b;
float c;
char d;
int e;
};int main()
{
struct smart test = {100, 50, 4.1, 10, 1};
void * vp = &test // 구조체의 주소값만 넘겨주면 된다.
printf("a : %d \n", test.a);
printf("a : %d \n", *((int *)vp) );vp = (char *)vp + 4;
printf("b : %d \n", *((short *)vp) );vp = (char *)vp + 4;
printf("c : %f \n", *((float *)vp) );vp = (char *)vp + 4;
printf("d : %d \n", *((char *)vp) );vp = (char *)vp + 4;
printf("e : %d \n", *((int *)vp) );printf("tset : %d \n", sizeof(test) );
return 0;
}
출력 화면
-------------------
- 구조체 포인터
ex) 위의 구조체와 상동
int main()
{
struct smart test = {100, 50, 4.1, 10, 1};
struct smart * stp = &test;printf("a : %d \n", stp->a);
printf("b : %d \n", (*stp).b);
printf("c : %f \n", test.c);
printf("d : %d \n", stp->d);
printf("e : %d \n", stp->e);return 0;
}이런식으로 구조체 포인터를 사용한다.
stp->a == (*stp).a 는 같은 뜻이다.
--------------------
--- typedef struct
- struct smart 변수 // 이런식으로 하기에는 좀 길다
그래서 좀 줄이기 위해 typedef를 선언.
ex)
struct smart
{
int a;
short b;
float c;
char d;
int e;
};
typedef struct smart Smart;int main()
{
Smart test = {100, 50, 4.1, 10, 1};return 0;
}이런식으로도 사용이 가능하고
typedef struct smart
{
int a;
short b;
float c;
char d;
int e;
}Smart;int main()
{
Smart test = {100, 50, 4.1, 10, 1};return 0;
}이런식으로 한방에 다 선언, 정의도 가능하다.
한 방에 가능하니 많은 이들이 요놈을 선호한다고 한다.
--- 구조체를 함수의 인자로, 리턴값으로도 넘길 수 있다.
ex)
typedef struct _num
{
int a;
int b;
}Num;Num AddNum(Num nNum)
{
++nNum.a;
++nNum.b;return nNum;
}
int main()
{
Num nNum = {1, 10};nNum = AddNum(nNum);
printf("%d %d \n", nNum.a, nNum.b);
return 0;
}출력 화면
이런식으로 함수의 인자, 리턴값으로도 할 수 있다.
그러나 인자든 리턴값이든 메모리에 새로 복사하게 되므로
중복값이 생기니 메모리 낭비, CPU 계산 낭비등 자원등을 낭비하는 사태가 초례된다.
그러므로 포인터를 사용해야한다.
ex)
typedef struct _num
{
int a;
int b;
}Num;Num * AddNum(Num * nNum)
{
++nNum->a;
++nNum->b;return nNum;
}int main()
{
Num nNum = {1, 10};AddNum(&nNum);
printf("%d %d \n", nNum.a, nNum.b);
return 0;
}출력 화면
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140414 (ATMega128 내부, 메모리 방식 폰노이만 하바드, 연결리스트, 동적할당) (0) 2014.04.14 20140411 (용어, Register Summary, volatile, 구조체 복사, 공용체) (0) 2014.04.11 20140409 (CPU, Microcontroller, RAM, ROM, RISC, CISC, 구조체, #pragma pack) (2) 2014.04.09 20140408 (회로도 최적화, 4bit 덧셈, 구조체) (0) 2014.04.08 20140407 (반가산기 XOR없이, 회로도 최적화 공식, typedef, strlen, strcpy, strcat) (0) 2014.04.07