저수준함수 + 연결리스트

저수준 함수로 파일(a.dat)를 열어 5개의 값을 저장하는 프로그램과  다시 5개의 값을 불러오는 프로그램을 작성하겠습니다

구조체는 NODE.h에 만듭니다
/* NODE.h */ 
#ifndef
 __NODE_H__
#define __NODE_H__

#if 1
typedef struct _node
{
  int iNum;
  struct _node *next;
}NODE;
#else
typedef struct _node
{
  int iNum;
  struct _node *next;
  struct _node *prev;
}NODE;
#endif

#endif //이 endif는 __NODE_H__


int iNum 과 struct _node *next 가 필요합니다

/*  tet1.c  */
#include <stdio.h>
#include "NODE.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
  int ifd;
  int iCnt;
  NODE stTemp;
    
  if((ifd = open("a.dat", O_CREAT|O_WRONLY|O_TRUNC))<0)
  {
    printf("Can't open file a.dat\n");
    return -100;
  }
  
  for(iCnt = 0 ; iCnt < 5 ; iCnt++)
  {
    printf("정수를 입력하세요 : ");
    scanf("%d",&stTemp.iNum);  
    write(ifd, &stTemp, sizeof(stTemp));
  }
  close(ifd);
  return 0;
}


 
 
a.dat에 입력된 값을 가리키는 연결리스트 파일을 만듭니다

malloc으로 동적할당을 받고 그 위치를 저장할 stpNode와 이전의 stpNode의 위치를 기억할 stpHead가 필요합니다


stpNode = (NODE *)malloc(sizeof(NODE));


stpNode은 malloc로 받은 동적할당의 주소를 저장합니다

stpNode -> next = 0;


stpNode가 가리키는 곳의 next(stpNode가 가리키는 곳의 주소를 값을 가지고 있는)에 0을 넣습니다

 stpNode ->next = stpHead;
 stpHead = stpNode;


stpNode가 가리키는 곳의 next가 가리키는 주소를 stpHead를 넣습니다(stpNode를 가리키는 주소변수가

 

#include <stdio.h>
#include <fcntl.h>
#include "NODE.h"
#include <stdlib.h>

int main()
{
  int ifd;
  int iCnt;
  int iRet;
  NODE *stpHead;
  NODE *stpNode;
  
  ifd = open("a.dat", O_CREAT|O_RDONLY);

  if(0 > ifd)
  {
    printf("Can't not open file\n");
    return -100;
  }
  
/*  -첫번째-  */
  stpNode = (NODE *)malloc(sizeof(NODE));
  if(0 == stpNode)
  {
    printf("malloc error\n");
    return -100;
  }
  
  iRet = read(ifd, stpNode , sizeof(NODE));
  stpNode -> next = 0;
  if(0 == iRet)
  {
    free(stpNode);
    printf("내용이 없습니다\n");
  }
  else 
  {
    stpHead = stpNode;
  }
  printf("%d\n", stpNode->iNum);
  
/*  -두번째-  */
  stpNode = (NODE *)malloc(sizeof(NODE));
  if(0 == stpNode)
  {
    printf("malloc error\n");
    return -100;
  }
  
  iRet = read(ifd, stpNode , sizeof(NODE));
  stpNode -> next = 0;
  if(0 == iRet)
  {
    free(stpNode);
    printf("내용이 없습니다\n");
  }
  else 
  {
    stpNode ->next = stpHead;
    stpHead = stpNode;
  }
  
  printf("%d\n", stpNode->iNum);

/*  -세번째-  */
  stpNode = (NODE *)malloc(sizeof(NODE));
  if(0 == stpNode)
  {
    printf("malloc error\n");
    return -100;
  }
  
  iRet = read(ifd, stpNode , sizeof(NODE));
  stpNode -> next = 0;
  if(0 == iRet)
  {
    free(stpNode);
    printf("내용이 없습니다\n");
  }
  else 
  {
    stpNode ->next = stpHead;
    stpHead = stpNode;
  }
  
  printf("%d\n", stpNode->iNum);

/*  -네번째-  */
  stpNode = (NODE *)malloc(sizeof(NODE));
  if(0 == stpNode)
  {
    printf("malloc error\n");
    return -100;
  }
  
  iRet = read(ifd, stpNode , sizeof(NODE));
  stpNode -> next = 0;
  if(0 == iRet)
  {
    free(stpNode);
    printf("내용이 없습니다\n");
  }
  else 
  {
    stpNode ->next = stpHead;
    stpHead = stpNode;
  }
  
  printf("%d\n", stpNode->iNum);

/*  -다섯번째-  */
  stpNode = (NODE *)malloc(sizeof(NODE));
  if(0 == stpNode)
  {
    printf("malloc error\n");
    return -100;
  }
  
  iRet = read(ifd, stpNode , sizeof(NODE));
  stpNode -> next = 0;
  if(0 == iRet)
  {
    free(stpNode);
    printf("내용이 없습니다\n");
  }
  else 
  {
    stpNode ->next = stpHead;
    stpHead = stpNode;
  }
    
  printf("%d\n", stpNode->iNum);

  close(ifd);
  return 0;
}



결과>>


 ========================================================================================================
 
At91sam7s CLCD세팅

결선>>
CLCD 관련 RS RW E BUS 추가로 연결


초기화 세팅

#define PIOA_PER  (*(volatile unsigned int *)0xFFFFF400)
#define PIOA_OER  (*(volatile unsigned int *)0xFFFFF410)
#define PIOA_PPUDR  (*(volatile unsigned int *)0xFFFFF460)
#define PIOA_CODR  (*(volatile unsigned int *)0xFFFFF434)
#define PIOA_SODR  (*(volatile unsigned int *)0xFFFFF430)
// CODR = clear '0' ,SODR = set '1'

// LCD Character LCD 세팅
#define  CLCD_RS  (1<<8)
#define  CLCD_RW  (1<<9)
#define  CLCD_EN  (1<<10)
#define  CLCD_BS  (0xFF<<16)
#define   CLCD_INST_CD  (0x01<<16)   //clear display

//타이밍동 지연용 
#define  CLCD_DELAY    for(iCount = 0 ; 1000000 > iCount ; iCount++);

void OUT_INIT(void)
{
  // Configure the pin in output
  PIOA_OER  = CLCD_BS|CLCD_EN|CLCD_RW|CLCD_RS;
  // Set the PIO controller in PIO mode instead of peripheral mode
  PIOA_PER  = CLCD_BS|CLCD_EN|CLCD_RW|CLCD_RS;
  // Disable pull-up
  PIOA_PPUDR  = CLCD_BS|CLCD_EN|CLCD_RW|CLCD_RS;
}

int main(void)
{
  volatile unsigned int iCount = 0;

  OUT_INIT();
  
  PIOA_CODR = CLCD_EN;   //LCD 비활청화
  PIOA_CODR = CLCD_RS;   //인스트럭션 레지스터 셀렉트
  PIOA_CODR = CLCD_RW;  //write
  
  CLCD_DELAY;   //단순지연용
  
  PIOA_SODR = CLCD_EN;   //LCD 활성화
  PIOA_SODR = CLCD_INST_CD;  //Clear Display 사용

  CLCD_DELAY;    //단순지연용

  PIOA_CODR = CLCD_EN;

  CLCD_DELAY;  //단순지연용

  while(1);
      
  return 0;
}

Posted by mantwo