==========================================================================================

NETWORK

==========================================================================================


<NETWORK>




==2차 : 클라이언트들간 대화 가능하도록 수정

-IPC(Inter Process Communication) : 프로세스간 통신



=IPC종류

-파이프 : 단방향

-메시지 큐

-네임드 파이프

-공유 메모리

-...


=파이프

int fd[2];

pipe(fd);


=익명 파이프

-구심점 : 내부 변수



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

int main()
{

    
int fd[2];
    
int buf;
    
int i =0;
    
int pid;

    
if(pipe(fd) < 0)
    {
        perror(
"pipe error : ");
        
return 1;
    }

    
if((pid = fork()) <0)
    {
        
return 1;
    }
    
else if(pid ==0)
    {
        close(fd[
0]);
        
while(1)
        {
            i++;
            write(fd[
1], (void *)&i, sizeof(i));
            sleep(
1);
        }
    }
    
else
    {
        close(fd[
1]);
        
while(1)
        {
            read(fd[
0], (void *)&buf, sizeof(buf));
            printf(
"> %d\n", buf);
        }
    }


    
return 0;
}









=네임드 파이프

-소스를 완전 분리시 연결할 방법 없다

-구심점 : 중간(Z.TXT)에 가교 요청(ex)- A에서 Z.TXT 열고 B에서도 Z.TXT를 열어 A에서 Z에 내용을 쓰면 B에서 사용 가능)


mkfifo() => first in first out


-tmp 확인







-확인(구심점 : myfifo_r)

ls -al /tmp/myfifo_r


d(directory) -> p(pipe)






<echoserverpipe.c>

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

#define MAXLINE  1024
int main(int argc, char **argv)
{
    
int rfd, wfd;
    
char buf[MAXLINE];

    mkfifo(
"/tmp/myfifo_r", S_IRUSR | S_IWUSR);
    mkfifo(
"/tmp/myfifo_w", S_IRUSR|
S_IWUSR);
    
if((rfd = open("/tmp/myfifo_r", O_RDWR)) == -1)
    {
        perror(
"rfd error");
        
return 1;
    }

    
if((wfd = open("/tmp/myfifo_w", O_RDWR)) == -1)
    {
        perror(
"wfd error");
        
return 2;
    }
    
while(1)
    {
        memset(buf, 
0x00, MAXLINE);
        
if(read(rfd, buf, MAXLINE) < 0)
        {
            perror(
"Read Error");
            
return 3;
        }
        printf(
"Read : %s", buf);
        write(wfd, buf, MAXLINE);
        lseek(wfd, 
0, SEEK_SET);
    }

    
return 0;
}



<echoclientpipe.c>

#include <sys/types.h>

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

#define MAXLINE 1024
int main(int atgc, char **arcv)
{
    
int rfd, wfd;
    
char buf[MAXLINE];

    rfd 
= open("/tmp/myfifo_w", O_RDWR);
    
if(rfd < 0)
    {
        perror(
"read open error\n");
        
return 1;
    }
    wfd 
= open("/tmp/myfifo_r", O_RDWR);
    
if(wfd < 0)
    {
        perror(
"write open error\n");
        
return 1;
    }
    
while(1)
    {
        printf(
"> ");
        fflush(stdout);
        memset(buf, 
0x00, MAXLINE);
        
if(read(0, buf, MAXLINE) < 0)
        {
            printf(
"error\n");
            
return 1;
        }
        
if(strncmp(buf, "quit\n"5== 0)
        {
            
break;
        }
        write(wfd, buf, strlen(buf));
        read(rfd, buf, MAXLINE);

        printf(
"Server -> %s", buf);
    }
    close(wfd);
    close(rfd);
    
return 0;
}








=네임드파이프단점 : 클라이언트 수 만큼 파이프 만들어야 함 => 채팅용으로는 부적합



==유닉스 도메인 소켓

파일 경로


구심점 : 소켓파일

: sockaddr_in -> sockaddr_un

: d(directory) -> s(socket)

access() : 해당 파일 읽을 수 있는지 체크


<echoserver_udomain.c>


#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h
>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MAXLINE 1024

int main(int argc, char ** argv)
{
  
int listen_fd;
  
int
 client_fd;
  socklen_t addrlen;
  
int readn;
  
char buf[MAXLINE];
  
struct sockaddr_un client_addr;
  
struct
 sockaddr_un server_addr;

  
if(argc !=2)
  {
    printf(
"Usage : %s [socket file name] \n", argv[0]);
    
return 1;
  }
 
 if(access(argv[1], F_OK) ==0)
  {
    unlink(argv[
1]);
  }


  
if((listen_fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
  {
    perror(
"Error : socket");
    
return 2;
  }

  memset((
void *)&server_addr, 0x00sizeof(server_addr));
  
server_addr.sun_family = AF_UNIX;
  strncpy(server_addr.sun_path, argv[
1], strlen(argv[1]));

  
if(bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
  {
    perror(
"Error : bind");
    
return 3;
  }

  
if(listen(listen_fd, 5==-1)
  {
    perror(
"Error : listen");
    
return 4;
  }

  
while(1)
  {
    memset((
void *)&client_addr, 0x00sizeof(client_addr));
    printf(
"accept wait\n");
    client_fd 
= accept(listen_fd, (struct sockaddr *)&client_addr, &addrlen);

    
while(1)
    {
      
if(client_fd ==-1)
      {
        printf(
"Accept Error ");
        
return 0;
      }
      memset(buf, 
0x00, MAXLINE);
      readn 
= read(client_fd, buf, MAXLINE);
      
if(readn ==0)
        
break;
      printf(
"==> %s", buf);
      write(client_fd, buf, strlen(buf));
    }
  }
  
return 0;
}


<echoclient_udomain.c>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h
>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MAXLINE 1024

int main(int argc, char **argv)
{
    
int sockfd;
    
int clilen;
    
char buf[MAXLINE];
    
struct sockaddr_un sock_addr;


    
if(argc !=2)
    {
        printf(
"Usage : %s [socket file name]\n", argv[0]);
        
return 1;
    }

    
if(access(argv[1], R_OK) == -1)
    {
        printf(
"socket File access error\n");
        
return 2;
    }

    sockfd 
=socket(AF_UNIX, SOCK_STREAM, 0);

    memset((
void *)&sock_addr, 0x00sizeof(sock_addr));
    sock_addr.sun_family 
= AF_UNIX;
    strncpy(sock_addr.sun_path, argv[
1], strlen(argv[1
]));
    clilen 
= sizeof(sock_addr);
    connect(sockfd, (
struct sockaddr *)&sock_addr, clilen);

    
while(1)
    {
        memset(buf, 
0x00, MAXLINE);
        read(
0, buf, MAXLINE);
        
if(strncmp(buf, "quit\n"5==0)
        {
            
break;
        }
        write(sockfd, buf, strlen(buf));
        read(sockfd, buf, MAXLINE);
        printf(
"server -> %s", buf);
    }
    
return 0;
}













(적은양의 데이터를 많은 프로세스에서 사용시)

-파일 소켓 단점 : 다중접속은되나 성능이 떨어짐













==공유메모리




: shmget() :


: shmat()

: shmdt()

: shmctl() : 관리


-확인

: ipcs -m









-

<shm_procuder.c>


#include <sys/ipc.h>
#include <sys/shm.h
>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    
int shmid;

    
int *cal_num;
    
void *shared_memory = NULL;

    
shmid = shmget((key_t) 1234sizeof(int), 0666|IPC_CREAT);
    
if(shmid == -1)
    {
        perror(
"shmget failed : ");
        exit(
0);
    }

    
shared_memory = shmat(shmid, NULL, 0);
    
if(shared_memory == (void *)-1)
    {
        perror(
"shmat failed : ");
        exit(
0);
    }

    
cal_num = (int *)shared_memory;
    
while(1)
    {
        
*cal_num = *cal_num +2;
        sleep(
1);
    }
    
return 0;
}


<shm_consumer.c>

#include <sys/ipc.h>
#include <sys/shm.h
>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv)
{
    
int shmid;

    
int *cal_num;
    
void *shared_memory = NULL;

    
shmid =shmget((key_t)1234sizeof(int), 0);
    
if(shmid == -1)
    {
        perror(
"shmget failed : ");
        exit(
0);
    }

   
 shared_memory = shmat(shmid, NULL, 0);
    
if(shared_memory == (void *)-1)
    {
        perror(
"shmat failed : ");
        exit(
0);
    }

    
cal_num = (int *)shared_memory;

    
while(1)
    {
        sleep(
1);
        printf(
"Read Dta : %d\n", *cal_num);
    }
    
return 0;
}








1. 멀티 P : PROCESS 여러개

2. 멀티 T : PROCESS 1개 THREAD 여러개

3. 다중 입출력 : PROCESS 1개


'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150810  (0) 2015.08.10
20150731  (0) 2015.08.10
20150729  (0) 2015.07.30
20150728  (0) 2015.07.28
20150727  (0) 2015.07.27
Posted by ahj333
,

==========================================================================================

ARM

==========================================================================================


<ARM>



=UDP : USB


=PMC : clock 인가



=AIC : INTERRUPT



=


aic.c

aic.h




= I/O 인터럽트

FIQ - FAST 인터럽트( 미세한 속도 차이 - 빠름 ) - PA19

IRQ - 인터럽트 신호 - 나머지 PIN












=



=함수 이름 정할 수 있음 ( AVR과 다른 점 )


AIC_SVR0 = test;


void test()

{

        ...

}


=

- PIN 32개 X

- 종류가 32개 O



=상태



=

PENDING - 다른 인터럽트 수행하는 동안 대기



=




=종류





PSUDO CODE ( 의사코드 )


















=Glitch - 떨림(누르거나)(HI-LOW-HI-LOW...) => 커패시터 타고 GND로 흐르도록 => GLITCH 필터



=

<HEADER>

// ========== Register definition for AIC peripheral ========== 
#define AT91C_AIC_IVR   (AT91_CAST(AT91_REG *)   0xFFFFF100) // (AIC) IRQ Vector Register
#define AT91C_AIC_SMR   (AT91_CAST(AT91_REG *)   0xFFFFF000) // (AIC) Source Mode Register
#define AT91C_AIC_FVR   (AT91_CAST(AT91_REG *)   0xFFFFF104) // (AIC) FIQ Vector Register
#define AT91C_AIC_DCR   (AT91_CAST(AT91_REG *)   0xFFFFF138) // (AIC) Debug Control Register (Protect)
#define AT91C_AIC_EOICR (AT91_CAST(AT91_REG *)   0xFFFFF130) // (AIC) End of Interrupt Command Register
#define AT91C_AIC_SVR   (AT91_CAST(AT91_REG *)   0xFFFFF080) // (AIC) Source Vector Register
#define AT91C_AIC_FFSR  (AT91_CAST(AT91_REG *)   0xFFFFF148) // (AIC) Fast Forcing Status Register
#define AT91C_AIC_ICCR  (AT91_CAST(AT91_REG *)   0xFFFFF128) // (AIC) Interrupt Clear Command Register
#define AT91C_AIC_ISR   (AT91_CAST(AT91_REG *)   0xFFFFF108) // (AIC) Interrupt Status Register
#define AT91C_AIC_IMR   (AT91_CAST(AT91_REG *)   0xFFFFF110) // (AIC) Interrupt Mask Register
#define AT91C_AIC_IPR   (AT91_CAST(AT91_REG *)   0xFFFFF10C) // (AIC) Interrupt Pending Register
#define AT91C_AIC_FFER  (AT91_CAST(AT91_REG *)   0xFFFFF140) // (AIC) Fast Forcing Enable Register
#define AT91C_AIC_IECR  (AT91_CAST(AT91_REG *)   0xFFFFF120) // (AIC) Interrupt Enable Command Register
#define AT91C_AIC_ISCR  (AT91_CAST(AT91_REG *)   0xFFFFF12C) // (AIC) Interrupt Set Command Register
#define AT91C_AIC_FFDR  (AT91_CAST(AT91_REG *)   0xFFFFF144) // (AIC) Fast Forcing Disable Register
#define AT91C_AIC_CISR  (AT91_CAST(AT91_REG *)   0xFFFFF114) // (AIC) Core Interrupt Status Register
#define AT91C_AIC_IDCR  (AT91_CAST(AT91_REG *)   0xFFFFF124) // (AIC) Interrupt Disable Command Register
#define AT91C_AIC_SPU   (AT91_CAST(AT91_REG *)   0xFFFFF134) // (AIC) Spurious Vector Register

// ========== Register definition for PIOA peripheral ========== 
#define AT91C_PIOA_ODR  (AT91_CAST(AT91_REG *)   0xFFFFF414) // (PIOA) Output Disable Registerr
#define AT91C_PIOA_SODR (AT91_CAST(AT91_REG *)   0xFFFFF430) // (PIOA) Set Output Data Register
#define AT91C_PIOA_ISR  (AT91_CAST(AT91_REG *)   0xFFFFF44C) // (PIOA) Interrupt Status Register
#define AT91C_PIOA_ABSR (AT91_CAST(AT91_REG *)   0xFFFFF478) // (PIOA) AB Select Status Register
#define AT91C_PIOA_IER  (AT91_CAST(AT91_REG *)   0xFFFFF440) // (PIOA) Interrupt Enable Register
#define AT91C_PIOA_PPUDR (AT91_CAST(AT91_REG *)   0xFFFFF460) // (PIOA) Pull-up Disable Register
#define AT91C_PIOA_IMR  (AT91_CAST(AT91_REG *)   0xFFFFF448) // (PIOA) Interrupt Mask Register
#define AT91C_PIOA_PER  (AT91_CAST(AT91_REG *)   0xFFFFF400) // (PIOA) PIO Enable Register
#define AT91C_PIOA_IFDR (AT91_CAST(AT91_REG *)   0xFFFFF424) // (PIOA) Input Filter Disable Register
#define AT91C_PIOA_OWDR (AT91_CAST(AT91_REG *)   0xFFFFF4A4) // (PIOA) Output Write Disable Register
#define AT91C_PIOA_MDSR (AT91_CAST(AT91_REG *)   0xFFFFF458) // (PIOA) Multi-driver Status Register
#define AT91C_PIOA_IDR  (AT91_CAST(AT91_REG *)   0xFFFFF444) // (PIOA) Interrupt Disable Register
#define AT91C_PIOA_ODSR (AT91_CAST(AT91_REG *)   0xFFFFF438) // (PIOA) Output Data Status Register
#define AT91C_PIOA_PPUSR (AT91_CAST(AT91_REG *)   0xFFFFF468) // (PIOA) Pull-up Status Register
#define AT91C_PIOA_OWSR (AT91_CAST(AT91_REG *)   0xFFFFF4A8) // (PIOA) Output Write Status Register
#define AT91C_PIOA_BSR  (AT91_CAST(AT91_REG *)   0xFFFFF474) // (PIOA) Select B Register
#define AT91C_PIOA_OWER (AT91_CAST(AT91_REG *)   0xFFFFF4A0) // (PIOA) Output Write Enable Register
#define AT91C_PIOA_IFER (AT91_CAST(AT91_REG *)   0xFFFFF420) // (PIOA) Input Filter Enable Register
#define AT91C_PIOA_PDSR (AT91_CAST(AT91_REG *)   0xFFFFF43C) // (PIOA) Pin Data Status Register
#define AT91C_PIOA_PPUER (AT91_CAST(AT91_REG *)   0xFFFFF464) // (PIOA) Pull-up Enable Register
#define AT91C_PIOA_OSR  (AT91_CAST(AT91_REG *)   0xFFFFF418) // (PIOA) Output Status Register
#define AT91C_PIOA_ASR  (AT91_CAST(AT91_REG *)   0xFFFFF470) // (PIOA) Select A Register
#define AT91C_PIOA_MDDR (AT91_CAST(AT91_REG *)   0xFFFFF454) // (PIOA) Multi-driver Disable Register
#define AT91C_PIOA_CODR (AT91_CAST(AT91_REG *)   0xFFFFF434) // (PIOA) Clear Output Data Register
#define AT91C_PIOA_MDER (AT91_CAST(AT91_REG *)   0xFFFFF450) // (PIOA) Multi-driver Enable Register
#define AT91C_PIOA_PDR  (AT91_CAST(AT91_REG *)   0xFFFFF404) // (PIOA) PIO Disable Register
#define AT91C_PIOA_IFSR (AT91_CAST(AT91_REG *)   0xFFFFF428) // (PIOA) Input Filter Status Register
#define AT91C_PIOA_OER  (AT91_CAST(AT91_REG *)   0xFFFFF410) // (PIOA) Output Enable Register
#define AT91C_PIOA_PSR  (AT91_CAST(AT91_REG *)   0xFFFFF408) // (PIOA) PIO Status Register

 

// ========== Register definition for PMC peripheral ========== 
#define AT91C_PMC_IDR   (AT91_CAST(AT91_REG *)   0xFFFFFC64) // (PMC) Interrupt Disable Register
#define AT91C_PMC_MOR   (AT91_CAST(AT91_REG *)   0xFFFFFC20) // (PMC) Main Oscillator Register
#define AT91C_PMC_PLLR  (AT91_CAST(AT91_REG *)   0xFFFFFC2C) // (PMC) PLL Register
#define AT91C_PMC_PCER  (AT91_CAST(AT91_REG *)   0xFFFFFC10) // (PMC) Peripheral Clock Enable Register
#define AT91C_PMC_PCKR  (AT91_CAST(AT91_REG *)   0xFFFFFC40) // (PMC) Programmable Clock Register
#define AT91C_PMC_MCKR  (AT91_CAST(AT91_REG *)   0xFFFFFC30) // (PMC) Master Clock Register
#define AT91C_PMC_SCDR  (AT91_CAST(AT91_REG *)   0xFFFFFC04) // (PMC) System Clock Disable Register
#define AT91C_PMC_PCDR  (AT91_CAST(AT91_REG *)   0xFFFFFC14) // (PMC) Peripheral Clock Disable Register
#define AT91C_PMC_SCSR  (AT91_CAST(AT91_REG *)   0xFFFFFC08) // (PMC) System Clock Status Register
#define AT91C_PMC_PCSR  (AT91_CAST(AT91_REG *)   0xFFFFFC18) // (PMC) Peripheral Clock Status Register
#define AT91C_PMC_MCFR  (AT91_CAST(AT91_REG *)   0xFFFFFC24) // (PMC) Main Clock  Frequency Register
#define AT91C_PMC_SCER  (AT91_CAST(AT91_REG *)   0xFFFFFC00) // (PMC) System Clock Enable Register
#define AT91C_PMC_IMR   (AT91_CAST(AT91_REG *)   0xFFFFFC6C) // (PMC) Interrupt Mask Register
#define AT91C_PMC_IER   (AT91_CAST(AT91_REG *)   0xFFFFFC60) // (PMC) Interrupt Enable Register
#define AT91C_PMC_SR    (AT91_CAST(AT91_REG *)   0xFFFFFC68) // (PMC) Status Register



<AIC.H>


#ifndef __AIC_H__
#define __AIC_H__
#include <AT91SAM7S256.h>

#define INT_PIN  15//AT91C_PIO_PA15
void AIC_Init(void);
#endif //__AIC_H__



<AIC.C>


#include "aic.h"

void HANDLER(void)
{
  
static volatile unsigned int uiIsr;
  
volatile unsigned int uiCnt;

  
// 인터럽트 핀 정보 저장
  
  
if()
  {
  }

  
for(uiCnt = 0100000 > uiCnt ;++uiCnt);
  
  
return;
  
}

void AIC_Init(void)
{
  *AT91C_PMC_PCER 
= 1 << AT91C_ID_PIOA;  // 전원 공급 (PIOA) - 실제로는 필요 X - ref) p34
  *AT91C_PIOA_PER = 1 << INT_PIN;      // 핀 활성화
  *AT91C_PIOA_ODR =  1 << INT_PIN;     // 핀 출력 비활성화
  *AT91C_PIOA_IDR = 1<<INT_PIN;      // 인터럽트 핀 비 활성화
  *AT91C_PIOA_IFER = 1<<INT_PIN;      // PIOA 입력 필터 활성화 -ref) p248
  *AT91C_AIC_IDCR = 1 << AT91C_ID_PIOA;  // 인터럽트 핀 컴맨드 비 활성화 -ref) p175
  *AT91C_AIC_ICCR = 1 << AT91C_ID_PIOA;  // 커맨드 레지스터 클리어
  *AT91C_AIC_ISCR = 1 << AT91C_ID_PIOA;  // 커맨드 레지스터 셋
  AT91C_AIC_SVR[AT91C_ID_PIOA] = (unsigned int)HANDLER;// 핸들러 등록
  // 동작모드 및 우선순위 결정

  //PIOA 인터럽트 핀 인터럽트 활성화
  //AIC 인터럽트 핀 인터럽트 활성화  
  
  
return;
}



'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150731  (0) 2015.08.10
20150730  (0) 2015.07.31
20150728  (0) 2015.07.28
20150727  (0) 2015.07.27
20150724  (0) 2015.07.26
Posted by ahj333
,

==========================================================================================

NETWORK

==========================================================================================

<NETWORK>



=return value 가져오기 : echo $?



=좀비 프로세스 : 아무일도 하지 않고 메모리 차지(자원낭비)


=CLIENT.C


- 수정 전 (while문 - 키입력 전 서버에서 오는 메시지 수신 불가능 함)


    read(iSock, cBuf, MSG_SIZE);
    printf(
"[SERVER] : [%s]\n",cBuf);

    while(1)
    {
        iRet 
= read(0, cBuf, MSG_SIZE);
        cBuf[iRet-
1]=0;
        write(iSock, cBuf, MSG_SIZE);
        read(iSock, cBuf, MSG_SIZE;
        printf(
"[SERVER] : [%s]\n",cBuf);

        
if(0== strncmp(MSG_END,cBuf,strlen(MSG_END)))
        {
            
break;
        }
    }



- 수정 후 (메세지 수신 & 화면 출력 / 키 입력 & 메시지 송신 분리)




-server






-client








-client fork()로 2개 생성








=SERVER

: 클라이언트 1 - 클라이언트 2 통신 되도록


1.두번째 클라이언트 접속 안됨 => 접속용 소켓 살려둠






2. iSock : 서버는 대화X => 랑데부 소켓

3. iCSock : 커뮤니케이션 소켓




==1차 : 클라이언트 여러개 받을 수 있도록 수정


<SERVER.C>

   while(1)
   {

       
iCSock = accept(iSock, (struct sockaddr *)&stAddr, &uiSockLen);
       
if(0 > iCSock)
       {
           perror(
"accept() error : ");
           close(iSock);
           
return 40;
       }

       
pid = fork();
       
//if(0 < pid)   // 부모: 랑데뷰
       //{
       //  continue;
       //}
       if(0 == pid)    // 자식: 커뮤니케이션
       {
           
break;
       }

  
 }




-server







-client 1







-client 2








=3개 실행 중








=client 1 종료







=2개 실행 중







=client 2 종료







=server 1개 실행중 (랑데뷰)







==2차 : 클라이언트들간 대화 가능하도록 수정

-IPC(Inter Process Communication) : 프로세스간 통신



'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150730  (0) 2015.07.31
20150729  (0) 2015.07.30
20150727  (0) 2015.07.27
20150724  (0) 2015.07.26
20150723  (0) 2015.07.23
Posted by ahj333
,

==========================================================================================

ARM

==========================================================================================


<ARM>



=LCD DISPLAY


<LCD.H>

#ifndef __LCD_H__
#define __LCD_H__
#include <AT91SAM7S256.h>

#define LCD_BUS  0x00FF0000  //MASK 16~23
#define LCD_RS  0x00000001  // 1 
#define LCD_RW  0x00000002  // 2
#define LCD_EN  0x00000004  // 3

#define  LCD_INST_CLR  0x01
#define  LCD_INST_HOME  0x02
#define  LCD_INST_ENT  0x06  // I/D = 1 , S = 0 (INCREMENT/DEDREMENT , SHIFT)
#define  LCD_INST_DSP  0x0F  // D = 1 , C = 1 , B = 1 (DISPLAY ON , CURSOR ON , CURSOR BLINK)
#define  LCD_INST_CUR  0x14  // S/C = 0  , R/L = 1 ( DISPLAY SHIF/CURSOR MOVE , RIGHT/LEFT)
#define  LCD_INST_FUNC   0x38  // DL =1 , N =1 , F =
 0 ( DATA LENGTH8/4 , LINE2/1 , FONT5x10/5x7)

#define LCD_CAL_INST(X)  ((LCD_BUS)&((X)<<16)) // INST만 넣기 

void LCD_Data(unsigned char );
void LCD_Print(const unsigned char
 * );
void LCD_Init(void);
#endif // __LCD_H__


<LCD.C>

#include "lcd.h"

void LCD_Inst(unsigned int uiInst) 
{
  
volatile unsigned int uiCnt;  
  
  *AT91C_PIOA_CODR 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  // LOW  
  *AT91C_PIOA_SODR = LCD_CAL_INST(uiInst);  
  
for(uiCnt = 0 ; uiCnt <4600; ++uiCnt);  // ALL INIT
  for(uiCnt = 0 ; uiCnt <4500; ++uiCnt);  // RS = LOW
  *AT91C_PIOA_SODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <4600; ++uiCnt);  // EN = HIGH
  for(uiCnt = 0 ; uiCnt <4500; ++uiCnt);  // BUS = DATA
  for(uiCnt = 0 ; uiCnt <4500; ++uiCnt);  // BUS = VALID DATA  
  *AT91C_PIOA_CODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <4500; ++uiCnt);  // EN = LOW  
  
  
return;
}

void LCD_Data(unsigned char ucData) 
{
  
volatile unsigned int uiCnt;  
  
  *AT91C_PIOA_CODR 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  // LOW  
  *AT91C_PIOA_SODR = LCD_CAL_INST(ucData);  
  
for(uiCnt = 0 ; uiCnt <14; ++uiCnt);  // ALL INIT
  *AT91C_PIOA_SODR = LCD_RS; 
  
for(uiCnt = 0 ; uiCnt <13; ++uiCnt);  // RS = HIGH
  *AT91C_PIOA_SODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <15; ++uiCnt);  // EN = HIGH
  for(uiCnt = 0 ; uiCnt <13; ++uiCnt);  // BUS = DATA
  for(uiCnt = 0 ; uiCnt <13; ++uiCnt);  // BUS = VALID DATA  
  *AT91C_PIOA_CODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <13; ++uiCnt);  // EN = LOW  

  return;
}

void LCD_Print(const unsigned char * ucString) 
{
  
while(0 !=  *ucString)
  {
    LCD_Data(*ucString);
    ++ucString;
  }
  
  
return;
}

void LCD_Init(void)
{
  
volatile unsigned int uiCnt;  
  
  
//*PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; // 0번지 X => ASSEM
  //AT91C_BASE_PIOA->PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;   
  *AT91C_PIOA_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; 
  *AT91C_PIOA_OER 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN; 
  *AT91C_PIOA_PPUDR 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  
  
  
for(uiCnt = 0 ; uiCnt <50; ++uiCnt);

  LCD_Inst(LCD_INST_FUNC);
  LCD_Inst(LCD_INST_DSP);
  LCD_Inst(LCD_INST_ENT);
  LCD_Inst(LCD_INST_CUR);
  LCD_Inst(LCD_INST_CLR);
  LCD_Inst(LCD_INST_HOME);  

  
  
return;
}


=P20


<하버드 구조>

-AVR


<폰노이만 구조>

-ARM





'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150729  (0) 2015.07.30
20150728  (0) 2015.07.28
20150724  (0) 2015.07.26
20150723  (0) 2015.07.23
20150722  (0) 2015.07.23
Posted by ahj333
,

==========================================================================================

NETWORK

==========================================================================================




<NETWORK>



=TCP 







=

http://www.ktword.co.kr/abbr_view.php?nav=&m_temp1=2437&id=1103


. CODE BITS
  URG (1 bit) – URGENT POINTER 필드가 유효
  ACK (1 bit) – ACKNOWLEDGMENT필드를 유효
  PSH (1 bit) – 세그먼트 PUSH를 요청
  RST (1 bit) – 즉시 연결을 끊음(비정상적인 종료)
  SYN (1 bit) – sequence numbers 동기화
  FIN   (1 bit) – 정상적인 종료



<NETWORK>



=TCP 







=

http://www.ktword.co.kr/abbr_view.php?nav=&m_temp1=2437&id=1103


. CODE BITS
  URG (1 bit) – URGENT POINTER 필드가 유효
  ACK (1 bit) – ACKNOWLEDGMENT필드를 유효
  PSH (1 bit) – 세그먼트 PUSH를 요청
  RST (1 bit) – 즉시 연결을 끊음(비정상적인 종료)
  SYN (1 bit) – sequence numbers 동기화
  FIN   (1 bit) – 정상적인 종료


<PACKET.C>

#include <stdio.h>
#include <netinet/in.h>
#include <pcap/pcap.h>
#include <net/ethernet.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

#define PORT 7777

int main(void)
{
  char*           cpNICName;
  char           caErrMSG[PCAP_ERRBUF_SIZE];
  int           iCnt;
  unsigned char const *   ucpData;
  pcap_t*         stpDS;
  struct pcap_pkthdr     stInfo;
  struct tcphdr *     stTcp;
  struct ip *        stpIp;  


  cpNICName = pcap_lookupdev(caErrMSG);

  if(0 == cpNICName)
  {
    printf("ERRMSG  : [%s]\n",caErrMSG);
    return 100;
  }

  stpDS = pcap_open_live(cpNICName, ETH_DATA_LEN, 10, caErrMSG);

  printf("Packet Monitoring Start....\n");
  getchar();

  while(1)
  {
    ucpData = pcap_next(stpDS, &stInfo);

    if(ETH_P_IP != ntohs(*(unsigned short*)(ucpData+12))) // 2byte 주소
    {
      continue;
    }

    if(IPPROTO_TCP != *(ucpData+23))
    {
      continue;
    }
  

    stpIp = (struct ip *) (ucpData + sizeof(struct ether_header));
    stTcp = (struct tcphdr *)(ucpData + sizeof(struct ether_header) 
        + ((*(ucpData+ sizeof(struct ether_header)) & 0x0F) * 4));

    if(PORT != ntohs(stTcp -> source))
    {
      if(PORT != ntohs(stTcp -> dest))
      {
        continue;
      }
    }
    printf("===================================================\n");
    printf("[%s:%d] ---> ",
        inet_ntoa(stpIp -> ip_src)
        , ntohs(stTcp -> source)
        );

    printf("[%s:%d]\n",
        inet_ntoa(stpIp -> ip_dst)
        , ntohs(stTcp -> dest)
        );

    printf("SYN[%d] ACK[%d] FIN[%d] Seq[%010u] Ack[%010u]\n"
        , stTcp -> syn
        , stTcp -> ack
        , stTcp -> fin
        , ntohl(stTcp -> seq)
        , ntohl(stTcp -> ack_seq)
        );
  }

  pcap_close(stpDS);

  return 0;
}



=CLIENT

















=CLIENT











= 연결


-3-way handshake








= 종료

( 소스 : SERVER에서 먼저 CLOSE() 호출 )






-FIN









=채팅



-스레드


-client : read() (키입력)- blocking 상태에서 server에서 패킷 보내면 문제생김(못받음)



1. 멀티프로세스

2. 멀티스레드

3. 입력다중화


=멀티프로세스

-과거 ( singlecore - 동시 실행 X )

-현재 ( dualcore이상 - 동시 실행 O )



=fork


<FORK.C>


#include <stdio.h>
#include <unistd.h>
#include <errno.h>

int main()
{
    
int iNum;

    iNum 
= fork(); // 호출한 순간 2개가 됨 ( 자식 iNum== 0 |  부모 iNum>0)
    if(0 > iNum)
    {
        perror(
"fork() fail :");
        
return 1;
    }
    
if(0 == iNum)
    {
        printf(
"CHILD PROCESS\n");
        getchar();
        printf(
"자식프로세스 종료 직전\n");
    }
    
else
    {
        printf(
"PARENT PROCESS\n");
        getchar();
        printf(
"부모프로세스 종료 직전\n");
    }
    
return 0;
}



-PROCESS IDENTIFY


ps -aux | grep fork


| - 파이프 ( 왼쪽결과를 오른쪽으로 넘겨줌)











=키보드









=키보드 입력











=execl : exe실행



=클라이언트 2개 ( 받기 | 보내기 )



=CLIENT

















=CLIENT











= 연결


-3-way handshake








= 종료

( 소스 : SERVER에서 먼저 CLOSE() 호출 )






-FIN









=채팅



-스레드


-client : read() (키입력)- blocking 상태에서 server에서 패킷 보내면 문제생김(못받음)



1. 멀티프로세스

2. 멀티스레드

3. 입력다중화


=멀티프로세스

-과거 ( singlecore - 동시 실행 X )

-현재 ( dualcore이상 - 동시 실행 O )



=fork


<FORK.C>


#include <stdio.h>
#include <unistd.h>
#include <errno.h>

int main()
{
    
int iNum;

    iNum 
= fork(); // 호출한 순간 2개가 됨 ( 자식 iNum== 0 |  부모 iNum>0)
    if(0 > iNum)
    {
        perror(
"fork() fail :");
        
return 1;
    }
    
if(0 == iNum)
    {
        printf(
"CHILD PROCESS\n");
        getchar();
        printf(
"자식프로세스 종료 직전\n");
    }
    
else
    {
        printf(
"PARENT PROCESS\n");
        getchar();
        printf(
"부모프로세스 종료 직전\n");
    }
    
return 0;
}



-PROCESS IDENTIFY


ps -aux | grep fork


| - 파이프 ( 왼쪽결과를 오른쪽으로 넘겨줌)











=키보드









=키보드 입력











=execl : exe실행



=클라이언트 2개 ( 받기 | 보내기 )








'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150728  (0) 2015.07.28
20150727  (0) 2015.07.27
20150723  (0) 2015.07.23
20150722  (0) 2015.07.23
20150721  (0) 2015.07.22
Posted by ahj333
,