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

ASSEMBLY

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



=STATEMENTS (소스 코드, 명령어)

name          mnemonic      operand(s)     ;comment

: ZeroCount    mov            ecx, 0          ; initialize count to zero


                mnemonic      operand(s)                             => 보통 사용 형태

:               add            eax, 158                               => name, 주석 X

: addLoop:     add            eax, 158                               => 주석 X

:               jmp            addLoop       ; repeat addition       => name X

: EndIfBlank:                                                           => name 만 있음



=DIRECTIVE ( .~ ) : 어셈블러에게 전달

.NOLIST

: .386          ; 이 프로그램 실행은 최소 386이상 프로세서에서 동작

: .MODEL FLAT ; 메모리 영역구분없이 나열 되어있다(<->SEGMENT)



=함수

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD (정리 후 종료됨 : 반드시 사용(초보자))



= INCLUDE

: INCLUDE io.h          ;#include <io.h>


=16진수 

: 0~h                  ; 0x0~




=컴파일러 설치






=컴파일


1. obj 생성

ml /c /coff 소스파일명









=실행파일 생성

link /subsystem:console /entry:start /out:실행파일명 obj파일명 io.obj kernel32.lib








=.CODE


1.

 .CODE
_start:            ; entry point
  output  prompt1        ; 
"io.h"에서 정의된 매크로 함수 => printf 호출
  input   string, 
40      ; => scanf : 문자열 입력(40글자까지)
  atod  string        ; 아스키코드문자 
=> DWORD로 변환 => eax에 저장



2.

  mov  number1, eax      ; (대입연산자 =) : number1 = eax;

  output  prompt2        
  input  string, 
40
  atod  string





3.

   mov  number2, eax      ; number2 = eax;

  mov  eax, number1      ; eax 
= number1;
  add  eax, number2      ; eax 
= eax + number2;  // accumulator (ACC)





<main.asm>

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD  ; 함수

INCLUDE io.h

cr  EQU  
0dh                                    ; #define cr 0x01byte
Lf  EQU  
0ah                                    ; #define cr 0x01byte

.STACK  
4096                                   ; stack 4096bytes

.DATA      ; 전역변수
number1 DWORD ?
number2 DWORD ?                             ; DWORD - 
4bytes, ? - 초기화 X

prompt1  BYTE  "Enter first number: ",0  ; 문자열 "~"로 초기화, ,0 - null 추가
prompt2 BYTE  
"Enter secont number: ",0

string  BYTE  40 DUP  (?)                    ; 배열 40bytes, 복사(? - 쓰레기 값)

label1  BYTE  cr, Lf, 
"The sum is "
sum   BYTE  11 DUP  (?)
  BYTE  cr, Lf, 
0                               ; 이름 없이 메모리만 차지
                                                    ; 
1byte + 1byte + 1byte = 3bytes
.CODE
_start:                                             ; entry point
  output  prompt1                              ; 
"io.h"에서 정의된 매크로 함수 => printf 호출
  input   string, 
40                             ; => scanf : 문자열 입력(40글자까지)
  atod  string                                    ; 아스키코드문자 
=> DWORD로 변환 => eax에 저장
  mov  number1, eax                           ; (대입연산자 
=) : number1 = eax;

  output  prompt2        
  input  string, 
40
  atod  string
  mov  number2, eax                           ; number2 
= eax;

  mov  eax, number1                           ; eax 
= number1;
  add  eax, number2                            ; eax 
= eax + number2;  // accumulator (ACC)
  dtoa  sum, eax                                ; DWORD => 아스키코드문자로 sum에 저장
  output  label1                                  ; 변수명이 주소(위치정보)

  INVOKE  ExitProcess, 
0

PUBLIC   _start






-소스코드




<main.asm>

.386
.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD  ; 함수

INCLUDE io.h

cr  EQU  
0dh                                     ; #define cr 0x01byte
Lf  EQU  
0ah                                     ; #define cr 0x01byte

.STACK  
4096                                    ; stack 4096bytes

.DATA      ; 전역변수
number1 DWORD ?
number2 DWORD ?                              ; DWORD - 
4bytes, ? - 초기화 X

prompt1  BYTE  "Enter first number: "      ; 문자열 "~"로 초기화, NULL 없음
prompt2 BYTE  "Enter secont number: ",0


string  BYTE  40 DUP  (?)                     ; 배열 40bytes, 복사(? - 쓰레기 값)

label1  BYTE  cr, Lf, 
"The sum is "
sum   BYTE  11 DUP  (?)
  BYTE  cr, Lf, 
0                                ; 이름 없이 메모리만 차지
                                                    ; 
1byte + 1byte + 1byte = 3bytes
.CODE
_start:                                             ; entry point
  output  prompt1                               ; 
"io.h"에서 정의된 매크로 함수 => printf 호출
  input   string, 
40                             ; => scanf : 문자열 입력(40글자까지)
  atod  string                                    ; 아스키코드문자 
=> DWORD로 변환 => eax에 저장
  mov  number1, eax                           ; (대입연산자 
=) : number1 = eax;

  output  prompt2        
  input  string, 
40
  atod  string
  mov  number2, eax                          ; number2 
= eax;

  mov  eax, number1                          ; eax 
= number1;
  add  eax, number2                           ; eax 
= eax + number2;  // accumulator (ACC)
  dtoa  sum, eax                               ; DWORD => 아스키코드문자로 sum에 저장
  output  label1                                 ; 변수명이 주소(위치정보)

  INVOKE  ExitProcess, 
0

PUBLIC   _start








-소스코드

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

20150824  (0) 2015.08.24
20150821  (0) 2015.08.23
20150819  (0) 2015.08.19
20150818  (0) 2015.08.19
20150817  (0) 2015.08.18
Posted by ahj333
,

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

ARM

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


<ARM>


=

<DBBU.C>


void DBGU_Rx_ISR(void)

  
switch ((*AT91C_DBGU_RHR)&0x000000FF)// 1byte 추출
  {
    
case 'M':  
    
case 'm':      
      DBGU_Menu();
      
break;
    case '1':
      LCD_Inst(LCD_INST_CLR);
      LCD_Print(
"LCD DISPLAY");
      
break;

    
default :
      DBGU_Str(
"Wrong Command\n\r");
      DBGU_Menu();
      
break;
  }
  
return;
}



=‘1’ 전송 => LCD DISPLAY




=센서 : ADC 컨버터 이용

=센서 모듈 : 초음파 센서 SRF05

http://www.robot-electronics.co.uk/htm/srf05tech.htm

http://itsmart333.tistory.com/attachment/cfile26.uf@2406A14355D438B1100CE9.pdf

소리 속도 : 340m/sec











==TIMER COUNTER







=XC0 - 외부 입력 => 자동자 엔진 RPM






=PWM












=

<TIMER.C>

#include "timer.h"

// 0번 타이머 접두어: TC0 // 1번 타이머 접두어: TC1 // 2번 타이머 접두어: TC2
// 예: #define TC0_CCR    ((volatile unsigned int *)0xFFFA0000)
// 인터럽터 관련 : AT91C_BASE_AIC
// 0번 타이머 관련 : AT91C_BASE_TC0
// PMC 관련   : AT91C_BASE_PMC

void Timer_Init(void)
{
// 타이머 카운터 0 사용을 위한 PMC 활성화(AT91C_ID_TC0)
   
// 1.시작 : 타이머 클럭 비활성화 ------------------
// 타이머 클럭 비활성화(TC_CCR 설정)


// 2. 시작 : 타이머 인터럽트 비활성화 -------------
// 타이머 인터럽트 비활성화(TC_IDR 설정)
// 인터럽트 상태 정보 초기화(TC_SR 읽기)

// 분주비 1024, 비교 방식 레지스터 설정(TC_CMR, DIV5_CLOCK, AT91C_TC_CPCTRG)
// MCKR divided by 4096 
=> 12, 0.25us(TC_RC 설정)

// 타이머 카운터 0 인터럽트 비활성화(AIC_IDCR, AT91C_ID_TC0)

// 3. 시작 : 타이머 카운터 0 인터럽트 비활성화 ------
// 타이머 카운터 0 인터럽트 핸들러 등록(AIC_SVR[AT91C_ID_TC0], timer_handler)
// 타이머 카운터 0 인터럽트 모드 설정(AIC_SMR[AT91C_ID_TC0], AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, AT91C_AIC_PRIOR_LOWEST)
// 타이머 카운터 0 인터럽트 클리어(AIC_ICCR, AT91C_ID_TC0)

// TC_RC 값 비교 타이머 인터럽트 활성화(TC_IER, AT91C_TC_CPCS)

// 2. 끝 : 타이머 인터럽트 비활성화 ---------------

// 타이머 카운터 0 인터럽트 활성화(AIC_IECR, AT91C_ID_TC0)

// 3. 끝 : 타이머 카운터 0 인터럽트 비활성화 -------

// 타이머 클럭 활성화(TC_CCR, AT91C_TC_CLKEN)

// 1. 끝 : 타이머 클럭 비활성화 ------------------

// 타이머 시작(TC_CCR, AT91C_TC_SWTRG)

}


void Timer_ISR(void)
{
// 인터럽트 상태 정보 초기화(TC_SR 읽기)
// LED 토글 프로그래밍
// 인터럽트 상태 정보 초기화(TC_SR 읽기)
}






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

20150821  (0) 2015.08.23
20150820  (0) 2015.08.21
20150818  (0) 2015.08.19
20150817  (0) 2015.08.18
20150814  (0) 2015.08.17
Posted by ahj333
,

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

NETWORK

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

<NETWORK>



=입출력 다중화

-인터럽트 + 폴링



=SELECT()


-fd_set : 128 byte = 1024 bit


장치들의 상태 모니터링 가능 (0,1,2-stdin,stdout,stderr ...)



int select( ,R,W,E, );





select() blocking => R, W, E 중 이벤트 감지가 되면 BLOCKING 풀림


-timeout 0 => 무한 대기


-select()인자 : (감시대상 번호(ex : 2) + 1, READ, WRITE, ERROR, TIMEOUT)



=>멀티 스레드/ 멀티 프로세스 사용 없이 채팅 가능


<select.c>

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
   
 fd_set A;
    printf(
"fd_set size : %d bytes\n",sizeof(fd_set));
    
FD_ZERO(&A);    // 초기화
    if(1==FD_ISSET(2,&A)
)
    {
        printf(
"2번의 값: 1\n");
    }
    
else
    {
        printf(
"2번의 값: 0\n");
    }
    
FD_SET(2&A);  // 2번 BIT 1
    if(1==FD_ISSET(2,&A))
    {
        printf(
"2번의 값: 1\n");
    }
    
else
    {
        printf(
"2번의 값: 0\n");
    }
    FD_CLR(
2&A);  // 2번 BIT 0
    if(1==FD_ISSET(2,&A))
    {
        printf(
"2번의 값: 1\n");
    }
    
else
    {
        printf(
"2번의 값: 0\n");
    }

    FD_SET(
0&A);  // 키보드 입력 감시 셋
    select(1&A, 000);
    
printf("select 풀림\n");
    
return 0;
}





<select_1.c>

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

#define STDIN 0
#define MAX_LINE 80

int main(int argc, char **argv)
{
    fd_set readfds;
    
int fdn;
    
char rbuf[MAX_LINE];
    
struct timeval timeout;

  
  FD_ZERO(&readfds);
    FD_SET(STDIN, 
&readfds);


    
while(1)
    {
      
  timeout.tv_sec = (long)3;
        timeout.tv_usec 
= 0L;

        printf(
"> ");
        fflush(stdout);
       
 fdn = select(STDIN+1&readfds, NULL, NULL, &timeout);
        
if(fdn ==0)
        {
            printf(
"\nError : Time Out\n");
        }
        
else
        {
            memset(rbuf, 
0x00, MAX_LINE);
            read(STDIN, rbuf, MAX_LINE -
1);
            
if(strncmp(rbuf, "quit\n",5== 0)
                
break;
            printf(
"Your Message : %s", rbuf);
        }
        
FD_SET(STDIN, &readfds);
    }
    
return 0;
}







=select() + 채팅 프로그램


<smartsock2.h>

#ifndef __SMARTSOCK2_H__
#define __SMARTSOCK2_H__

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/select.h>


#define PORT    7777
#define IP      "192.168.0.219"

#define MSG_SIZE    255
#define BUF_SIZE    (MSG_SIZE + 1)
#define MSG_END     "quit"

#endif //__SMARTSOCK2_H__


<client2.c>

#include "smartsock2.h"

int main()
{
    
int iFd;
    
struct sockaddr_in stAddr;
    
int iLen;
    
int iRet;
 
   fd_set fdRead;

    iFd = socket(AF_INET, SOCK_STREAM, 0);
    
if(-1 == ifd)
    {
        perror(
"socket() call error : ");
        
return 100;
    }

    stAddr.sin_family 
= AF_INET;
    stAddr.sin_addr.s_addr 
= inet_addr(IP);
    stAddr.sin_port 
= htons(PORT);

    iLen 
= sizeof(struct sockaddr_in);

    iRet = connect(iFd, (struct sockaddr *)&stAddr, iLen);
    
if(-1 == iRet)
    {
        perror(
"connect() call error : ");
        close(iFd);
        
return 200;
    }

    
while(1)
    {
       
 FD_ZERO(&fdRead);
        FD_SET(
0&fdRead);
        FD_SET(iFd, 
&fdRead);

    }

    close(iFd);
    
return 0;
}



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

20150820  (0) 2015.08.21
20150819  (0) 2015.08.19
20150817  (0) 2015.08.18
20150814  (0) 2015.08.17
20150813  (0) 2015.08.13
Posted by ahj333
,

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

ASSEMBLY

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


<ASSEMBLY>


=최적화( 빠르게)

=2의 보수


=메모리 (RAM)


=CPU 

-명령어


=I/O Mapped Memory ( ARM, AVR ) = 레지스터 ( 숫자 임)

=I/O Mapped I/O ( 인텔 ) => C로 불가능 => 어셈블리로 가능


-이름 필요(EAXEBX, ECX, EDX) - Data Register / General Registers / accumulator ( 데이터를 저장하기만 함 - 이펙트(led on등) 없음)


-EAX - ACCUMULATOR ( 계산에 특화 )








union Reg

{

        int EAX;        // 4 Bytes

        short AX;       // 2 Bytes

        char AH;       // 1 Byte

        char AL;       // 1 Byte

}



=286 까지 AX => 386부터 EAX (extended)




=ESI, EDI : Index Register ( Source, Destination ) : COPY


=ESP, EBP : Pointer (Stack, Base)


=SEGMENT (영역)

-CS ( 코드영역 )

-DS ( 전역 변수)

-ES 

-FS (FLAG)

-GS

-SS


=EIP : Instruction Pointer ( PC :Program Counter )


=EFLAGS : Flag Register







(2Byte : word)







=compiler + source editor + debuger => IDE( Intergraed Development Environment 통합개발환경 : 비주얼 스튜디오)


=니모닉 : 명령어 (reg)(,)(reg)(,)(reg) (; 주석)

-

add eax, 158

=> eax = eax + 158;


-

add eax, 158           :어셈블러

05 00 00 00 9E        : 기계어

EIP



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

20150819  (0) 2015.08.19
20150818  (0) 2015.08.19
20150814  (0) 2015.08.17
20150813  (0) 2015.08.13
20150812  (0) 2015.08.13
Posted by ahj333
,

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

ARM

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

<ARM>


=DBGU INTERRUPT RX 구현

:EXTERNAL INTERRUPT



=

<DBGU.C>

#include "dbgu.h"

unsigned char DBGU_Rx(void)
{
  
while(0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY));
  
return *AT91C_DBGU_RHR;  
}

void DBGU_Tx(char cData)
{
  
while(0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY));
  *AT91C_DBGU_THR 
= cData;
  
return;
}

void DBGU_Str(char * cpStr)
{
  
while(0 != *cpStr)
  {
    DBGU_Tx(*cpStr);
    ++cpStr;
  }
  
return;
}

void DBGU_Menu(void)
{
  DBGU_Str(
"1. LCD Print\n\r");
  DBGU_Str(
"M. MENU Print\n\r");
  
return;
}


void DBGU_Rx_ISR(void)

  
switch ((*AT91C_DBGU_RHR)&0x000000FF)// 1byte 추출
  {
    
case 'M':  
    
case 'm':      
      DBGU_Menu();
      
break;
    
default :
      DBGU_Str(
"Wrong Command\n\r");
      DBGU_Menu();
      
break;
  }
  
return;
}


void DBGU_Init_ISR(void)  // Interrupt
{
  *AT91C_PIOA_ASR 
= AT91C_PA9_DRXD | AT91C_PA10_DTXD;  // Peripheral A setting
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;  // PIO Disable
  *AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;    // Reset & Disable -ref) p224
  *AT91C_DBGU_MR = AT91C_US_PAR_EVEN | AT91C_US_CHMODE_NORMAL;  // Parity:EVEN /CHmode: Normal
  *AT91C_DBGU_BRGR = DBGU_CD;              // Baud Rate setting
  *AT91C_AIC_IDCR = 1 << AT91C_ID_SYS;
  AT91C_AIC_SVR[AT91C_ID_SYS] 
= (unsigned int)DBGU_Rx_ISR;  // 핸들러 등록
                              // 동작모드 및 우선순위 결정 -ref) p176
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE | AT91C_AIC_PRIOR_LOWEST;
  *AT91C_AIC_ICCR 
= 1 << AT91C_ID_SYS;  // 커맨드 레지스터 클리어  
  //*AT91C_AIC_ISCR = 1 << AT91C_ID_PIOA;  // 커맨드 레지스터 셋
  *AT91C_DBGU_IER = AT91C_US_RXRDY;
  *AT91C_AIC_IECR 
= 1 << AT91C_ID_SYS;
  *AT91C_DBGU_CR 
= AT91C_US_RXEN | AT91C_US_TXEN;    // Enable
  
  
//AT91C_US_RXDIS | AT91C_US_TXDIS;  // Disable   
  return;
}


void DBGU_Init_Polling(void)  // Polling
{
  *AT91C_PIOA_ASR 
= AT91C_PA9_DRXD | AT91C_PA10_DTXD;  // Peripheral A setting
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;  // PIO Disable
  *AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;    // Reset & Disable
  *AT91C_DBGU_MR = AT91C_US_PAR_EVEN | AT91C_US_CHMODE_NORMAL ;  // Parity:EVEN /CHmode: Normal
  *AT91C_DBGU_BRGR = DBGU_CD;              // Baud Rate setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    // Enable
  
  
//AT91C_US_RXDIS | AT91C_US_TXDIS;  // Disable   
  return;
}

void DBGU_Init(void)
{
  
//DBGU_Init_Polling();
  DBGU_Init_ISR();
  
return;
}









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

20150818  (0) 2015.08.19
20150817  (0) 2015.08.18
20150813  (0) 2015.08.13
20150812  (0) 2015.08.13
20150811  (0) 2015.08.11
Posted by ahj333
,