본문 바로가기
코스웨어/14년 스마트컨트롤러

2014년 04월 15일 업무일지 김진철[출석번호 : 8번]

by 알 수 없는 사용자 2014. 4. 15.
728x90
반응형
ATmega 128

Data Memory Map
$ = 0x
GPIO(intel = PORT

EEPROM은 구조에서 떨어져있기에 따로 컨트롤러를 두고 사용함
EEPROM을 동작 시킬수 있는 메카니즘이 따로 존재

EEPROM 쓰기 함수

• Bits 15:12 – Reserved
-되어있는 비트는 쓰지 않는다.

DDRA - Port A Data Direction Register
입,출력을 결정하는 레지스터 방향 레지스터
0 : 입력 1 : 출력

*((volatile unsigned char *)0x3A)=0x01; //  0x3A의 주소(DDRA)로 가서 0x01을 저장 즉 8비트이므로 0000 0001와 같다. PA0만 출력

unsigned uiCnt;
for(uiCnt=0;65000>uiCnt;++uiCnt); //  컴파일러가 자체적으로 최적화를 해서 uiCnt에 65000을 넣어 딜레이가 안생김                                                                       
                                                              //  해결방법 변수선언할때 volatile를 선언해서 변수선언하면 최적화를 안함

volatile unsigned uiCnt;
for(uiCnt=0;65000>uiCnt;++uiCnt); // uiCnt가 0부터 65000까지 딜레이 생김

선행처리 명령문

선행처리 명령문 실습

#define [매크로명] [처리할 매크로]

ex)
#define DDRA (*((volatile unsigned char *)0x3A)) // 전처리 과정에서 DDRA를 (*((volatile unsigned char *)0x3A))로 치환


매크로 함수

매개변수가 존재하는 매크로는 매크로 함수 또는 함수와 유사한 매크로(function-like macro)라고 한다.

매크로 함수 예제
// 3+2*3+2이기에 11이 출력 선행처리부분은 먼저 연산후 출력하지 않음
// 이를 해결하기위해 ( )를 쓰면 (3+2)*(3+2)이기에 25가 제대로 출력
//매크로를 두줄 이상 에 걸쳐서 정의할 경우 \사용하여 줄바꿈을 명시하지만 기본적으로 한줄로 정의하는 것이 원칙이다.

매크로 함수를 이용한 실습

LED 실습 소스 중 딜레이주는 for문을 매크로 함수로 대체

전처리후 생기는 .i파일을 확인하면 매크로가 치환된걸 확인할수가 있다.

컴파일후 .i파일 생성 방법

해당 디렉토리에서 makefile파일에 CFLAGS = -g$(DEBUG)이 부분에 추가로 gcc 옵션인 --save-temps를 입력후 저장

소스파일



연결리스트 & 동적 할당

자바에서는 동적 할당 해제(free)에 대해서 신경쓰지 않는다. JVM이 자동으로 해제한다.

연결 리스트 실습

struct _node *Next;     // 자신 참조형 포인터 typedef라고해도 Node가 선언되기 전이기에 struct _node라고한다.
                                 // *을 빼면 무한대이므로 크기를 측정할수가 없어서 컴파일과정에서 error 그러므로 포인터변수를 사용해야한다.

Head=malloc(sizeof(Node)); // Node크기만큼 메모리 동적 할당 받음

New1->Next=New2; // Head->Next->Next=New2;와도 같다

for(Temp=Head;Temp!=0;Temp=Temp->Next) //이 for문은 해제한 Head를 중심으로 잡고 있으므로 잘못된 for문
{
     free(Temp);
}

main.c의 구조

main.c의 구조


연결 리스트 실습

for(Temp=Head;Temp!=0;Temp=Temp->Next) // Head가 살아있기에 main.c에서의 for문과 달리 사용해도 상관이없다.
{
     printf("%c->",Temp->Data);
}

while(0!=Temp) // 기준인 Head를 다음으로 넘기고 삭제하기에 이 while은 main.c에서의 for문과 달리 문제가 없다.
{
     Head=Head->Next;
     free(Temp);
     Temp=Head;
}

main2.c의 구조


소스파일


2014.04.15.zip



728x90