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

20160315_장진웅_업무일지_펌웨어 분석&실습

by 알 수 없는 사용자 2016. 3. 16.
728x90
반응형

메모리 위치 확인----------------

 

<소스>

#include <stdio.h>

int D;
int E = 99;
int F;
int G = 98;
int H;

int main()
{
 int A = 0;
 int B;
 int C = 100;

 printf("---------Code 영역---------\n");
 printf("|printf의 주소: %p \n", &printf);
 printf("|main의 주소: %p \n", &main); 
 printf("---------Code 영역---------\n");

 printf("---------Data 영역---------\n"); 
 printf("G의 주소: %p \n", &G);
 printf("E의 주소: %p \n", &E);
 printf("---------Data 영역---------\n");

 printf("---------BSS 영역---------\n");
 printf("D의 주소: %p \n", &D);
 printf("F의 주소: %p \n", &F);  
 printf("H의 주소: %p \n", &H);
 printf("---------BSS 영역---------\n");

 printf("---------Stack 영역---------\n");
 printf("A의 주소: %p \n", &A);
 printf("B의 주소: %p \n", &B);
 printf("C의 주소: %p \n", &C);
 printf("---------Stack 영역---------\n");
 
 
 return 0;
}

<출력 결과>

<메모리 위치 이론>

(그림)

 

카운터 멈춤------------------------

<main.h의 소스>

#ifndef __MAIN_H__ //여긴 그냥 써도 됨.
#define __MAIN_H__ //나중에 이름이 중복될까봐.

void Init(void);
void Port_Init(void);
void INT_Init(void);

#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))

#define EICRA (*((volatile unsigned char *)0x69))
#define EICRB (*((volatile unsigned char *)0x6A))
#define EIMSK (*((volatile unsigned char *)0x3D))

#define SREG (*((volatile unsigned char *)0x5F))

#define INT7 7
#define INT6 6
#define INT5 5
#define INT4 4
#define INT3 3
#define INT2 2
#define INT1 1
#define INT0 0

#define ISC7 6
#define ISC6 4
#define ISC5 2
#define ISC4 0
#define ISC3 6
#define ISC2 4
#define ISC1 2
#define ISC0 0

#define sei()   __asm__ __volatile__ ("sei" ::) //7번비트만 1로 만들어줌.어셈블리코드
#define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: )

void __vector_1(void) __attribute__((signal, used, externally_visible)); //인터럽트 신호를 받는다,사용된다,외부에서 이걸 볼 수 있어야한다.(호출가능하다) INT0를 뜻함.
void __vector_2(void) __attribute__((signal, used, externally_visible)); //인터럽트 신호를 받는다,사용된다,외부에서 이걸 볼 수 있어야한다.(호출가능하다) INT1를 뜻함.

#endif //__MAIN_H__


 

<main.c의 소스>

#include "main.h"

volatile unsigned int uiState;

int main(void)
{
 volatile unsigned int uiCnt;  //타이머. 변수선언 다음은 DDRA를 출력으로 바꿔줘야함
 volatile unsigned int uiloop;
 uiCnt = 0;
 Init();

  uiState = 1;

  while(1)
  {
   PORTA = ((uiCnt/10)<<4)|(uiCnt%10);  //세그먼트에 3 0을 출력, 3이라는 수를 왼쪽으로 4칸 밀어라.|34를 10으로 나눈 나머지(4)를 첫자리부터 출력.
   for(uiloop = 0; uiloop < 45000; ++uiloop); //세미콜론을 닫으므로써 지역문이 된다.
   for(uiloop = 0; uiloop < 50000; ++uiloop);

    if(1==uiState)
    {
     ++uiCnt;
    }

    if(uiCnt > 99)  //세그먼트에서 앞자리가 9를 넘어가면 지워지는 이유는 uiCnt가 100을 넘어갔을 때이다. 그래서 if문으로 재정의.
    {
     uiCnt = 0;
    }
  }

 return 0;
}

void Init(void)
{
 INT_Init();
 Port_Init();
}

void Port_Init(void)
{
 DDRA = 0xff;
 PORTA = 0x00; //모든 포트 출력을 0으로 바꾼다. 그러므로 판때기에는 00이 출력
}

void INT_Init(void)
{
 EICRA=(3<<ISC0)|(3<<ISC1);  //ISC0==INT0, 상승엣지이므로 3을 쓴다.
 EIMSK=(1<<INT0)|(1<<INT1); //==EIMSK=1;<- 이건 or 쓰기 전에만. INT0만 열고 나머지문은 다 닫는다.만약 다른것도 열고 싶으면 (1<<INT0) | (1<<INT3);이렇게 쓴다.
 SREG=SREG|(1<<7); //어셈블리보다 코드보다 느리다.SREG=SREG | (1<<7)==sei(); 이건 전체 인터럽트 켜는 것.
}

void __vector_1(void)
{
 volatile unsigned int uiCnt;
 for(uiCnt = 0; 30000>uiCnt ; ++uiCnt);
 uiState = 1;
}

void __vector_2(void)
{
 volatile unsigned int uiCnt;
 for(uiCnt = 0; 30000>uiCnt ; ++uiCnt);
 uiState = 0;
}

아쉽게도 ATmega가가 작동하는걸 동영상으로 찍는다는걸 깜빡했습니다...ㅠㅠ

 

다음에 시간 날 때 따로 찍도록 하겠습니다.

 

앞으로 메모장을 졸업하고 Source Insight로 찾아 뵙겠습니다.


 

 

 

728x90