Busan IT/Algorithm2016. 1. 1. 13:01

Calculating a sum of serial number is a simple math with loop and 'if' state.

 

However, without them, it needs some brain work.

 

This is an expression, the sum of arithmetic progression.

 



** n: a number of series, a1: first number, an: last number

 

Problem is we cannot know which number is greater. Without if state, there is no way to get a right answer.

 

So what I've done is to print out the both cases, first number is greater and second number is greater.



 

Code goes...


// Algorithm for finding sum of serial number
// without using 'if' state

#include <stdio.h>
#include <math.h>

int main(void)
{
  int iNum1, iNum2;
  int iCnt1, iCnt2;
  int iSum1, iSum2;

  puts("Input two numbers");
  scanf("%d %d"&iNum1, &iNum2);

  iCnt1 = iNum2 - iNum1 +1;
  iCnt2 = iNum1 - iNum2 +1;

  iSum1 = (iCnt1 * (iNum1 + iNum2))/2;
  iSum2 = (iCnt2 * (iNum1 + iNum2))/2;

  puts("If a second number is bigger than first one, the answer is [iSum1] or else");
  printf("Sum1 is [%d] and Sum2 is [%d]\n", iSum1, iSum2);
  
  return


 

 

 

 

 

 

반응형

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

GCD(Greatest Common Divisor)  (0) 2015.12.29
Posted by newind2000
Busan IT/Library2015. 12. 29. 12:24

2015/12/29(Tue)

- GCD(Greatest Common Divisor) argument from 2 to 5

JHY.h



반응형
Posted by newind2000
Busan IT/Algorithm2015. 12. 29. 12:10

Finding GCD is a good start to study algorithm due to its calculation simplicity.

 

What people commonly use for figuring out GCD is prime factorization.

 

Let's say we have two numbers, 720 and 12.

 

** image from - https://en.wikipedia.org/wiki/Greatest_common_divisor 

It is a good method for human who can figure out common divisors without inputting numbers from 1 to increasingly. However, a computer should go through that process.

 

Thus, our task is to find a good algorithm for computer to calculate GCD.

 

Let's use some 'MATH' here. =_=

 

We have numbers A, B. These two numbers are not same and bigger than 1.

 

If they have a GCD, we can write as below.

** G = GCD

A = a * G

B = b * G

 

Let's subtract them.

 

A - B = a * G - b * G

= (a - b) G

 

So, we can know that A - B also have the same GCD. We can manipulate it.

 

The GCD of A or B and A - B is same. So that we can subtract a greater number to the rest number until one of these number is zero. When one of number is 0, the rest number is GCD.

 

GCD(X, 0) = X

 

** This is because zero is always zero with any number multiplied.

ex) 0 * 1 = 0, 0 * 24098209384 = 0

 

Let's prove with practical numbers.

 

GCD(54, 18) = GCD(36, 18)

= GCD(18, 18)

= GCD(18, 0)

 

Thus, GCD(54, 18) = 18

 

 

Examine the calculation. We can notice

 

-> Subtraction goes on until a greater number becomes less than a smaller number, which is same arithmetic of "%". YEAH!

 

GCD(54, 18) = GCD(18, 54%18)

= GCD(18, 0)

 

Now, we have prepared a GCD algorithm for computer.

 

Let's make functions when inputting numbers vary from 2 to 5.

 

What we should keep in mind.

 

1. Find smallest number as divisor

2. Loop should go on until input number -1 are zero

ex) 4 numbers input for GCD, loop should go on until 3 numbers are 0

 

3. If all input numbers become 0 by divisor, divisor should be GCD.


Below is code of GCD function for 5 arguments(numbers)


int GCD5(unsigned int uiNum1, unsigned int uiNum2, unsigned int uiNum3, unsigned int uiNum4, unsigned int uiNum5)
{
  unsigned int uiCnt;  //counter for loop
  unsigned int uiDiv;  //divisor for finding GCD
  unsigned int uiNum[5];  
  unsigned int uiZero;

  //putting numbers intto array  
  uiNum[0= uiNum1;
  uiNum[1= uiNum2;
  uiNum[2= uiNum3;
  uiNum[3= uiNum4;
  uiNum[4= uiNum5;

  //finding GCD(Greatest Common Divisor)
  uiDiv = uiNum1;
  while(1)
  {
    //finding divisor
    for(uiCnt = 05 > uiCnt; ++uiCnt)
    {
      if(uiDiv > uiNum[uiCnt] && uiNum[uiCnt] != 0)
      {
        uiDiv = uiNum[uiCnt];
      }
    }
    printf("Divisor is [%d]\n", uiDiv);
    uiZero = 0;
    for(uiCnt = 05 > uiCnt; ++uiCnt)
    {
      uiNum[uiCnt] = uiNum[uiCnt] % uiDiv;
      if(0 == (uiNum[uiCnt] = uiNum[uiCnt] % uiDiv))
      {
        ++uiZero;
      }      
    }
    if(4 <= uiZero)
    {
      break;
    }    
  }
  if(uiZero == 5)
  {
    return uiDiv;
  }    
  return uiNum[0] + uiNum[1] + uiNum[2] + uiNum[3] + uiNum[4];
}






 

반응형

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

Sum of serial number(without loop and if state)  (0) 2016.01.01
Posted by newind2000
Busan IT/RFID2015. 12. 9. 17:35

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

Dos Serial 통신

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

Dos Serial 통신

Non-canonical Mode를 사용하여 배열에 있는 데이터를 출력해보자.

 

 

 

**VMware를 재부팅 후 데이터를 보내니 잘되었다. 이유는 알 수 없다.

 

VMware 탓인지 리눅스 탓인지 알 수 없으나, linux 환경에서는 리더기와의 통신이 되지 않았다.

 

도스환경에서 시리얼 통신을 해보자.

 

시리얼 통신을 위해 사용해야 하는 함수는 아래와 같다.

 

1. CreatFile

2. SetupComm

3. PurgeComm

4. GetCommState

5. WriteFile

6. ReadFile

7. CloseHandle

 

 

1. CreateFile

 

HANDLE WINAPI CreateFile(

_In_ LPCTSTR lpFileName,

_In_ DWORD dwDesiredAccess,

_In_ DWORD dwShareMode,

_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,

_In_ DWORD dwCreationDisposition,

_In_ DWORD dwFlagsAndAttributes,

_In_opt_ HANDLE hTemplateFile

);

각 인자에 대한 설명 - https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

 

 

 

2. SetupComm

 

BOOL WINAPI SetupComm(

_In_ HANDLE hFile,

_In_ DWORD dwInQueue,

_In_ DWORD dwOutQueue

);

 

각 인자에 대한 설명 - https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363439(v=vs.85).aspx

 

 

 

3. PurgeComm

 

BOOL WINAPI PurgeComm(

_In_ HANDLE hFile,

_In_ DWORD dwFlags

);

 

각 인자에 대한 설명 - https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363428(v=vs.85).aspx

 

 

 

4. GetCommState

 

BOOL WINAPI GetCommState(

_In_ HANDLE hFile,

_Inout_ LPDCB lpDCB

);

 

각 인자에 대한 설명 - https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363260(v=vs.85).aspx

 

 

5. WriteFile

 

BOOL WINAPI WriteFile(

_In_ HANDLE hFile,

_In_ LPCVOID lpBuffer,

_In_ DWORD nNumberOfBytesToWrite,

_Out_opt_ LPDWORD lpNumberOfBytesWritten,

_Inout_opt_ LPOVERLAPPED lpOverlapped

);

 

각 인자에 대한 설명 - https://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx

 

 

 

6. ReadFile

 

BOOL WINAPI ReadFile(

_In_ HANDLE hFile,

_Out_ LPVOID lpBuffer,

_In_ DWORD nNumberOfBytesToRead,

_Out_opt_ LPDWORD lpNumberOfBytesRead,

_Inout_opt_ LPOVERLAPPED lpOverlapped

);

 

각 인자에 대한 설명 - https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

 

 

7. CloseHandle

 

BOOL WINAPI CloseHandle(

_In_ HANDLE hObject

);

 

각 인자에 대한 설명 - https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms724211(v=vs.85).aspx

 

 

 

 

장비가 없음으로 내 곁에 있는 ComPortMaster와 통신하자.


RFID 리더기와 통신하면 6byte를 수신하게 된다.

 

 

CRC 값을 함수를 써서 계산하자.



 

데이터시트를 참조하여 reader기의 동작 옵션을 바꿔보자.

 

PDF p/22






 

 

반응형

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

RFID(Radio Frequency Identification)  (0) 2015.12.08
리눅스 시리얼 통신  (0) 2015.12.07
Posted by newind2000
Busan IT/RFID2015. 12. 8. 21:35

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

RFID(Radio Frequency Identification)

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

 

RFID(Radio Frequency Identification)

 

 

RF(Radio Frequency): Wireless communication의 의미이다. 단순한 무선(wireless)의 의미와 구분되어 사용되어야 한다.

 

높은 주파수는 데이터를 빨리 보내는 것이 아니라 같은 시간에 많이 보내는 것이다.

 

RF에서 캐리어 주파수에 data 주파수를 싣는 것을 모듈레이션(modulation)이라고 한다. Data를 다시 캐리어에서 분리하는 것을 디모듈레이션(demodulation)이라고 한다.

 

주파수는 진폭(위아래 폭), 주파수(highlow의 빈도)변조가 가능하다.

 

일반 RF의 주파수는 13.56Mbs이다. RF 통신 규약 중 ISO 15693을 채택한 것을 RFID라고 한다.

 

 

칩은 전기가 있어야 작동하지만 작은 칩에 베터리를 연결하는 것은 힘들다. 소형 칩이기 때문에 안테나에 있는 전파를 전력으로 삼아 작동하게 된다. 안테나의 주파수를 인지하게 되면 사용할 데이터와 전력으로 사용할 전파를 구분하여 처리한다.

 

전자기 유도현상

 

전계와 자계의 연쇄작용으로 퍼져나가는 파장을 전자파라고 한다. 전자파는 주변에 금속이 있으면 금속으로 끌려가게 된다.

//물도 전자파를 흡수하기 때문에 비가 오는 날에는 통신에 장애가 발생할 수 있다.

 

RF는 바코드를 대체하지 못한다. 첫째는 가격, 둘째는 인식률 때문이다.

 

RFIDRF의 시리얼 통신 방식을 배우는 것이다.


 

리더기는 3가지 모드로 구분된다.

 

1. Address Mode: UIDtransponder를 구분하여 데이터를 송수신한다.

2. Non-address Mode: transponder

3. Selected Mode: UIDtransponder를 구분하여 데이터를 송수신한다. 선택된 UID와만 데이터 송수신이 가능하다.

 

 

1. Address Mode

 

2. Non-address Mode

 

 

3. Selected Mode

 





 

return 값이 0이 아니면 다 에러이다.

 

 

SET-OUTPUT: 0x71




 

//flash일 때만 유효하다.

flash의 지속시간

 

 

예제 소스코드를 non-canonical 소스에 붙혀 넣고 코딩을 해보자.

반응형

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

Dos Serial 통신  (0) 2015.12.09
리눅스 시리얼 통신  (0) 2015.12.07
Posted by newind2000
Busan IT/RFID2015. 12. 7. 17:04

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

리눅스 시리얼 통신

- 가상 시리얼 포트 설치

- 시리얼 데이터 통신의 기법

    - canonical

    - non-canonical

    - asynchronous

    - multi-flexing

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

 

리눅스 시리얼 통신

 

가상 시리얼 포트 설치

 

모든 장치는 리눅스에서는 파일로 간주한다.

 

 

'/dev' 디렉토리에 serial port 또한 파일로 존재한다.

 

 

가상 머신를 실행하여 시리얼 포트를 설치해보자. 가상 머신이 구동 중에는 시리얼 포트 설치가 불가함으로 ‘halt' 명령어를 사용하여 구동을 중지 후 전원을 끈다.

 

그 후에 시리얼포트를 설치한다.

 

 

 





 

2개를 설치한다.

 

 

 

가상 머신을 사용하여 가상 머신과 본체가 통신을 할 수 있도록 소프트웨어적으로 시리얼 포트를 설치한다.

 

 

요놈을 설치해준다. 설치 후 실행시킨다.

 

 

가상 시리얼 포트를 만들어준다.

 

 

하이퍼 터미널을 두 개 실행시켜서 통신을 해보자.

 

 

 

가상의 시리얼 포트는 재부팅을 하더라도 지속적으로 존재한다.

 

VMware를 종료하고 다시 시작하면 추가한 포트가 보이게 된다.

 

 

추가한 두 개의 포트에 가상 시리얼 포트를 하나씩 연결해준다.

 

가상 머신을 구동시킨다.

 

시리얼 포트 중에 2번째 것을 disconnect시킨다.

 

연결이 해제되면 해당 장치가 회색으로 변하는 것을 알 수 있다.

 



시리얼 데이터 통신의 기법

 

'struct termios'는 터미널의 input/output을 설정하는 구조체이다.

 



 

 

Canonical: 한 줄씩(엔터 전) 데이터를 통신한다. Dos의 기법과 같다.

Non-Canonical : 정해진 데이터 크기에 도달했을 때 데이터를 읽어들인다.

 

** Canonicalnon-canonical의 송신하는 데이터의 크기가 고정(non-canonical)이 되었는지 아닌지(canonical)의 차이이다.

 

Asynchronous: 소프트웨어적인 인터럽트가 발생하면 데이터를 처리하는 방식이다.

 

Multi Flexing: select함수의 개념이다.


 

SPEED를 사용할 때 대문자 ‘B'를 붙여줘야 한다.

 

 

'O_NOCTTY'는 프로그램 명령어를 보냈을 때 해당 내용을 송신하지 않고 내부적인 프로그램 명령어로 사용하라는 옵션이다.

 

//tc: terminal control

//attr: attribute

//get 명령어의 반대개념은 set이다.

 

Canonical

canonical 방식으로 시리얼 통신을 해보자. 하이퍼 터미널에서는 송신을 하고 canonical 프로그램에서는 받는 방식으로 하자.

 

 








 

리눅스에서 수신

 

 

리눅스에서 송신

 

 

 

Non-canonical

 

 

 

데이터가 5byte가 되면 수신하도록 설정해보자.

 

 

Asynchronous(인터럽트 방식)



 

fcntl로 인터럽트를 시리얼포트로 전송해준다.

 

//시리얼 통신은 canonical 혹은 non-canonical 중 반드시 하나를 사용해야 한다.




 


Multi-flexing 


동시에 두 곳 이상의 포트를 감시한다.

 




linux serial.pdf


반응형

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

Dos Serial 통신  (0) 2015.12.09
RFID(Radio Frequency Identification)  (0) 2015.12.08
Posted by newind2000
Busan IT/WinAPI2015. 12. 2. 17:40

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

멀티쓰레드

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

멀티쓰레드

WinAPI에서는 select함수로 키보드 입력을 감시할 수 없다. 때문에 멀티쓰레드를 사용해야 한다.

 

쓰레드에 대해서 알아보자.

 

//java는 일반적으로 쓰레드로 구현된다.

 

WinAPI에서 winProc함수는 메시지를 지속적으로 기다린다. 운영체제가 메시지를 던져주면 그 값을 받아 처리한다.

 

우선 멀티쓰레드를 구동시키는 함수가 필요하다.

 

HANDLE CreateThread(

1. LPSECURITY_ATTRIBUTES lpThreadAttributes,

2. SIZE_T dwStackSize,

3. LPTHREAD_START_ROUTINE lpStartAddress,

4. LPVOID lpParameter,

5. DWORD dwCreationFlags,

6. LPDWORD lpThreadId );

 

 

 

 

main 함수 내에서 멀티 프로세스를 구현하면 main 함수의 실행이 멈추면 main에 속한 모든 프로세스가 종료된다. 때문에 쓰레드가 실행되는 동안 main 함수가 종료되지 않도록 유지시켜는 장치가 필요하다. 

 



 

멀티쓰레드를 구현하여 채팅을 구현해보자... 내일


반응형

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

winsock 채팅 프로그램  (0) 2015.12.01
winsock을 사용한 서버/클라이언트 프로그램  (0) 2015.11.30
히스토그램 , 알파값  (0) 2015.11.25
WIN32API로 BMP뷰어  (0) 2015.11.22
20151118 윤재희 #5. 그래픽 & 게임  (0) 2015.11.18
Posted by newind2000
Busan IT/ARM Assembly2015. 12. 2. 13:30

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

Memory Map Symbol 이야기

ELF format Object File에 관한 진실. -c option (기계어 세상)

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

 

Memory MapSymbol 이야기

 

C에서는 변수나 명령어에 대한 심볼 테이블이 필요한다. 어셈블리의 경우에는 스택의 베이스 주소에서 떨어진 정도를 기준으로 변수를 사용하기 때문에 심볼 테이블이 필요 없다.

 

메모리 맵 파일은 실행파일을 만들 때 작성된다. 변수의 주소는 link 단계에서 결정된다. 실행 시 운영체제는 메모리의 보호를 위해 가상의 스택 베이스 주소를 설정하여 변수의 주소를 설정하기도 한다.

 

심볼테이블은 linker만이 참조한다. linking시 심볼 테이블의 심볼이 겹치는 경우 에러가 나기 때문에 똑같은 이름의 변수를 중복으로 사용할 경우 static 혹은 extern 명령어를 사용하여 linker가 정상적으로 실행될 수 있도록 해야 한다.

 

심볼 테이블은 모든 변수나 함수를 주소화 시킨다. 심볼 테이블은 한정된 메모리를 충돌 없이 사용하기 위해 존재한다.

 

지역 변수는 변수가 속한 함수에서 사용될 때, 즉 스택 포인터 아래에 있을 때만 보호 받는다. 해당 함수가 종료되면 변수는 사라지지는 않지만 더 이상 보호 받지는 못한다.

 

변동 없는 주소를 갖는 것은 함수와 전역변수, 지역변수는 스택의 베이스를 기준으로 한다.

 

 

 

 

변수를 보고 어느 영역에 해당하는지 구분할 수 있어야 한다.



ELF format Object File에 관한 진실. -c option (기계어 세상)

 

armcc로 컴파일한 obj파일을 hexaview사용하여 열어보자.

 

ELF형식임을 알 수 있다.

 

 

//시작 값인 0x7F10진수로 127, 아스키코드로 'DEL'키를 뜻한다.

 

 

SWS ESPC 0003 B-02를 검색하여 ARM ELF specification을 다운 받는다.

 

elf파일을 해석하는 프로그램이 linux에 존재한다. 'readelf'라는 명령어와 함께 object 파일 명을 입력하면 정보가 elf파일의 정보가 출력된다.

 

'fromelf'라는 명령어를 사용하여 binary로 된 데이터를 assembly로 바꿔서 출력해보자.




 

 

반응형
Posted by newind2000
Busan IT/WinAPI2015. 12. 1. 17:36

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

winsock 채팅 프로그램

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

 

linux환경에 만들었던 다중 파일 입출력 채팅 프로그램을 참고하여 winsock 서버/클라이언트 프로그램을 만들어보자.

 


 

진행 중...





반응형

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

멀티쓰레드  (0) 2015.12.02
winsock을 사용한 서버/클라이언트 프로그램  (0) 2015.11.30
히스토그램 , 알파값  (0) 2015.11.25
WIN32API로 BMP뷰어  (0) 2015.11.22
20151118 윤재희 #5. 그래픽 & 게임  (0) 2015.11.18
Posted by newind2000
Busan IT/ARM Assembly2015. 12. 1. 13:39

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

컴파일에 대한 단상

ARM ADS 설치

컴파일 공장 이야기

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

 

컴파일에 대한 단상

 

01로 이루어진 코드를 문자를 도입하여 표시하게 되어 사람이 코드를 작성하는데 용이하게 되었다.

 

 

어셈블리 언어는 CPU에 따라 문법이 달라진다. 호환성의 한계를 해결하기 위해서 고급 언어인 CC++이 등장하게 되었다.

 

 

CPU에 자유롭다 - high level language

CPU에 종속된다 - low level language

 

C로 작성 -> Assembly 언어로 변환 -> cpu가 해석할 수 있는 bit pattern으로 변환

 

 

메모리는 플립플롭의 회로를 사용하여 데이터를 보존한다.

 

cross compile이란 프로그램을 고사양 개발 PC에서 컴파일 후 프로그램이 사용될 CPU에 이식하는 것을 말한다.

 

ARM ADS 설치

 

공유 폴더에 가서 ARM ADS(ARM Developer Suite) 1.2를 가져온다. setup.exe를 눌러 실행한다.

 

** 굳이 설명이 없는 것은 변동 없이 다음을 눌러주면 된다.

 





 

 

보안패치 업데이트

 



예제 파일 ‘OK7S256ads’은 인터넷 검색하여 사용한다. 압축을 풀어 Program File에서 ADS가 설치된 폴더 안에 잘라 넣는다.

 

IDE를 실행하고 예제 파일을 불러들인다.

 



 

그룹을 생성한다.

 






 

 

‘Cstarup_SAM7.c‘ ’retarget.c‘ 도 같은 방식으로 등록한다.



 

이제 예제 파일을 추가한다.




 

새로운 프로젝트 환경 설정










 

코딩 시 코드의 탭 간격 조절

 





 

주소가 달라 오류가 난다. 주소를 수정해보자.

 

 

베이스 주소를 '0x00000000'로 수정하니 컴파일이 됐다. 하지만 warning이 뜬다. entry point가 없다는 메시지이다.

 

다시 alt + F7을 눌러 디버그 세팅으로 간다. Image Entry Point창에 'entry'를 입력한다.

 

 

 

다시 컴파일을 해보자.

 

 

잘된다.

 

 

 

 

Atmel사 홈페이지로 간다.

 




//MCU를 구입할 때 evolution kit를 사야한다. 아니면 CPU 달랑 하나 구입하는 꼴이 된다.

 

컴파일 공장 이야기

 

 

 

//전처리 과정이 빠져있다.

 

elfbin파일은 둘 다 기계어이다. 실제로 동작이 가능한 파일이 bin파일이다.

 

실행 파일 구조는 윈도우는 pe계열 리눅스는 elf계열이다. 임베디드 계열은 대부분 elf계열이다.

 

컴파일 과정을 그림으로 표시하면 다음과 같다. 





 

 

 

반응형
Posted by newind2000