'Busan IT'에 해당되는 글 330건

  1. 2015.08.12 ARM USART(2)
  2. 2015.08.11 ARM USART
  3. 2015.08.10 IPC(3)
  4. 2015.07.31 AIC(2)
  5. 2015.07.29 Interrupt
  6. 2015.07.28 채팅 멀티프로세스
  7. 2015.07.24 Three-way Handshake, fork 함수, execl 함수
  8. 2015.07.23 AT91SAM7S256 데이터 시트, LCD 코딩
  9. 2015.07.22 TCP analyzer
  10. 2015.07.21 AT91SAM7S254회로도, LED불켜기
Busan IT/ARM Controller2015. 8. 12. 17:02

==================================Outline====================================

ARM USART(2)

----------------------------------------------------------------------------

 데이터 시트에 있는 DBGU 레지스터를 보고 데이터 송수신을 위한 코딩을 해보자.







  

/*** 코드 ***/

<DBGU.c>

#include <project.h>

void DBGU_Init()      //initiating
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter    
}

unsigned char DBGU_RX()
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) );  //reciever inactive status holding here

  return *AT91C_DBGU_RHR;    //Data read from DBGU_RHR register  
}

void DBGU_TX(char ucData)
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) );  //transmitter inactive status holding here

  *AT91C_DBGU_THR = ucData;    //put data into THR register

  return;
}


 <main.c>


#include <project.h>

int main(void)
{

  LCD_Init();
  DBGU_Init();
  
  while (1)
  {
    LCD_Data(DBGU_RX() );
  }


  
  return 0;
}

 

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Interrupt Code, 초음파 센서 SRF05, Timer/Counter  (0) 2015.08.19
ARM UART Interrupt  (0) 2015.08.14
ARM USART  (0) 2015.08.11
AIC(2)  (0) 2015.07.31
Interrupt  (0) 2015.07.29
Posted by newind2000
Busan IT/ARM Controller2015. 8. 11. 17:42

==================================Outline====================================

ARM USART

----------------------------------------------------------------------------

 

ARM USART

 

DMA(Direct Memory Access)

일반적으로 데이터를 한 메모리에서 다른 메모리로 옮길 때는 CPU를 사용하여야 한다. 하지만 CPU가 연산이 아닌 단순 데이터 이동에만 사용되는 것을 막기 위해 DMA Controller를 사용하여 단순 메모리 이동 작업을 한다.

 

 

Local loopback은 내부적인 가상 LAN이다. 기본 USART모드에 추가하여 상위 3가지 모드를 사용할 수 있다.

 

USART를 사용하기 위한 초기화 설정을 해보자.

 

reset 값이 ‘-’면 리셋시 랜덤 값을 가진다는 의미이다.

 

void DBGU_Init()
{
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RXDIS | AT91C_US_TXDIS; //Transmitter&Reciever Disable

}







 

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

ARM UART Interrupt  (0) 2015.08.14
ARM USART(2)  (0) 2015.08.12
AIC(2)  (0) 2015.07.31
Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
Posted by newind2000
Busan IT/공장내 Network2015. 8. 10. 17:30

==================================Outline====================================

shmget 함수 - 공유 메모리 생성

shmat 함수

세마포어(임계영역에 대한 베타적인 권한)

시그널 - 소프트웨어 인터럽트

----------------------------------------------------------------------------

 

shmget 함수 - 공유 메모리 생성


 

리눅스에서 파일에 대한 권한을 살펴보면 Read-Write-Execute로 순서로 소유자, 그룹, 나머지에게 주어진 권한을 표시해준다. 이것을 2진수 개념으로 표시하여 각 권한 대상자에게 최대 7, 최소 0의 값이 주어진다.(권한 부여 = 1, 아닐 시 = 0)

 

shmat 함수


 

세마포어(임계영역에 대한 베타적인 권한)

 

동시에 제한된 자원을 할당받으려 할 때, 중복을 막기 위해 도입된 개념이 세마포어이다.

공유 메모리나 파이프 방식은 동시 접속을 통해 자원을 할당 받기 때문에 같은 자원을 요청할 경우 문제가 발생할 수 있다. 이를 해결하기 위한 도입된 개념이 동기화이다.

 

//kerner을 통해 세마포어를 사용하기 때문에 embedded MCU는 세마포어의 개념이 없다.

 

시그널 - 소프트웨어 인터럽트

 

ctrl + C 를 눌렀을 때 시그널을 활용하여 특정한 함수가 실행되도록 해보자.

 

리눅스에서 프로그램을 강제로 종료시킬 때

 

우선 실행중인 프로세스들을 본다.

 

ps -al

 

kill 명령어를 사용하여 죽여도 죽지 않으면

 

kill -9 “pid" 





 

반응형
Posted by newind2000
Busan IT/ARM Controller2015. 7. 31. 16:05

==================================Outline====================================

AIC(Advanced Interrupt Controller)

----------------------------------------------------------------------------

Psudo Code(의사코드)에 맞춰서 AIC_Init 계속해서 코딩

 

핸들러를 등록하는 코드에서 AIC_SVR은 인터럽트가 존재하는 소스코드의 주소를 입력해 주어야 한다.

PIO로 입력을 받게 되고 함수의 주소를 넣으려면 함수의 이름을 괄호(‘()’) 없이 써주면 되기 때문에 코드는 아래와 같다.

 

AT91C_AIC_SVR[AT91C_ID_PIOA] = (unsigned int)HANDLER;

핸들러로 넘어와서...





Handler함수에서는 인터럽트가 발생할 시 수행하고 싶은 코드를 입력한다.

#include <AIC.h>
#include <AT91SAM7S256.h>



void LED_Wink(unsigned int uiPort)
{
  volatile unsigned int iCount;
  while (1)
  {
    *AT91C_PIOA_SODR = uiPort; //SET으로 바꾸고 싶은 자리에 1을 넣으면 high로 바뀐다.
               //다른 비트에는 영향을 미치지 않는다.

    for(iCount=0;1000000 >= iCount; ++iCount);

    *AT91C_PIOA_CODR = uiPort; //SET으로 바꾸고 싶은 자리에 1을 넣으면 low로 바뀐다.
               //다른 비트에는 영향을 미치지 않는다.
  

    for(iCount=0;1000000 >= iCount; ++iCount);
  }
}
void HANDLER(void)
{
  volatile unsigned int uiIsr;
  volatile unsigned int uiCnt;

  uiIsr = *AT91C_PIOA_ISR;  //인터럽트 핀 정보 저장 
  if(0 != (uiIsr && (1<< INT_PIN) ) )
  {    
    LCD_Init();    
  }

  for(uiCnt=01000000>uiCnt; ++uiCnt);  //인터럽트 중복 방지 장치

  uiIsr = *AT91C_PIOA_ISR;  //ISR 레지스터 클리어
  *AT91C_AIC_EOICR = 0;  // End Code, no effect but insisted.

  return;  
}


void AIC_Init()  
{
  LCD_Init();    //LCD initiating
  
  *AT91C_PMC_PCER       = 1   <<   AT91C_ID_PIOA;   //전원공급(PIOA)활성화 - 데이터 시트 33PAGE
  *AT91C_PIOA_PER   = 1   <<   INT_PIN | 1 << 0x0A;//핀 활성화 - 데이터 시트 248PAGE
  *AT91C_PIOA_ODR   = 1   <<   INT_PIN | 1 << 0x0A;//핀 출력 비활성화
  *AT91C_PIOA_IDR   = 1   <<   INT_PIN;     //인터럽트 핀 비활성화
  *AT91C_PIOA_IFER   = 1  <<   INT_PIN;     //PIOA 입력 필터 활성화(잡음 제거 필터)

  *AT91C_AIC_IDCR  = 1  <<   AT91C_ID_PIOA;  //인터럽트 핀 커맨드 비 활성화
  *AT91C_AIC_ICCR  = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 클리어
  *AT91C_AIC_ISCR    = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 셋
  AT91C_AIC_SVR[AT91C_ID_PIOA] 
            =  (unsigned int)HANDLER;  //핸들러 등록 (7/29 여기까지)
  AT91C_AIC_SMR[AT91C_ID_PIOA]
            = AT91C_AIC_SRCTYPE_POSITIVE_EDGE  | 
               AT91C_AIC_PRIOR_LOWEST  ;  //동작 모드 및 우선순위 결정 

  
  *AT91C_PIOA_IER   = 1   <<   INT_PIN;      //인터럽트 핀 인터럽트 활성화  
  *AT91C_AIC_IECR    = 1   <<  AT91C_ID_PIOA;  //AIC 인터럽트 핀 인터럽트 활성화
  
            
  
  
  return;
}


 

 

 

 

 

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

ARM USART(2)  (0) 2015.08.12
ARM USART  (0) 2015.08.11
Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
Posted by newind2000
Busan IT/ARM Controller2015. 7. 29. 17:40

==================================Outline====================================

Interrupt

----------------------------------------------------------------------------

Interrupt

 

 

ARM은 전형적인 폰노이먼 구조를 띈다.

 

// PMC(Power Management Controller)

 

// AIC(Advanced Interrupt Controller)

 

Interrupt를 사용해 보자.




FIQIRQ보다 속도가 빠르다.

High-drive는 최대 16mA전류를 방출할 수 있다.

//나머지 핀들은 8mA이다.

 

총 핀들의 방출 전류의 합은 150mA를 넘을 수 없다.

 

ARM에서는 인터럽트 함수 이름을 사용자가 정의할 수 있다.

//ATmega는 인터럽트 함수 이름이 정의되어 있다.

 

C에서 함수 자체는 주소 값을 뜻함으로 interrupt의 주소에 사용자가 만든 함수를 넣으면 사용자가 작성한 함수가 호출되게 된다.

 

//ATmegaARM의 인터럽트 사용법이 다른 이유는 사용하는 core가 다르기 때문이다.

 

검출 모드 설정(트리거 설정)



 

FIQ가 가장 우선시 되고 PRIOR7이 우선순위이고 0으로 갈수록 우선순위가 낮아진다.

 

 

IRQID: Current Interrupt Identifier

The Interrupt Status Register returns the current interrupt source number.

 

PID 2번에 맞춰서 짜겠다.

 

PSUDO CODE란 인간이 인지할 수 있는 문장으로 어떠한 코드를 작성할 것인지 적어 놓은 것이다.


주어진 PSUDO CODE에 따른 코드는 다음과 같다.


#include "AIC.h"
#include "AT91SAM7S256.h"

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

  if()
  {
  
  }

  for(uiCnt=01000000>uiCnt; ++uiCnt);

  return;  
}


void AIC_Init()  
{
  *PMC_PCER       = 1   <<   AT91C_ID_PIOA;   //전원공급(PIOA)활성화 - 데이터 시트 33PAGE
  *AT91C_PIOA_PER   = 1   <<   INT_PIN;      //핀 활성화 - 데이터 시트 248PAGE
  *AT91C_PIOA_ODR   = 1   <<   INT_PIN;       //핀 출력 비활성화
  *AT91C_PIOA_IDR   = 1   <<   INT_PIN;       //인터럽트 핀 비활성화
  *AT91C_PIOA_IFER   = 1  <<   INT_PIN;       //PIOA 입력 필터 활성화(잡음 제거 필터)

  *AT91C_AIC_IDCR  = 1  <<   AT91C_ID_PIOA;  //인터럽트 핀 커맨드 비 활성화
  *AT91C_AIC_ICCR  = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 클리어
  *AT91C_AIC_ISCR    = 1  <<   AT91C_ID_PIOA;  //커맨드 레지스터 셋
  AT91C_AIC_SVR[AT91C_ID_PIOA] 
            =  (unsigned int)HANDLER;  //핸들러 등록 (7/29 여기까지)  
  
  return;
}




반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

ARM USART  (0) 2015.08.11
AIC(2)  (0) 2015.07.31
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
ARM 데이터시트 및 소스파일 분석  (0) 2015.07.20
Posted by newind2000
Busan IT/공장내 Network2015. 7. 28. 17:34

==================================Outline====================================

채팅 멀티프로세스

----------------------------------------------------------------------------

채팅 멀티프로세스 

리눅스에서는 프로그램의 리턴 값이 저장되고 echo $? 명령어를 사용하여 그 return 값을 출력할 수 있다.

//아무 일도 수행하지 않는 프로세스를 좀비 프로세스라고 한다.

 

fork함수를 사용하여 서버와 클라이언트의 멀티 프로세스 작업을 해보자.

 

우선 fork를 사용하기 위해여 헤더파일이 <unistd.h>를 추가해준다.

 

다음 fork함수의 리턴 값을 받기 위해 타입이 정의된 pid_t 변수를 하나 선언해 준다.

 

fork함수의 리턴 값이 0보다 크면 부모 프로세스이고 이 값은 프로세스 ID를 반환한다.

반면에 자식 프로세스는 0을 반환한다.

 

 

 

우선 fork함수를 통하여 클라이언트에서 쓰기/읽기를 분리하자.

writeread함수 무한 while문 전에 fork 함수를 사용하여 프로세스를 복사한다.

부모 프로세스에는 읽기/자식 프로세스는 쓰기만 하도록 if문을 사용하여 분리해준다.

 

 

서버에서는 랑데부 소켓(클라이언트 연결 전용)과 커뮤니케이션 소켓(통신전용)을 사용한다.

if문을 사용하여 분리한다.

 

/*** 소스 ***/


<server.c>

#include "smartsock.h"
#include <unistd.h>

int main(void)
{
  int iSock;   //소켓 함수의 반환 값을 받는 변수
  int icSock;   //accept의 반환 값을 받는 변수
  int iRet;
  struct sockaddr_in stAddr;
  socklen_t uiSockLen=sizeof(struct sockaddr);
  char cBuff[BUF_SIZE];
  const char * cP;
  pid_t pid;

  iSock = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET = 2, 
  if(0 > iSock)
  {
    perror("socket : ");
    return -1;
  }
  // stAddr구조체에 socket연결을 위한 필수 정보 입력  setting
  bzero(&stAddr, sizeof(stAddr));            //구조체 비우기(0으로 채우기)
  stAddr.sin_family = AF_INET;               //#define AF_INET 2 /* IP protocol family. */
  stAddr.sin_addr.s_addr = inet_addr(IP);    //IP와 PORT값은 헤더파일에 정의되어 있다.
  stAddr.sin_port = htons((PORT));

  iRet = bind(iSock, (struct sockaddr *)&stAddr,sizeof(stAddr));
  if(iRet < 0)
  {
    perror("bind : ");
    close(iSock);

    return -2;
  }
  iRet = listen(iSock, 5);
  if(iRet != 0)
  {
    perror("listen : ");
    close(iSock);

    return -3;
  }
  while(1
  {
    icSock = accept(iSock, (struct sockaddr *)&stAddr, &uiSockLen); //접속자의 정보가 stAddr에 입력된다.

    if(icSock < 0)
    {
      perror("Accept : ");
      close(iSock);

      return -4;
    }
/////////////////////////////멀티 프로세스///////////////////////////////////////////
    pid = fork();

    if(pid ==  0)  //자식 프로세스이면 while문 break
    {
      break;
    }
  }
  close(iSock);

  printf("Incoming Client \n");
  //cP = inet_ntoa(stAddr.sin_addr);
  printf("Client IP :%s\n", inet_ntoa(stAddr.sin_addr));
  printf("Client Port : %d\n", ntohs(stAddr.sin_port));  

  write(icSock, "Welcome :)"sizeof("Welcome :)"));

  while(1)
  {
    read(icSock, cBuff, MSG_SIZE);
    printf("[client]: [%s]\n", cBuff);

    write(icSock, cBuff, MSG_SIZE);
    if(0 == strncmp(MSG_END, cBuff, strlen(MSG_END) ) )
      break;

  }
  close(icSock);
  return 0;
}

<client.c>

#include "smartsock.h"
#include <unistd.h>

int main(void)
{
  struct sockaddr_in stAddr;
  int iSock;
  int iRet;
  char cBuff[BUF_SIZE];
  socklen_t uiSockLen=sizeof(struct sockaddr);
  pid_t pid;

  iSock = socket(AF_INET, SOCK_STREAM, 0);
  if(0 > iSock)
  {
    perror("socket : ");
    return -1;
  }

  bzero(&stAddr, sizeof(stAddr));
  stAddr.sin_family = AF_INET;

  stAddr.sin_addr.s_addr = inet_addr("192.168.0.173");
  stAddr.sin_port = htons((PORT));

  iRet = connect(iSock, (struct sockaddr *)&stAddr, uiSockLen);
  if(0 > iRet)
  {
    perror("connect : ");
    return -2;
  }

  pid = fork();

  if(pid > 0)
  {
    close(0);
    while(1)
    {
      read(iSock, cBuff, MSG_SIZE);
      printf("[server]: [%s]\n", cBuff);

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

  }
  else
  {
    close(1);
    while(1)
    {
      iRet = read(0, cBuff, MSG_SIZE);
      cBuff[iRet-1= 0;
      write(iSock, cBuff, MSG_SIZE);

    }

  }

  close(iSock);
  return 0;
}

 

여러 개의 클라이언트가 접속했음을 알 수 있다.





멀티 프로세서 분리된 서버/클라이언트의 통신은 가능하지만 서버 간의 통신이 없기 때문에 분리된 클라이언트들은 다른 클라이언트가 서버로 보낸 메시지를 볼 수 없다. 때문에 PIC(Internal Process Communication)이 필요하다.

 

To be continued...

 

반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

Hacker School level 1, VMware 해커스쿨 서버 설치  (0) 2015.08.13
IPC(3)  (0) 2015.08.10
Three-way Handshake, fork 함수, execl 함수  (0) 2015.07.24
TCP analyzer  (0) 2015.07.22
TCP analyzer(진행 중)  (0) 2015.07.17
Posted by newind2000
Busan IT/공장내 Network2015. 7. 24. 17:35

================================ Outline ====================================

Three-way Handshake

fork 함수

execl 함수

----------------------------------------------------------------------------

 

Three-way Handshake

 

 

서로 SYNC번호를 주고 받음으로써 serverclient의 통신 여부를 확인하는 절차다. client에서 SYNC번호를 보내면 server에서는 SYNC 번호를 확인하고 자신의 SYNC번호도 client에게 보내게 된다. SYNC번호를 확인했다는 뜻으로 전송 받은 SYNC번호에 1을 더하여 ACK번호로 client에게 보내게 된다. Clientserver에게 보낸 SYNC번호를 확인했다는 뜻으로 SYNC번호에 1을 더한 것을 ACK로 보내면 통신이 연결되게 된다.

 

 

connectaccept에서 일어난다.

 

 

연결 종료 시에는 serverFIN flagset을 입력하여 전송하고 client가 이를 받고난 후 FIN flagset를 시켜 다시 서버에게 전송하게 된다.

close에서 일어난다.

 

 

 

채팅 프로그램을 계속해서 만들어보자.

 

채팅 시 clientserver가 작성 중이라도 상대방이 전송한 내용을 읽어 들여야 하기 때문에 이를 해결 위해 스레드 혹은 멀티 프로세스를 사용해야 한다.

 

교재 p/227 ch.10 멀티 프로세스 소켓 프로그래밍

 

//프로젝트를 실행할 때 단위테스트(새롭게 사용하는 함수, 실행단위)를 거치고 난 후 테스트가 성공해야 코딩을 지속한다.

 

fork 함수

 

fork함수를 테스트해보자.

 

 

 

 

/*** 소스 ***/

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

int main(void)
{
  int iNum;
   iNum = fork();  //multy process init

  if(0 >  iNum)
  {
    perror("fork::");
    return -1;
  }
  else if(0 == iNum)
  {
    printf("Child Process\n");
    getchar();
    printf("Child About to abort\n");
  }
  else
  {
    printf("Parent Process ID[%d]\n", iNum);
    getchar();
    printf("Parent About to abort\n");

  }

  return 0;
}  

 

fork함수의 속성

 

- 지역 변수 값 및 전역 변수 값은 복사된다.

- 소켓을 포함한 모든 열린 파일의 파일 지정번호가 복사된다.

- 부모프로세스나 자식프로세스가 중 하나가 종료 되었을 때 남은 프로세스에게 신호(signal)을 보낸다.

 

 

execl 함수

 

execl 함수는 외부 프로그램을 멀티 프로세스를 통해 실행시켜주는 함수이다.

 

/*** 소스 ***/

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

int main(void)
{
  printf("--------start--------\n");
  execl("/bin/ls""ls", NULL);
  printf("---------end---------\n");



  return;

}

 


반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

IPC(3)  (0) 2015.08.10
채팅 멀티프로세스  (0) 2015.07.28
TCP analyzer  (0) 2015.07.22
TCP analyzer(진행 중)  (0) 2015.07.17
TCP 추출(진행중)  (0) 2015.07.16
Posted by newind2000
Busan IT/ARM Controller2015. 7. 23. 17:42

================================ Outline ====================================

AT91SAM7S256 데이터 시트

LCD 코딩 

----------------------------------------------------------------------------

 

AT91SAM7S256 데이터 시트

 

5V-tolerant I/Os, including Four High-current Drive I/O lines, Up to 16 mA Each (SAM7S161/16 I/Os Not 5V-tolerant)

 

- ARM3.3V전압을 인가 받지만 5V 전압도 견딜 수 있게 설계되어 있다.

 

우리가 사용하는 character LCD5V를 사용하지만 다행히 ARM에서 인가하는 3.3V도 작동한다.

 

//현재 사용하고 있는 Character LCDback light 연결을 위해서 15pinGND

//16pinGCC(5V)이다.

 

assembly에서 ‘\’를 사용하면 엔터 입력 시 다음 줄이 이전 줄에 줄맞춤 된다.

 

 

 

AT91SAM7S256.h에서 PIOdefine 된 값을 찾아보자.

 

LCD 코딩

Assembly로 정의될 때만 PIO_PER를 쓸 수 있을 뿐만 아니라 주소 값도 datasheet에서 본 FFFFF400이 아님을 알 수 있다.

 

우리가 찾는 FFFFF400값을 검색해서 찾아보자.

 

 

#ifndef __ASSEMBLY__

typedef volatile unsigned int AT91_REG;// Hardware register definition

#define AT91_CAST(a) (a)

#else

#define AT91_CAST(a)

#endif

 

Assembly가 아님으로 밑에 #define AT91_CAST(a) (a) 값이 작동하며 본래 그대로의 값임을 알 수 있다.

 

AT91_REG * typedef volatile unsigned int 이다.


타이밍도를 보고 딜레이를 주어 코딩을 해보자.




#include <AT91SAM7S256.h>
#include "LCD.h"

volatile unsigned int uiCnt;

#define Delay(x) for(uiCnt = 0; uiCnt < x; ++uiCnt)
#define LCD_FAR_INST(x) (    ((x))  << 16  & (LCD_BUS)       );
void LCD_Init()
{    
  //*PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  //Assembly code
  *AT91C_PIOA_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  
  //AT91C_BASE_PIOA->PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  
  *AT91C_PIOA_PPUDR = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  
}

void LCD_Inst(unsigned int uiInst)
{
  //initiatation in reference with timing map

  *AT91C_PIOA_CODR = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  //all pin low :: all init
  Delay(100000);
  Delay(100000);

  *AT91C_PIOA_SODR = LCD_EN;    //only enable high

  Delay(100000);
  Delay(100000);     
  
  *AT91C_PIOA_SODR = LCD_FAR_INST(uiInst);  //input data
  
  Delay(100000);
  Delay(100000);    

  *AT91C_PIOA_CODR = LCD_EN;    //only enable low

  Delay(100000);    
  Delay(100000);      
}


반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

AIC(2)  (0) 2015.07.31
Interrupt  (0) 2015.07.29
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
ARM 데이터시트 및 소스파일 분석  (0) 2015.07.20
ARM Compiler/Cygwin 설치  (0) 2015.07.17
Posted by newind2000
Busan IT/공장내 Network2015. 7. 22. 17:43

================================ Outline ====================================

TCP analyzer

----------------------------------------------------------------------------




 

접속 시 SYN1이 연속으로 두 번 캡쳐 된다.

 /*** 소스 ***/

 

#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>

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));

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

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

  pcap_close(stpDS);

  return 0;
}


 

Three-way Hand Shake... yeah

 

 

 

 

반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

채팅 멀티프로세스  (0) 2015.07.28
Three-way Handshake, fork 함수, execl 함수  (0) 2015.07.24
TCP analyzer(진행 중)  (0) 2015.07.17
TCP 추출(진행중)  (0) 2015.07.16
Echo Server/Client  (0) 2015.07.15
Posted by newind2000
Busan IT/ARM Controller2015. 7. 21. 17:27

================================ Outline ====================================

AT91SAM7S254회로도 

LED불켜기

----------------------------------------------------------------------------

AT91SAM7S254회로도 


http://www.devicemart.co.kr/5713 에서 회로도를 다운로드 받는다.




 

 

 

 

regulator - 전압을 규칙적으로 공급해주는 소자

Regulator에서 남은 전압은 열로 방출되기 때문에 발열이 발생한다.

발열이 많은 소자는 보드에서 떨어뜨린 후(플라스틱을 사용하여 이격) 납땜을 한다.




LED 불켜기


LED에 불을 켜는 코딩을 해보자.


소스를 컴파일 한 후 arm을 USB 포트에 연결하여 pc에 끼운다.


Sam-ba를 실행한다.


컴파일 된 flash용 bin파일을 올려준다.








/*** 소스 ***/


#define  PIO_PER    (*((volatile unsigned int *)0xFFFFF400))  //PIO enable register
#define  PIO_PDR    (*((volatile unsigned int *)0xFFFFF404))
#define  PIO_PSR    (*((volatile unsigned int *)0xFFFFF408))
#define  PIO_OER    (*((volatile unsigned int *)0xFFFFF410))
#define  PIO_ODR    (*((volatile unsigned int *)0xFFFFF414))
#define  PIO_OSR    (*((volatile unsigned int *)0xFFFFF418))
#define  PIO_IFER  (*((volatile unsigned int *)0xFFFFF420))
#define  PIO_IFDR  (*((volatile unsigned int *)0xFFFFF424))
#define  PIO_IFSR  (*((volatile unsigned int *)0xFFFFF428))
#define  PIO_SODR  (*((volatile unsigned int *)0xFFFFF430))
#define  PIO_CODR  (*((volatile unsigned int *)0xFFFFF434))
#define  PIO_ODSR  (*((volatile unsigned int *)0xFFFFF438))
#define  PIO_PDSR  (*((volatile unsigned int *)0xFFFFF43C))
#define  PIO_IER    (*((volatile unsigned int *)0xFFFFF440))
#define  PIO_IDR    (*((volatile unsigned int *)0xFFFFF444))
#define  PIO_IMR    (*((volatile unsigned int *)0xFFFFF448))
#define  PIO_ISR    (*((volatile unsigned int *)0xFFFFF44C))
#define  PIO_MDER  (*((volatile unsigned int *)0xFFFFF450))
#define  PIO_MDDR  (*((volatile unsigned int *)0xFFFFF454))
#define  PIO_MDSR  (*((volatile unsigned int *)0xFFFFF458))
#define  PIO_PUDR  (*((volatile unsigned int *)0xFFFFF460))
#define  PIO_PUER  (*((volatile unsigned int *)0xFFFFF464))
#define  PIO_PUSR  (*((volatile unsigned int *)0xFFFFF468))
#define  PIO_ASR    (*((volatile unsigned int *)0xFFFFF470))
#define  PIO_BSR    (*((volatile unsigned int *)0xFFFFF474))
#define  PIO_ABSR  (*((volatile unsigned int *)0xFFFFF478))
#define  PIO_OWER  (*((volatile unsigned int *)0xFFFFF4A0))
#define  PIO_OWDR  (*((volatile unsigned int *)0xFFFFF4A4))
#define  PIO_OWSR  (*((volatile unsigned int *)0xFFFFF4A8))

int main()
{
  volatile unsigned int iCount = 0;
  
  PIO_PER = 0x00000003;  //0,1번 핀을 활성화 시킨다.
  PIO_OER = 0x00000003;  //0,1번 핀을 출력 시킨다.
  

  

  while (1)
  {
    PIO_SODR = 0x00000003//SET으로 바꾸고 싶은 자리에 1을 넣으면 high로 바뀐다.
               //다른 비트에는 영향을 미치지 않는다.

    for(iCount=0;1000000 >= iCount; ++iCount);

    PIO_CODR = 0x00000003//SET으로 바꾸고 싶은 자리에 1을 넣으면 low로 바뀐다.
               //다른 비트에는 영향을 미치지 않는다.
  

    for(iCount=0;1000000 >= iCount; ++iCount);
  }  


  return 0;
}




cstartup.S


elf32-littlearm.lds


lowlevel.c


main.c


Makefile



반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
ARM 데이터시트 및 소스파일 분석  (0) 2015.07.20
ARM Compiler/Cygwin 설치  (0) 2015.07.17
AT91SAM7S256 데이터시트, 드라이버 설치  (0) 2015.07.16
Posted by newind2000