아래 주소에서 퍼왔는데..
http://blog.naver.com/whentlr?Redirect=Log&logNo=120111315928
여기서도 딴곳에서 퍼왔다는군...
=====================================================================================
Tortoise SVN 사용법
이 글은 Tortoise SVN(거북이 SVN)에 대한 간단한 매뉴얼로써 활용될 수 있습니다. 설치부터 시작해 체크아웃, 갱신 등의 전반적인 사용법까지 다루겠습니다.
SVN 이란?
SVN이란 버전관리 시스템의 하나입니다. 여기서 버전 관리 시스템이란 구성원들간의 프로젝트 소스 코드의 공유, 버전 관리(옛날 버전의 소스 코드를 조회 가능함) 그리고 소스 코드의 백업 등의 용도로 사용되는 시스템을 말하며 CVS와 SVN 등이 잘 알려져 있습니다.
참고 : Tong - Zard님의 Eclipse통
Tortoise SVN이란?
SVN을 제공하는 오픈 소스의 강력한 버전 관리 툴입니다.
설치
1. Tortoise SVN 홈페이지(http://tortoisesvn.net/)에 접속합니다.
3. 그 아래의 Download Application에서 자신의 운영 플랫폼에 맞는 것을 찾아 클릭합니다.
4. 설치 파일을 다운로드 받습니다. 5. 다운로드 받은 설치 파일을 실행시킵니다. 6. 라이센스에 관한 설명을 확인한 후 동의 하신다면 위쪽 라디오 버튼을 선택하고 NEXT 버튼을 클릭합니다.
7. 설치 요소와 설치 경로를 설정한 후 NEXT 버튼을 누릅니다. (그냥 기본값에서 NEXT 버튼을 클릭해도 상관 없습니다.) 8. 설정한 인스톨 옵션에 이상이 없다면 INSTALL 버튼을 클릭합니다. 9. 설치를 완료한 후 FINISH 버튼을 누릅니다.
10. 시스템을 재시작 합니다.
11. 마찬가지로 Tortoise SVN 홈페이지 다운로드 메뉴의 하단에 위치한 Languages packs에서 Korean 언어 팩을 찾아 설치합니다.12. 설치를 확인합니다. 13. 이제 부터 언어 설정을 한국어로 설정합니다. 설치가 완료되었다면 마우스 오른쪽 버튼을 클릭하였을 시 나오는 팝업 메뉴에 관련 메뉴가 추가되어 있을 것입니다. 일단, 이 중에서 TortoiseSVN -> Settings를 클릭해 보십시오.
14. 일반 탭에 위치한 Language 설정을 한국어로 선택하고 확인을 누릅니다. 15. 바르게 설정이 되었는지 확인합니다.
한글화된 메뉴
Tortoise SVN 사용법
이 글은 Tortoise SVN(거북이 SVN)에 대한 간단한 매뉴얼로써 활용될 수 있습니다. 설치부터 시작해 체크아웃, 갱신 등의 전반적인 사용법까지 다루겠습니다.
체크아웃이란?
SVN은 특정한 '저장소(Repository)'에 기록된 정보들을 통해 소스 코드의 버전을 관리합니다. 이 체크아웃이라는 것은 이러한 '저장소'에 접근해 소스 코드와 버전관리를 위한 파일들을 받아 오는 행위를 의미합니다.
체크아웃을 하는 방법
1. 체크아웃받을 폴더를 새로 하나 생성합니다.
2. 생성된 폴더를 연 후에 그 안에서 마우스 오른쪽 버튼을 클릭해봅니다.
3. 보이는 메뉴들 중 SVN 체크아웃(K)를 찾아 클릭합니다.
4. '저장소 URL :'라벨 바로 밑에 위치한 입력폼에 'svn://(저장소 주소)'를 입력합니다.
5. 입력이 완료되었다면 확인을 눌러봅니다. 해당 저장소에 접근을 하는데 인증정보가 필요하다면 아래와 같은 대화상자가 뜹니다.
6. 사용자명과 암호를 입력하신 후 확인을 누릅니다. 일반적으로 체크아웃시 인증 절차가 필요하다면 대부분의 다른 동작에서도 인증 절차가 필요합니다. 반복적인 작업을 피하기 위해 인증 정보의 저장을 원하시는 경우엔 인증 정보 저장 체크박스를 체크합니다.
7. 성공적으로 인증 절차가 끝났다면 아래와 같은 상태가 됩니다. 만약 그렇지 않고 오류창 따위가 뜬다면 서버 관리자에게 문의하여 봅니다.
8. 위의 창에서 확인 버튼을 누르고 1번에서 생성한 폴더의 상태를 확인해봅니다. 폴더 아이콘의 위로 초록색의 체크 아이콘이 추가된 것을 볼 수 있습니다. 그 다음 폴더의 내용을 확인해봅시다. 접근한 저장소에 공유된 파일이 있었다면 빈 폴더에 여러가지 폴더/파일들이 생성된 것을 볼 수 있습니다.
추가된 폴더/파일.
출처: http://rahxephon.tistory.com/1281
출처: http://blog.naver.com/mazinggaa?Redirect=Log&logNo=130023412047
1. SVN 서버 설치하기














SVN 서버를 통해 버전 관리를 할 프로그램들이 저장되는 폴더를 생성합니다.
오토셋 설치폴더 아래 svn_data 라는 폴더로 생성하겠습니다.
여러분이 원하시는 장소에, 원하시는 폴더 명으로 생성하시면 됩니다.
다만, 생성하신 경로와 폴더명은 반드시 기억하셔야 합니다.


--- 여기서부터 // 표시가 있는 부분까지는 이후 소개되는 토토이즈 SVN 에서 쉽게하실 수 있는 부분입니다 ---
[시작] - [실행] 으로 가신 후, cmd 를 입력합니다.
그리고 svn_data 가 있는 폴더로 이동한 뒤,
svnadmin create --fs-type fsfs [생성할 저장소명] 을 입력합니다.
여기서는 svnadmin create --fs-type fsfs autosetOrga 라고 입력하였습니다.
즉, autosetOrga 저장소를 생성하는 것이고 파일시스템 저장소를 사용한다는 의미입니다.
생성된걸 확인하기 위해, svn checkout file:///D:/AutoSet/svn_data/autosetOrga 를 실행해봅니다.
체크아웃된 리비전 0. 이라고 나오면 정상적으로 체크아웃됨을 알 수 있습니다.
// --- 여기까지...
svnserve -d -r [저장소경로] 라고 입력함으로써 SVN 서버를 가동합니다.
여기서는 svnserve -d -r D:\AutoSet\svn_data 라고 입력하였습니다.
참고사항 : svnserve 명령은 어떠한 폴더에서 실행하든 관계없습니다.
주의사항 : svnserve 명령 이후, 아무런 상태변화는 없게 됩니다. 이 상태를 유지하고 계셔야 SVN 서버가 작동하게 됩니다.






























아래와 같이 내용을 수정하고....







1. 개요 ㅇ 컴퓨터 통신 분야에서 스터핑(Stuffing)의 의미는 비동기식 다중화 전송시의 스터핑과는 다른 의미이며, ㅇ 여기서는 데이터 스트림 상에 동일 패턴이 중복되는 것을 방지하는 행위를 말한다 2. 비트 스터핑 ㅇ 데이터를 실은 프레임들의 경계를 구분하기 위해 통상 특정한 비트 배열(Preamble) 을 갖는 플래그 바이트(01111110)라 불리는 경계를 나타내는 바이트를 사용하는데, ㅇ 만일 실제 데이터 내부에 동일한 비트 배열이 있게되는 경우를 방지하기 위해 의도 적으로 5개의 1을 보내면서 다음 비트에 0을 삽입하는 비트 채우기(bit stuffing) 를 실시한다. 3. 바이트 스터핑 ㅇ HDLC 프로토콜에서 프레임의 시작과 끝을 알리는 방법으로, ㅇ ASCII 코드 중에 DLE STX 및 DLE ETX 라는 특정 문자들을 사용하는데, 실제 데이타 몸체에서도 동일 문자가 나오는 것을 방지하기 위해, 송신측에서 우연히 나타나는 DLE 문자 바로 직전에 여분의 DLE (extra DLE)를 삽입하게되는데 이를 바이트 스터핑(Byte Stuffing)이라한다.
위치 : http://www.ktword.co.kr/abbr_view.php?m_temp1=954&mgid=096
CRC table - CRC-8, CRC-16, CRC-32 : 체크에러, CRC 테이블 생성 프로그램

- Parity bit : UART - 한비트의 데이터로 1의 갯수가 짝수인가 홀수인가를 나타낸다.
- check-sum : CPU 실행 파일의 포맷 - 모든 데이터를 더하여 보수를 취하면 된다.
- CRC : 가장 안전하게 체크할 수 있지만 복잡하다. 다양한 비트수가 있다.
http://ko.wikipedia.org/wiki/%EC%88%9C%ED%99%98_%EC%A4%91%EB%B3%B5_%EA%B2%80%EC%82%AC
다항식의 종류
여기에 표시하지는 않았지만 더 많은 CRC 종류들이 있다.
- 적어도 다섯 종류의 서로 다른 CRC-16, CRC-32, CRC-64가 존재하고 널리 사용된다.
- CRC-64, CRC-128, CRC-256도 존재하고 표준화되어 있지만 널리 사용되지는 않는다.
다음은 ITU-IEEE 문법으로 쓴 다양한 CRC 다항식들이다.
| CRC-1 | x + 1 (하드웨어에서 사용되며 패리티 비트로 알려져 있음) |
| CRC-5 | x5 + x2 + 1 (USB 토큰 패킷에서 사용됨) |
| CRC-7 | x7 + x3 + 1 (몇몇 통신 체계에서 사용됨) |
| CRC-8-Fletcher | A := A + D[i], B := B + A |
| CRC-8 | x8 + x2 + x + 1 |
| CRC-12 | x12 + x11 + x3 + x2 + x + 1 (통신 체계에서 사용됨) |
| CRC-16-Fletcher | (CRC-16 Adler의 기반) |
| CRC-16-Adler_A | [A = 1 + D1 + D2 + ... + Dn (mod 65521)] |
| CRC-16-Adler_B | [B = n×D1 + (n-1)×D2 + (n-2)×D3 + ... + Dn + n (mod 65521)] |
| CRC-16-CCITT | x16 + x12 + x5 + 1 |
| CRC-16-IBM | x16 + x15 + x2 + 1 |
| CRC-32-Adler | [Adler-32(D) = B × 65536 + A] |
| CRC-32-IEEE 802.3 | x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 |
| CRC-32C (Castagnoli) | x32 + x28 + x27 + x26 + x25 + x23 + x22 + x20 + x19 + x18 + x14 + x13 + x11 + x10 + x9 + x8 + x6 + 1 |
| CRC-64-ISO | x64 + x4 + x3 + x + 1 (ISO 3309) |
| CRC-64-ECMA-182 | x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40 + x39 + x38 + x37 + x35 + x33 + x32 + x31 + x29 + x27 + x24+ x23 + x22 + x21 + x19 + x17 + x13 + x12 + x10 + x9 + x7 + x4 + x + 1 (ECMA-182 p.63) |
| CRC-128 | (IEEE? / ITU?) |
CRC-Table과 생성함수와의 관계
CRC table 다항식이 결정되면 같은 값이 나온다. 따라서 원하는 다항식에서 부터 table값을 만들어 사용 한다.
만드는 방법은
1. 프로그램 시작하면서 생성함수를 실행하여 RAM의 변수영역에 CRC 데이터를 만든다.
2. 다른 OS나 환경에서 C프로그램으로 table을 만들어 코드를 원하는 프로그램 소스에 추가 한다.
이 경우는 CRC table이 이미 생성되어 있기 때문에 생성 함수는 타겟 프로그램에는 필요 없어 진다.
아래의 CRC table C소스를 프로젝트에 추가하여 수신 처리에서 CRC을 계산하는데 사용하면 된다.
각 다항식과 비트수에 따른 생성 함수 및 table 소스들이다. 주의 할점은 같은 비트라고 방정식리 틀리면 다른 테이블 값이 나오므로 적용하려는 방정식을 확인 해야 한다. 즉, 방정식이 같은면 다음 예의 테이블 값을 그대로 복사해서 적용하면 된다. 경우에 따라 표준화 되어 있는 몇가지 방정식은 이미 방정식 까지 표준화 되었음을 이해 해야 한다. 특히 네트워크 관련 CRC는 그렇다.
1. CRC-8
x8 + x2 + x + 1
static byte crctable[256] = {
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
};
========== table 생성 ===============
static byte crctable[256];
/*
Generate a table for a byte-wise 8-bit CRC calculation on the polynomial:
x^8 + x^2 + x^1 + x^0
*/
void make_crc_table( void ) {
int i, j;
unsigned long poly, c;
/* terms of polynomial defining this crc (except x^8): */
static const byte p[] = {0,1,2};
/* make exclusive-or pattern from polynomial (0x07) */
poly = 0L;
for ( i = 0; i < sizeof( p ) / sizeof( byte ); i++ ) {
poly |= 1L << p[i];
}
for ( i = 0; i < 256; i++ ) {
c = i;
for ( j = 0; j < 8; j++ ) {
c = ( c & 0x80 ) ? poly ^ ( c << 1 ) : ( c << 1 );
}
crctable[i] = (byte) c;
}
}
========== 사용하기 ===============
#define CRC8_INIT_VALUE 0x0000
#define CRC8_XOR_VALUE 0x0000
void CRC8_InitChecksum( unsigned char &crcvalue ) {
crcvalue = CRC8_INIT_VALUE;
}
void CRC8_Update( unsigned char &crcvalue, const byte data ) {
crcvalue = crctable[crcvalue ^ data];
}
void CRC8_UpdateChecksum( unsigned char &crcvalue, const void *data, int length ) {
unsigned char crc;
const unsigned char *buf = (const unsigned char *) data;
crc = crcvalue;
while( length-- ) {
crc = crctable[crc ^ *buf++];
}
crcvalue = crc;
}
void CRC8_FinishChecksum( unsigned char &crcvalue ) {
crcvalue ^= CRC8_XOR_VALUE;
}
unsigned char CRC8_BlockChecksum( const void *data, int length ) {
unsigned char crc;
CRC8_InitChecksum( crc );
CRC8_UpdateChecksum( crc, data, length );
CRC8_FinishChecksum( crc );
return crc;
}
=================================================================================================================
x8 + x5 + x4 + 1
이것처럼 계산을 하면 되는데 이를 어떻게 고속으로 계산 하라. 비트 단위로 오는 하드웨어에서나 하는거지...
미리 계산하여 테이블을 만들고 바로 찾아가면 8비트 단위로 나온다. 고속으로
CRC-8 Table
const char tableCRC_8[] = {
0, 49, 98, 83, 196, 245, 166, 151, 185, 136, 219, 234, 125, 76, 31, 46, 67, 114, 33, 16,
135, 182, 229, 212, 250, 203, 152, 169, 62, 15, 92, 109, 134, 183, 228, 213, 66, 115, 32, 17,
63, 14, 93, 108, 251, 202, 153, 168, 197, 244, 167, 150, 1, 48, 99, 82, 124, 77, 30, 47,
184, 137, 218, 235, 61, 12, 95, 110, 249, 200, 155, 170, 132, 181, 230, 215, 64, 113, 34, 19,
126, 79, 28, 45, 186, 139, 216, 233, 199, 246, 165, 148, 3, 50, 97, 80, 187, 138, 217, 232,
127, 78, 29, 44, 2, 51, 96, 81, 198, 247, 164, 149, 248, 201, 154, 171, 60, 13, 94, 111,
65, 112, 35, 18, 133, 180, 231, 214, 122, 75, 24, 41, 190, 143, 220, 237, 195, 242, 161, 144,
7, 54, 101, 84, 57, 8, 91, 106, 253, 204, 159, 174, 128, 177, 226, 211, 68, 117, 38, 23,
252, 205, 158, 175, 56, 9, 90, 107, 69, 116, 39, 22, 129, 176, 227, 210, 191, 142, 221, 236,
123, 74, 25, 40, 6, 55, 100, 85, 194, 243, 160, 145, 71, 118, 37, 20, 131, 178, 225, 208,
254, 207, 156, 173, 58, 11, 88, 105, 4, 53, 102, 87, 192, 241, 162, 147, 189, 140, 223, 238,
121, 72, 27, 42, 193, 240, 163, 146, 5, 52, 103, 86, 120, 73, 26, 43, 188, 141, 222, 239,
130, 179, 224, 209, 70, 119, 36, 21, 59, 10, 89, 104, 255, 206, 157, 172
};
이것을 바로 프로그램에 복사하여 사용하면 된다.
2. CRC-16
CRC-16 CCITT
x16 + x12 + x5 + 1
#define CRC16_INIT_VALUE 0xffff
#define CRC16_XOR_VALUE 0x0000
============ 만들기 ==========================
static unsigned short crctable[256];
/*
Generate a table for a byte-wise 16-bit CRC calculation on the polynomial:
x^16 + x^12 + x^5 + x^0
*/
void make_crc_table( void ) {
int i, j;
unsigned long poly, c;
/* terms of polynomial defining this crc (except x^16): */
static const byte p[] = {0,5,12};
/* make exclusive-or pattern from polynomial (0x1021) */
poly = 0L;
for ( i = 0; i < sizeof( p ) / sizeof( byte ); i++ ) {
poly |= 1L << p[i];
}
for ( i = 0; i < 256; i++ ) {
c = i << 8;
for ( j = 0; j < 8; j++ ) {
c = ( c & 0x8000 ) ? poly ^ ( c << 1 ) : ( c << 1 );
}
crctable[i] = (unsigned short) c;
}
}
/*
Table of CRC-16's of all single-byte values (made by make_crc_table)
*/
static unsigned short crctable[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
3. CRC-32
이것은 이미 사용한 예시 프로그램이 있고, 첨부 파일을 참고하면 된다.
C 언어의 문자형 변수 char
crc32.cpp - CRC을 만든다.
(1) main() 함수의 초기에 테이블을 만든다.
#define k_poly ((unsigned int)(0xedb88320))
#define k_crc_table_size (256)
unsigned int gg_a_crc_table[k_crc_table_size];
char g_comBuff[1024];
typedef unsigned int u32;
typedef struct {
u32 crc;
u32 type;
u32 dlength;
u32 data[1024];
// . . .
} ;
int main(int argc, char* argv[])
{
int cnt;
fn_init_crc_table(); // CRC32 초기화 - CRC Table 작성
makePacket( (PacketStruct *) g_comBuff, (void *) "hello", (int) 6); // 패킷을 만든다.
send(g_comBuff);
// . . .
}
void
fn_init_crc_table()
{
short i_table;
for (i_table = 0; i_table < k_crc_table_size; i_table++)
{
unsigned int result = 0;
short i_bit;
for (i_bit = 0; i_bit < 8; i_bit++)
{
unsigned int bit = ((i_table & (1 << i_bit)) != 0);
if ((bit ^ (result & 1)) != 0)
result = (result >> 1) ^ k_poly;
else
result >>= 1;
}
gg_a_crc_table[i_table] = result;
}
} /* end of fn_init_crc_table */
(2) 테이블을 이용하여 패킷을 만들 때, 데이터로 부터 계산 한다.
통신패킷 설정 :
PacketStruct *makePacket(PacketStruct *pkt, void *data, int leng)
{
unsigned int datalength;
// 데이터 포멧하기
pkt->dlength = leng;
memcpy((void*) &pkg->data, data,leng);
pkt->type= 0x00100020;
datalength = sizeof (PacketStruct) - sizeof(u32);
unsigned short int rcrc = (u32) fn_calc_memory_crc32( (void *) &pkt->type, datalength);
pkt->crc = rcrc;
return pkt;
}
unsigned int
fn_calc_memory_crc32(void *p, unsigned int n_bytes)
{
fnm_assert_stmt(n_bytes > 4);
return(fn_calc_memory_chunk_crc32(p, n_bytes, k_initial_crc_value));
} /* end of fn_calc_memory_crc32 */
static unsigned int
fn_calc_memory_chunk_crc32(void *p, unsigned int n_bytes, unsigned int crc)
{
unsigned char *p_uc = (unsigned char*)p;
unsigned int result = ~crc;
while (n_bytes-- > 0)
{
result = (result >> 8) ^ gg_a_crc_table[(result ^ *p_uc++) & 0xff];
}
return(~result);
} /* end of fn_calc_memory_chunk_crc32 */
==============================================================================
CRC-32 IEEE-802.3
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
#define CRC32_INIT_VALUE 0xffffffffL
#define CRC32_XOR_VALUE 0xffffffffL
static unsigned long crctable[256];
/*
Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0.
Polynomials over GF(2) are represented in binary, one bit per coefficient,
with the lowest powers in the most significant bit. Then adding polynomials
is just exclusive-or, and multiplying a polynomial by x is a right shift by
one. If we call the above polynomial p, and represent a byte as the
polynomial q, also with the lowest power in the most significant bit (so the
byte 0xb1 is the polynomial x^7+x^3+x^1+x^0), then the CRC is (q*x^32) mod p,
where a mod b means the remainder after dividing a by b.
This calculation is done using the shift-register method of multiplying and
taking the remainder. The register is initialized to zero, and for each
incoming bit, x^32 is added mod p to the register if the bit is a one (where
x^32 mod p is p+x^32 = x^26+...+x^0), and the register is multiplied mod p by
x (which is shifting right by one and adding x^32 mod p if the bit shifted
out is a one). We start with the highest power (least significant bit) of
q and repeat for all eight bits of q.
The table is simply the CRC of all possible eight bit values. This is all
the information needed to generate CRC's on data a byte at a time for all
combinations of CRC register values and incoming bytes.
*/
void make_crc_table( void ) {
int i, j;
unsigned long c, poly;
/* terms of polynomial defining this crc (except x^32): */
static const byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
/* make exclusive-or pattern from polynomial (0xedb88320L) */
poly = 0L;
for ( i = 0; i < sizeof( p ) / sizeof( byte ); i++ ) {
poly |= 1L << ( 31 - p[i] );
}
for ( i = 0; i < 256; i++ ) {
c = (unsigned long)i;
for ( j = 0; j < 8; j++ ) {
c = ( c & 1 ) ? poly ^ ( c >> 1 ) : ( c >> 1 );
}
crctable[i] = c;
}
/*
Table of CRC-32's of all single-byte values (made by make_crc_table)
*/
static unsigned long crctable[256] = {
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL,
0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L,
0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL,
0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L,
0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L,
0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L,
0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL,
0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L,
0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL,
0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL,
0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L,
0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L,
0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L,
0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL,
0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL,
0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL,
0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L,
0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L,
0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L,
0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL,
0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L,
0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL,
0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L,
0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L,
0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L,
0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L,
0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
};
더보기
더보기
더보기
더보기
출처 :
http://www.ktechno.co.kr/pictech/motor02.html
1. 토크란 무엇인가?
모터 등의 선택시에 필요하게 되는 파라미터 가운데서 "토크"라고 하는 것이 있다.
이 토크(torque)란, 회전력이라고도 표현할 수 있는데, 물체를 동작시키려 할 때에 필요로 하는 힘을 표현한 것이다.
물체를 동작시킬 때의 필요한 토크는 아랫 그림과 같이 가속기간과 등속운동 기간에서 다르다.
2. 실제 대략적인 계산 토크를 구하는 방법
아랫 그림과 같은 삼륜차를 실례로, 동륜(動輪)의 축에 필요한 토크를 구하는 방법을 설명한다.
Tm=Ta+L
등속운동기간
Tm=L
Tm: 동륜축의 토털 토크
Ta: 가속 토크
L: 마찰부하 토크
이것을 윗 그림의 구체적인 물체에서 계산에 의해 구하려면 다음과 같이 한다.Ta=J/g×2πf/t Ta: 가속토크(kg·cm)
J: 부하관성 모멘트(kg·cm2)
g: 중력가속도(980cm/sec2)
J=WD2/8 f: 동륜의 등속운전속도(회전/sec)
t: 가속기간의 시간(sec)
W: 물체의 전체중량(kg)
L=μWD/4 μ: 마찰계수(0.09)
D: 동륜의 직경(cm)
3. 실제의 사례
다음과 같은 실제 삼륜차에서 구해 보기로 한다.
W: 2kg D:5cm f: 2회전/sec t: 0.5sec
J=2×5×5/8=6.25(kg·cm2)
Ta=6.25/980×6.28×2/0.5=0.16(kg·cm)
L=0.09×2×5/4=0.225(kg/cm)
여기서 가속기간과 등속기간의 토크는 아래와 같이 된다.
Tm(가속)=0.16+0.225=385(g·cm)
Tm(등속)=225(g·cm)
4. 모터의 선택법
위의 실례에 적당한 모터는 어떤 것이 될까?
우선 필요한 기동 토크는 385(g·cm)이지만, 안전율을 1.5배 정도로 보고, 600(g·cm) 이상으로 한다.
앞 페이지의 모터 카탈로그로에서 보면 기동 토크가 600(g·cm)를 넘는 것은 RS540 뿐이다. 그러나 이것으로는 모터 자체가 너무 크고 배터리나 모터의 중량을 가미하면 2kg의 전체 중량을 훨씬 넘어 버린다.
그러면 어떻게 하면 좋을까?
그렇다... 기어를 사용한다. 동륜축에 기어를 부착하여 감속시키는 방법이다. 그렇게 하면 모터의 토크를 기어에 비례하여 감속시킬 수 있다.
간단한 공작 실험을 한다면 모형점에서도 기어 세트를 구입할 수 있는데, 예를 들면 모터는 RE260이고, 기어 세트에서 기어비가 40:1이나 65:1인 경우, 40:1로 했을 때, RE260의 기동 토크는 50~90이므로 기어 후에는 2000부터 3600까지 할 수 있어, 필요한 600(g·cm)은 충분히 구동할 수 있다는 계산이다.
또, 등속 운전시에는 RE260의 적정 부하토크가 10∼15(g·cm)이므로 40배하며, 역시 400부터 600(g·cm)의 토크를 낼 수 있으므로 필요한 225×1.5배=338(g·cm)를 충분히 구동할 수 있다.
그러나, 가속기간의 최종 단계 무렵에는 모터의 적정 부하시의 토크로 구동하는 것이 되는 셈이므로, 600(g·cm)의 토크를 내기 위해서는 모터의 적정 부하시의 토크로 15g·cm 이상의 토크가 필요하기 때문에 1.5V로 구동하는 것은 사실 역부족이다.
따라서 모터에 가하는 전압은 3V로 하게 된다.
즉, 모터가 낼 수 있는 있는 토크는 속도가 높아지면 반비례하여 내려가는 점에 주의할 필요가 있다.
회전수는 충분한가?
적정 부하시의 RE260의 회전수는 5000∼10100이므로 이 40분의 1은 125∼252 회전/분이므로, 2회전/sec 즉 120회전/분을 충분히 커버할 수 있다.
이 관계를 그림으로 나타낸 것이 아랫 그림인데, 황색의 범위가 필요하게 되는 토크와 회전수의 범위로 되지만, 이것이 모터의 적정부가 동작의 범위내에 들어가 있으면 문제없이 구동할 수 있는 것이다.
5. 기어 세트의 예
실제로 실험에서 사용하는 기어 세트의 예를 다음 표에 나타낸다.
기어 명칭
저속 기어비
고속 기어비
사용 모터
하이스피드박스
11.6:1
18:1
RE260
RE140하이파워박스
41.7:1
64.8:1
RE260
RE140웜기어박스
216:1
336:1
RE260
RE140유성 기어박스
4:1~400:1까지 14종
RE260
RE140
-
고립된 강체의 회전운동 상태는 그대로 유지된다. 강체의 회전운동 상태를 변화시키는 요인을 돌림힘이라고 부르며, 같은 돌림힘에 대해서도 물체에 따라서 회전운동 상태가 변화하는 정도는 다르다. 물체의 회전운동 상태는 각속도 ω 로, 회전운동 상태에 변화가 일어나는 정도는 각가속도 α로 정량화되며, 물체의 각가속도와 물체에 가해진 총돌림힘 τ사이에는
τ = I dω/dt = I α (1)
즉, 정비례 관계가 성립하는데 이 비례상수가 물체의 관성 모멘트 I 이다.
여러 개의 입자로 구성되어 있으면서 입자 사이의 상대적인 위치가 고정되어 있는 계의 경우, 어떤 축에 대한 관성 모멘트는
I = ∑ miri2 (i 는 입자의 지표) (2)
i
이고, 여기서 mi 는 i 번째 입자의 질량이고 ri 는 축으로부터 그 입자까지의 직선거리이다.
질량이 균일하게 분포되어 있는 강체의 경우에는 이를
I = ∫ r2 dm (3)
라고 쓸 수 있는데, 여기서 ρ 는 강체의 밀도이고, r 은 축으로부터의 거리이다. 대칭적인 물체의 경우에는 관성 모멘트를 비교적 쉽게 계산할 수 있는데, 이때 관성 모멘트는 같은 물체의 경우라도 어떤 축을 회전축으로 하느냐에 따라서 달라지므로, 관성 모멘트를 얘기할 때는 반드시 축을 함께 나타내야만 한다. 관성 모멘트 계산의 한 예로, 반지름 R 인 원판의 경우에 판에 수직한 중심 축을 회전축으로 할 때는 식(3)에서
dm = ρ2πr2dr , ρ=M/πR2 (4)
로 쓸 수 있으므로,
I = (1/2)MR2 (5)
이 된다. 그림에 몇 가지 대칭적인 물체의 관성 모멘트를 나타내었다.
관성 모멘트의 편리한 특성으로 어떤 한 축에 대한 관성 모멘트 I1 을 알면, 그 축과 평행한 다른 축을 회전축으로 했을 때의 관성 모멘트 I2 를 알 수 있다.
I2 = I1 + Mr2 (6)
여기서 M 은 물체의 총 질량, r 은 두 축간의 거리이다. 이 관계를 평행축 정리(parallel axis theorem)라고 부르며 평행한 축들 사이에서만 성립된다. 평행축 정리를 적용하는 한 예로 경사진 면을 굴러 내려오는 쇠공의 경우와 같이, 면과의 접점을 지나면서 면에 평행한 회전축에 대한 쇠공의 관성 모멘트는 식(6)과, 중심 축에 대한 쇠공의 관성 모멘트가 (2/5)MR2 인 것으로부터
I = (2/5)MR2 + Mr2 = (7/5)MR2 (7)
이 된다.
Prev
Rss Feed