20130418

__________논리 회로___________________________________________________________________________________

 

※ 카르노 맵 (4변수)

_____________________________________________________________________________________________________

 

 

 

 

 

 

_________C 수업______________________________________________________________________________________

 

■ 10. 연결리스트

 

동적 자료형 : 함수의 실행 중 메모리가 필요에 따라 할당되었다가 사용후 시스템에게 돌려 주는 자료형

                               (메모리 공간 사용의 효율성을 높일수 있음 ex>이중연결리스트, 2진트리, 스택, 큐)

 

 

 

※ 정적 자료형의 단점 :  - 크기가 프로그램의 선언부에서 한번 정해지면 바뀔 수 없음

                                                 - 데이터의 삽입과 삭제가 자유롭지 못함

 

※ 동적 자료형의 특징 :  - 프로그램의 실행 도중 필요에 따라 변수를 생성시키거나 소멸 시킬수 있다.

                                                -  동적 자료형의 변수는 정적자료형의 변수처럼 변수 자체가 이름을 갖는 것이 아니라

                                                   포인터변수(참조변수)를 이용하여 간접적으로 접근한다. 이때 참조변수는 동적 변수의 주소를

                                                   가지고 있다.  

 

 ※ malloc() 함수 & free() 함수 C 프로그램에서 프로그램의 실행도중 필요한 메모리를 시스템으로부터 할당 받을때는

                                                               malloc() 함수를 사용하고, 사용 후 메모리를 시스템에 반환할 때는 free() 함수를 사용한다.

                                                               ※ malloc : memory allonation

                                   

 

 원형

   void * malloc (size_t size) ;

   void free ( void *ptr) ; 

 

 ※ 원형에서 size 는 할당하고자하는 메모리의 바이트수

 ※ malloc () 함수는 할당된 메모리의 시작주소를 반환함

 ※ 메모리의 부족으로 메모리 할당이 실패했을 경우 NULL 반환

 ※ 할당된 메모리는 프로그램이 끝나기 전 반드시 free() 함수로 해제시켜줘야함.

 ※ stdlib.h 와 alloc.h 에 선언되어 있음

 

 ※ 동적 자료형은 심볼테이블에 올라가지 않는다 즉, 실행파일에는

     동적 자료형의 주소정보가 없다.

     ( Code, Data, BSS 영역은 파일에 주소정보가 들어있지만

        Heap, stack 영역은 실행될때 운영체제가 사용가능한 주소를 넘겨줌 )

 

 

 

 자동변수

 {

      (Auto) int A ;

      // 우리가 쓰는 일반적인 변수는 자동으로 생성되고 자동으로 없어지는 자동변수임.

 }

 

 

 

 void *

#include <stdio.h>

 

int main()

{

 int a = 100;
 short b = 200;
 char c = 10;

 //int *pA = &a;
 //short *pB = &b;
 //char *pC = &c;

 float d = 5.0f;
 //float *pD = &d;

 void *vp;     // 가리키는 곳의 자료형이 정해지지 않았다(미정)


 //pA = pD; // 가리키는 곳의 자료형이 다르지만 같은 포인터이기 때문에 warning

 //vp = pD; vp가 가리키는곳이정해져있지 않기 때문에 pD가 대입 되는것이 문제되지 않는다. 

 
 
 //printf("%d\n", *pA);
 //printf("%d\n", *pB);
 //printf("%d\n", *pC);
 //printf("%f\n", *pD);

 //printf("%d\n", *vp); //void *는 가리키는곳의 자료형이 명확하지 않기때문에 *쓰는것이 안됨.

 //printf("%f\n", * ((float *)vp));  // 캐스팅 시켜서 vp가 어떤 자료형을 가리키는지 명확히하면 됨.

 

 // void * 를 쓰면 캐스팅해서 어떤자료형이든 다 가리킬수 있다  
 vp = &a; 
 printf("%d\n", * ((int *)vp));

 vp = &b; 
 printf("%d\n", * ((short *)vp));

 vp = &c; 
 printf("%d\n", * ((char *)vp));

 vp = &d; 
 printf("%f\n", * ((float *)vp));

 

return 0;

}

 

 

 malloc() , free() 실습

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

 

typedef struct
{
    char name[20];
    int score;

 

}STUDENT;


int main()
{
       STUDENT st[3], *sp;

 int i = 0;

 

 sp = (STUDENT *) malloc (sizeof (STUDENT)); // STUDENT 크기만큼의 동적 메모리 할당하고

                                                                     // 시작주소를 sp 에 넘겨 받음.

                                                                     // (STUDENT *) 자료형으로 캐스팅

 

 if(sp == NULL) // 메모리를 할당 받지 못하면 NULL 을 넘겨 받아서 종료됨.
 {
     printf("allocation error\n");
     exit(-1);
 }

 

 while ( i < 3 )
 {
      printf("Please enter sttudent name & score : ");
      scanf ("%s %d", sp->name, &sp->score);


      //strcpy(st[i].name, sp->name);
      //st[i++].score = sp->score;

 

      st[i++] = *sp; // 배열은 배열로 대입되지 않지만(주소라서)... 
                          // 같은 구조체끼리는 대입이 가능 
                           // 위의 주석된 방식은 멤버마다 대입해주어야 하므로 단점이 있다.

 }

 free (sp); // sp가 가리키는 메모리를 시스템에 돌려줌

 for(i = 0; i < 3; ++i)
 {
      printf("student name : %s,\tscore : %d\n", st[i].name, st[i].score);

 }

 

       return 0;
}

 

______________________________________________________________________________________________________

 

 

 

 

 

 

 

 

__________ARM___________________________________________________________________________________

 

■ AT91SAM7S256으로 LCD 모듈(16216D-4-B102A)

   Data 또는 instruction 전송하여 LCD 모듈 제어 

 

  LCD.h 

 

#ifndef _LCD_H_
#define _LCD_H_

#include <AT91SAM7S256.h>


#define PIO_OER     (*((volatile unsigned int *)0xFFFFF410))    //P248, P251
#define PIO_PER     (*((volatile unsigned int *)0xFFFFF400))    //P248, P250
#define PIO_CODR   (*((volatile unsigned int *)0xFFFFF434))  //P248, P255
#define PIO_SODR   (*((volatile unsigned int *)0xFFFFF430))   //P248, P254

 

#define LCD_RS (1<<24)        // 1을 왼쪽으로 24 시프트 시킴 (0x01000000)
#define LCD_RW (1<<25)        // 0x02000000
#define LCD_EN (1<<26)        // 0x04000000
#define LCD_BS (0xFF<<16)   //1111 1111을 16 시프트 시킴 (0x00FF0000)
                                           //전체를 한번에 16진수로 넣으려면 0x07FF0000

 


#define LCD_CLEAR     0x01        //0000 0001,   P13, 화면 클리어
#define LCD_HOME      0x02        //0000 0010,   P13, 커서 맨 앞으로
#define LCD_ENTRY     0x06        //0000 0110,  P13, 커서 오른쪽 시프트, 화면고정
#define LCD_DISPLAY   0x0C       //0000 1100,   P13, 화면 ON, 커서 OFF, cursor blink OFF
#define LCD_CURSOR   0x1C       //0001 1100,   P13, displayshift, shift to the right 
#define LCD_FUNC       0x38        //0011 1000,   P13, 8bit, 2lines, 5x7dots


void LCD_Init (void);

void LCD_Cmd_write (unsigned char);

void LCD_Data_write (unsigned char);


#endif //_LCD_H_

 

  LCD.c

 

#include "LCD.h"

 

void LCD_Init (void)
{
       PIO_OER = LCD_RS |LCD_RW|LCD_EN|LCD_BS;  // 24핀 OR 25핀 OR 26핀 OR 16~23 핀 활성
       PIO_PER = LCD_RS |LCD_RW|LCD_EN|LCD_BS;  // 16~26 핀 활성  
                                                                              // 전체 0x07FF0000 값 들어감 

 

 LCD_Cmd_write(LCD_FUNC);                   //LCD_Cmd_write 함수를 이용해 명령어 전달
 LCD_Cmd_write(LCD_ENTRY);                
 LCD_Cmd_write(LCD_CURSOR);
 LCD_Cmd_write(LCD_DISPLAY);
 LCD_Cmd_write(LCD_CLEAR);
 LCD_Cmd_write(LCD_HOME);
           

      return ;
}


void LCD_Cmd_write (unsigned char ucdata)    //타이밍도에 맞춘 write operation
{
       volatile unsigned int iCnt;

 PIO_CODR = LCD_EN ;    //EN clear
 PIO_CODR = LCD_RS;    //RS clear
 PIO_CODR = LCD_RW;    //RW clear

 for(iCnt = 0; 50000 > iCnt; ++iCnt);  //시간지연

 PIO_SODR = LCD_EN ;    //EN set

 for(iCnt = 0; 50000 > iCnt; ++iCnt);  //시간지연

 PIO_CODR = LCD_BS;    // BUS clear

 PIO_SODR = (ucdata<<16);   // BUS data  input

 for(iCnt = 0; 50000 > iCnt; ++iCnt);  //시간지연

 PIO_CODR = LCD_EN ;    //EN clear

 for(iCnt = 0; 50000 > iCnt; ++iCnt);  //시간지연

 
 return;

}

 


void LCD_Data_write (unsigned char ucdata)    // 함수인자로 BUS에 명령어 바로 넣음 

{
       volatile unsigned int iCnt;

 PIO_CODR = LCD_EN ;                             //EN clear
 PIO_SODR = LCD_RS;                              //RS set
 PIO_CODR = LCD_RW;                             //RW clear

 for(iCnt = 0; 50000 > iCnt; ++iCnt);              //시간지연

 PIO_SODR = LCD_EN ;                             //EN set

 for(iCnt = 0; 50000 > iCnt; ++iCnt);              //시간지연

 PIO_CODR = LCD_BS;                              // BUS clear

 PIO_SODR = (ucdata<<16);                       // BUS data  input

 for(iCnt = 0; 50000 > iCnt; ++iCnt);              //시간지연

 PIO_CODR = LCD_EN ;                             //EN clear

 for(iCnt = 0; 50000 > iCnt; ++iCnt);              //시간지연

 
 return;

}

 

 

 

  main.c 

 

#include "project.h"
#include "LCD.h"


int main()
{
      LCD_Init();


      LCD_Data_write('L');        // 아스키코드 값을 넘겨서 쓸수 있음
      LCD_Data_write('O');
      LCD_Data_write('V');
      LCD_Data_write('E');


 return 0;

}

 

※ I / D   ->    Increment : 증가 ,   decrement : 감소

_______________________________________________________________________________________________________________________

 

 

 

 

 

 

_________실습파일_____________________

 

10-1.c

voidp.c

LCD.c

LCD.h

main.c

_______________________________________

'스마트 컨트롤러 게시물' 카테고리의 다른 글

20130422  (0) 2013.04.22
20130419  (0) 2013.04.19
20130417  (0) 2013.04.17
20130416  (0) 2013.04.16
20130415  (0) 2013.04.15