windows 8 사용중 AVRISP MK-II 드라이버 문제 발생.

학습/AVR 2012. 10. 31. 15:49 Posted by 보노보노보노

윈도우 8 설치후 드라이버 설치 문제가 발생하였다.

 

" 이 하드웨어에 대한 장치 드라이버를 로드할 수 없습니다. 드라이버가 손상되었거나 누락된 것 같습니다. (코드 39)"

아래와 같이 오류 메세지가 나타나며 드라이버 설지가 되지않았다.

해결 방안:

ATMEL 사 홈페이지에서 서비스팩을 설치 한 결과 이상 없이 인식되었다.

- 인식 결과 -

 

Atmel Studio 6.0 Service Pack 1 : http://www.atmel.com/Images/as6installer-stable-servicepack1-6.0.1938.exe

 

 

 

SRF-10,08 구동

학습/AVR 2010. 12. 16. 14:16 Posted by 보노보노보노

 




IHLAB-128보드 로 제작하였음.

SRF-08과 SRF-10은 같은 TWI(I2C)방식으로 제어방식이 동일함.


동작 순서 : setup_TWI() -> startRanging(주소) -> 65ms 이상 대기    -> getRange(주소)  순으로 되어있으며,
                   TWI 초기화  ->   거리감지 시작    -> 측정시간동안 대기 -> 거리얻어오기         순서이다..

주소는 초기 0xE0로 설정되어있지만 변경하여서 0xE2 ~ 0xEA까지로 바꾸었다.

새제품일 경우는 조소에 0xE0로 하여  Test 하변 된다.

 
참고자료 : http://www.robot-electronics.co.uk/htm/srf10tech.htm

사용법은 압축파일의 소스에 설명.





- 하이퍼 터미널 Test 화면 -



- 보드상의 LCD 출력-




- 초음파 센서 장착 사진  -





[API] Window를 항상 맨위에 보이게 하기

학습/C 2010. 4. 2. 20:09 Posted by 보노보노보노

//--- External Function에 다음과 같이 선언하시고
Function Long SetWindowPos (Long hwnd ,Long  hWndInsertAfter ,Long  x ,Long  y ,Long  cx ,Long  cy ,Long  wFlags ) Library "user32"

//--- 다음과 같이 기술합니다.
Constant Long HWND_TOPMOST = -1                  //맨위로 설정할때
Constant Long HWND_NOTOPMOST = -2            // 설정을 해제할때
Constant Long SWP_NOSIZE = 1

SetWindowPos (Handle(W_NAME), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE)
[이 게시물은 사랑니님에 의해 2009-08-02 15:38:47 PowerBuilder에서 이동 됨]
[출처] IT.DevInfo ∽ 힘든 IT개발자들의 즐거운 공유(ITDI.co.kr) - http://wss02.ivyro.net/onuri/bbs/board.php?bo_table=02_2&wr_id=68



Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const HWND_TOP = 0
Private Const HWND_BOTTOM = 1
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2

Function EnabledAlwaysOnTop(hwnd As Long) As Long
EnabledAlwaysOnTop = SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
End Function


Function DisabledAlwaysOnTop(hwnd As Long) As Long
    DisabledAlwaysOnTop = SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
End Function

 

'사용법은
call EnabledAlwaysOnTop(form1.hwnd)
[출처] 항상위(Allways on TOP) 표현 API|작성자 곱단이


http://blog.naver.com/seamusic00?Redirect=Log&logNo=120014901361





 

글리치(glich)

학습 2009. 5. 3. 20:31 Posted by 보노보노보노

글리치(Glitch)

 불필요한 부분에 발생하는 노이즈 펄스로 인해 일어나는 컴퓨터의 일시적인 오동작. 잘못된 출력이나 시스템 충돌을 일으키는 원인이 된다. 글리치가 하드웨어적인 문제인 데 비해, 소프트웨어적인 문제로 오동작이 일어나는 것을 버그라고 한다.



API 시작하기 #2 - 문자열 출력

학습/API 2009. 2. 11. 20:02 Posted by 보노보노보노


#include<windows.h>
// WINAPI : 09년 2월 11일

/* WndClass 정의 -> 클레스 등록- > 메모리상의 윈도우 생성 -> 윈도우 화면에 표시 -> 사용자로부터의 메시지 처리. */


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hlnst;     //인스턴스 핸들형 g_hlst 선언.
LPCTSTR lpszClass=TEXT("first"); //LPCTSTR -> const char* 형태 .
     
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
      LPSTR lpszCmdLine, int nCmdshow)
{
 /*hInstance   : 프로그램의 인스턴스 핸들,  hPrevInstance : 앞에서 실행된 현재프로그램의 인스턴스 핸들*/
 /*lpszCmdLine : 명령행,입력된 프로그램의 인수. 도스의 argv, 보통 실행직후에 열 파일의 경로.  */
 /*nCmdshow    : 프로그램이 실행될 형태, 최소화,보통모양등*/

 HWND hWnd;        // 윈도으 핸들을 생성.
 MSG Message;       // MSG구조체인 Message생성.
 WNDCLASS WndClass;      // 윈도우 클래스 생성.
 g_hlnst=hInstance;      //

 WndClass.cbClsExtra  = 0;   //예약 영역, 내부적으로 사용하며 아주 특수한 목적에 사용되는 여분의 공간.
 WndClass.cbWndExtra  = 0;   //사용하지 않을시에는 0으로 지정
 WndClass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
       // CreateHatchBrush(HS_DIAGCROSS,RGB(110,20,200)); // 배경과 무니 지정.
       // CreateSolidBrush(RGB(0,0,255));   // RGB색상으로 배경을 칠함.
       // (HBRUSH)GetStockObject(LTGRAY_BRUSH); //LTGRAY_brush(회색)로 배경을 칠함. (기본)
       // (HBRUSH)GetStockObject(BLACK_BRUSH);  //black_brush(검정색)로 배경을 칠함.(기본)
       // (HBRUSH)GetStockObject(WHITE_BRUSH);  //white_brush(백색)로 배경을 칠함.  (기본)
       // 기본 브러쉬는 위의 3개임. <- 10/02/09

 WndClass.hCursor  = LoadCursor(NULL,IDC_ARROW); 
       // IDC_CROSS : 십자가모양.  IDC_IBEAM : I자 모양,  IDC_NO : 원안베 빗금처리. 
       // IDC_ARROW : 기본 화살표.  IDC_WAIT : 모래시계.

 WndClass.hIcon   = LoadIcon(NULL,IDI_APPLICATION); // 기본제공하는 아이콘 (네모 윈도 박스)
       // IDI_EXCLAMATION : 주의 모양 (삼각형)  IDI_ERROR  : 에러모양(원안에 X)
       // IDI_ASTERISK  : 정보모양 (i)    IDI_QUESTION : 질문모양 (물음표)

 WndClass.hInstance  = hInstance; // 윈도 클래스를 등록하는 프로그램의번호.
 WndClass.lpfnWndProc = WndProc;  // 윈도우의 메시지 처리함수 지정.
           // 메세지 발생시 이 멤버가 지정하는 함수가 호출됨

 WndClass.lpszClassName = lpszClass;     // 클레스 이름을 저장한 lpszClass값을 대입.
 WndClass.lpszMenuName = NULL;       // 메뉴
 WndClass.style   = CS_HREDRAW|CS_VREDRAW;  // 윈도우의 스타일 ,CS_HREDRAW : 수평크기가 달라지면 다시 그림
               // CS_VREDRAW :수직의 크기가 달라지면 다시 그려줌.
 RegisterClass(&WndClass);    //WndClass를 등록함(번지를 통해서 ).

 

 hWnd=CreateWindow(
  lpszClass,    // lpszClassName : 클래스 이름
  lpszClass,    // lpszWindowName : 윈도우 이름, 타이틀바에 나타날 문자열.
        //      TEXT("알림"), 등으로 윈도우 이름 변환 가능.

  WS_OVERLAPPEDWINDOW, // dwStyle   : 윈도우의 형태를 지정하는 인수.
 
  //WS_OVERLAPPEDWINDOW : overlapped,caption,sysmenu,thickfream,minimizebox,maximizebox
        //      WS_OVERLAPPEDWINDOW스타일을 사용시 무난함.
        
  100,//CW_USEDEFAULT, // X    : X축 시작위치.
  100,//CW_USEDEFAULT, // Y    : Y축 시작위치.
  320,//CW_USEDEFAULT, // nWidth   : 폭의 크기.
  240,//CW_USEDEFAULT, // nHeight   : 높이의 크기.
  NULL,     // hWndParent  : 부모윈도가 있을경우 부모윈도의 핸들 최상위의 경우 NULL
  (HMENU)NULL,   // hmenu   : 윈도우에서 사용할 핸들을 지정.
  hInstance,    // hinst   : 윈도우를 만드는주체, 핸들을 지정. 프로그램 종료시
        //      파괴되지 않은 윈도우를 자동으로 파괴.
  NULL     // lpvParam   : 여러 개의 윈도우를 만들 때 각 윈도우에 고유의 파라미터를 전달. 특수목적.
  );

 ShowWindow(hWnd,nCmdshow);    // 윈도우의 핸들을(hWnd)가지고 화면 출력하는 방법을 지정.

 while(GetMessage(&Message,NULL,0,0)) // 메시지큐에서 메시지를 읽어옴. WM_QUIT일경우 FALSE출력. 그외의 경우 TRUE
 {
  TranslateMessage(&Message);   // 키보드의 입력을 가공하여 프로그램에 쓸수 있도록 한다.
           // ex) A를 누르면 A문자가 입력되었다는 메시지를 만들어냄.
  DispatchMessage(&Message);   // 메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리함수 (WndProc)로 전달.
           // 그후 다시 루프의 선두로 돌아가 다음 메시지를 기다린다.
 }
 return (int)Message.wParam;    // WM_QUIT 메시지로부터 전달된 탈출코드. 운영체제로 리턴된다.
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage ,WPARAM wParam,LPARAM lParam) 
// hWnd : 메세지 받는 윈도우 핸들, iMessage :어떤 종류의 메시지인가, WPRAM,LPARAM :부가적인 정보를 가진다.
// 메시지 발생시 프로그램의 반응을 처리하는 일을 함. 운영체제에 의해 호출됨.
// 이렇게 운영체제에 의해 호출되는 응용 프로그램 내의 함수를 callback함수라고 한다.
{
 static mode=1;

 HDC hdc;
 PAINTSTRUCT ps;
 RECT rt={100,100,400,300};  //x,y축의 시작점과 끝점을 입력.
 TCHAR *strr=TEXT("님은 갔습니다. 아아 사랑하는 님은 갔습니다. 푸른 산빛을 "
  "깨치고 단풍나무 숲을 향하여 난 작은 길을 걸어서 차마 떨치고 갔습니다 "
  "황금의 꽃같이 굳고 빛나던 옛 맹세는 차디찬 티끌이 되어 한숨의 미풍에 "
  "날아갔습니다");  //출력할 문자열.

 switch(iMessage)
 {
 case WM_DESTROY:
  PostQuitMessage(0);  //창을 단으려하거나 alt+f4의 경우 WM_QUIT 메시지를 생성.
  return 0;

 case WM_LBUTTONDOWN:
  mode=2;

  return 0;

 case WM_PAINT:
  if(mode==2)
  {
   ////////////////////////////////////////////////////////////////////////////////////////////////
   //TEXT 출력방법 #1  //단순히 문자를 출력.
   /*         
   hdc=GetDC(hWnd);      //핸들을 얻어옴.
   TextOut(hdc,10,10,TEXT("Bonobono"),8); //문자열을 출력.
   ReleaseDC(hWnd,hdc);     //핸들을 반환.
   */

   ////////////////////////////////////////////////////////////////////////////////////////////////
   //TEXT 출력방법 #2 문자열에 이것저것 속성을 변화시킴.
   /*          
   hdc=BeginPaint(hWnd,&ps);    //핸들을 얻어와서.( PAINTSTRUCT ps 생성 요망)
  
   SetTextAlign(hdc,TA_UPDATECP);   //문자의 표시 속성 setting
         //TA_TOP : 위쪽,  TA_BOTTOM : 아래,
         //TA_LEFT : 제일 왼쪽.TA_CENTER : 중심, TA_RIGHT : 오른쪽. (OR연산자로 연동가능.)
         //TA_UPDATECP : 좌표 무시하고 화면의 왼쪽 제일 위에서부터 출력.
   
   TextOut(hdc,100,10,TEXT("RnA is"),6);   //얻어온 핸들로 10,10에 6의크기를 가진 문자를 출력한뒤.
   TextOut(hdc,100,30,TEXT("My Robot"),7);   //얻어온 핸들로 10,10에 6의크기를 가진 문자를 출력한뒤.
   TextOut(hdc,100,50,TEXT("Turning point"),13); //얻어온 핸들로 10,10에 6의크기를 가진 문자를 출력한뒤.
   EndPaint(hWnd,&ps);
   */

   ////////////////////////////////////////////////////////////////////////////////////////////////
   //TEXT 출력방법 #3 변수를 문자열에 대입하여 출력
   /*         
   hdc=GetDC(hWnd);      // DC 핸들을 얻어와서
   TCHAR temp[100];      // 임시 작업할 공간 생성.
   wsprintf(temp,TEXT("dddd%d"),10);  // 문자열 만들어 값을 대입하거나 할때 사용.
   TextOut(hdc,10,10,temp,lstrlen(temp)); // 핸들로 10,10 위치에 작어한 문자열을 문자열의 크기만큼 출력.
   ReleaseDC(hWnd,hdc);     // 핸들 반환.
   */

   ////////////////////////////////////////////////////////////////////////////////////////////////
   //TEXT 출력방법 #4 문자열을 입력받아 사각형안에만 출력.
   
   // 함수의 시작부분에 선언해야 할 것들. 
   /* RECT rt={100,100,400,300};  //x,y축의 시작점과 끝점을 입력.여기서 정한 만큼의 사각형이 만들어지고 그만큼 출력.
    TCHAR *strr=TEXT("님은 갔습니다. 아아 사랑하는 님은 갔습니다. 푸른 산빛을 "
     "깨치고 단풍나무 숲을 향하여 난 작은 길을 걸어서 차마 떨치고 갔습니다 "
     "황금의 꽃같이 굳고 빛나던 옛 맹세는 차디찬 티끌이 되어 한숨의 미풍에 "
     "날아갔습니다"); */ //출력할 문자열.
   /*
   // 실제 처리 루틴
   hdc=BeginPaint(hWnd,&ps);    // 핸들을 얻어와서.
   DrawText(hdc,strr,-1,&rt,DT_CENTER|DT_WORDBREAK); //RECT에 설정된 크기만큼의 박스를 만들어 출력한뒤.
        // nCount  -1 :
        // lpRect &rt : rt에 만들어논 출력 박스의 크기 를 불러옴.
        // nFormat  : 출력방식-> DT_LEFT,RIGHT,CENTER,BOTTOM : 정렬기준 설정.
        //  _VCENTER: 사각영역의 수직중앙, _WORDBREAK : 사각영역의 오른쪽끝에서 자동줄바꿈.  
        //  _SINGLELINE : 한줄출력,   _NOCLIP  : 사각영역을 벗어나도 출력.(자르지 않고)

   EndPaint(hWnd,&ps);      // 핸들반환.
   */ 
   
   ////////////////////////////////////////////////////////////////////////////////////////////////
  MessageBeep(0);     //비프 메시지.
   return 0;
  }
 }
 return DefWindowProc(hWnd,iMessage,wParam,lParam); //default
}

 

APl 시작하기 #1

학습/API 2009. 2. 10. 21:39 Posted by 보노보노보노


#1 . 단순한 윈도우 생성.

기초가되는 윈도우창을 생성.


#include<windows.h>
// WINAPI : 09년 2월 10일

/* WndClass 정의 -> 클레스 등록- > 메모리상의 윈도우 생성 -> 윈도우 화면에 표시 -> 사용자로부터의 메시지 처리. */


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hlnst;     //인스턴스 핸들형 g_hlst 선언.
LPCTSTR lpszClass=TEXT("first"); //LPCTSTR -> const char* 형태 .
     
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
      LPSTR lpszCmdLine, int nCmdshow)
{
 /*hInstance   : 프로그램의 인스턴스 핸들,  hPrevInstance : 앞에서 실행된 현재프로그램의 인스턴스 핸들*/
 /*lpszCmdLine : 명령행,입력된 프로그램의 인수. 도스의 argv, 보통 실행직후에 열 파일의 경로.  */
 /*nCmdshow    : 프로그램이 실행될 형태, 최소화,보통모양등*/

 HWND hWnd;        // 윈도으 핸들을 생성.
 MSG Message;       // MSG구조체인 Message생성.
 WNDCLASS WndClass;      // 윈도우 클래스 생성.
 g_hlnst=hInstance;      //

 WndClass.cbClsExtra  = 0;   //예약 영역, 내부적으로 사용하며 아주 특수한 목적에 사용되는 여분의 공간.
 WndClass.cbWndExtra  = 0;   //사용하지 않을시에는 0으로 지정
 WndClass.hbrBackground = CreateSolidBrush(RGB(0,0,255)); // RGB색상으로 배경을 칠함.
       // (HBRUSH)GetStockObject(LTGRAY_BRUSH); //LTGRAY_brush(회색)로 배경을 칠함. (기본)
       // (HBRUSH)GetStockObject(BLACK_BRUSH);  //black_brush(검정색)로 배경을 칠함.(기본)
       // (HBRUSH)GetStockObject(WHITE_BRUSH);  //white_brush(백색)로 배경을 칠함.  (기본)
       // 기본 브러쉬는 위의 3개임. <- 10/02/09

 WndClass.hCursor  = LoadCursor(NULL,IDC_ARROW);  // 윈도우 기본제공하는 커서 
 WndClass.hIcon   = LoadIcon(NULL,IDI_APPLICATION); // 기본제공하는 아이콘

 WndClass.hInstance  = hInstance; // 윈도 클래스를 등록하는 프로그램의번호.
 WndClass.lpfnWndProc = WndProc;  // 윈도우의 메시지 처리함수 지정.
           // 메세지 발생시 이 멤버가 지정하는 함수가 호출됨
 WndClass.lpszClassName = lpszClass;     // 클레스 이름을 저장한 lpszClass값을 대입.
 WndClass.lpszMenuName = NULL;       // 메뉴
 WndClass.style   = CS_HREDRAW|CS_VREDRAW;  // 윈도우의 스타일 ,CS_HREDRAW : 수평크기가 달라지면 다시 그림
               // CS_VREDRAW :수직의 크기가 달라지면 다시 그려줌.
 RegisterClass(&WndClass);    //WndClass를 등록함(번지를 통해서 ).

 

 hWnd=CreateWindow(
  lpszClass,    // lpszClassName : 클래스 이름
  lpszClass,    // lpszWindowName : 윈도우 이름, 타이틀바에 나타날 문자열.
  WS_OVERLAPPEDWINDOW, // dwStyle   : 윈도우의 형태를 지정하는 인수.
        //      WS_OVERLAPPEDWINDOW스타일을 사용시 무난함.
  CW_USEDEFAULT,   // X    : X축 시작위치.
  CW_USEDEFAULT,   // Y    : Y축 시작위치.
  CW_USEDEFAULT,   // nWidth   : 폭의 크기.
  CW_USEDEFAULT,   // nHeight   : 높이의 크기.
  NULL,     // hWndParent  : 부모윈도가 있을경우 부모윈도의 핸들 최상위의 경우 NULL
  (HMENU)NULL,   // hmenu   : 윈도우에서 사용할 핸들을 지정.
  hInstance,    // hinst   : 윈도우를 만드는주체, 핸들을 지정. 프로그램 종료시
        //      파괴되지 않은 윈도우를 자동으로 파괴.
  NULL     // lpvParam   : 여러 개의 윈도우를 만들 때 각 윈도우에 고유의 파라미터를 전달. 특수목적.
  );

 ShowWindow(hWnd,nCmdshow);    // 윈도우의 핸들을(hWnd)가지고 화면 출력하는 방법을 지정.

 while(GetMessage(&Message,NULL,0,0)) // 메시지큐에서 메시지를 읽어옴. WM_QUIT일경우 FALSE출력. 그외의 경우 TRUE
 {
  TranslateMessage(&Message);   // 키보드의 입력을 가공하여 프로그램에 쓸수 있도록 한다.
           // ex) A를 누르면 A문자가 입력되었다는 메시지를 만들어냄.
  DispatchMessage(&Message);   // 메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리함수 (WndProc)로 전달.
           // 그후 다시 루프의 선두로 돌아가 다음 메시지를 기다린다.
 }
 return (int)Message.wParam;    // WM_QUIT 메시지로부터 전달된 탈출코드. 운영체제로 리턴된다.
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage ,WPARAM wParam,LPARAM lParam) 
// hWnd : 메세지 받는 윈도우 핸들, iMessage :어떤 종류의 메시지인가, WPRAM,LPARAM :부가적인 정보를 가진다.
// 메시지 발생시 프로그램의 반응을 처리하는 일을 함. 운영체제에 의해 호출됨.
// 이렇게 운영체제에 의해 호출되는 응용 프로그램 내의 함수를 callback함수라고 한다.
{
 switch(iMessage)
 {
 case WM_DESTROY:
  PostQuitMessage(0);  //창을 단으려하거나 alt+f4의 경우 WM_QUIT 메시지를 생성.
  return 0;
 }
 return DefWindowProc(hWnd,iMessage,wParam,lParam); //default
}

 

케릭터 LCD 기본 구동.

학습/AVR 2008. 12. 15. 15:51 Posted by 보노보노보노

케릭터 LCD( CLCD )의 기본 구동원리및 구동법을 PPT 자료로 정리한 문서.

4line x 20의 LCD와 AVR( ATMEGA128 ), AVR STUDIO를 기반으로 제어하였음.



- 이번에 제어한 PMC2004E-SBLW -



- 실제 동작 사진 -
 

 

Clcd구동.pptx

C언어 이야기...

학습/C 2008. 12. 10. 21:17 Posted by 보노보노보노

 

왼쪽으 켄 톰슨과 오른쪽의 데니스 리치



  초기 C 언어의 개발은 1969년 부터 1973년 사이 AT&T 벨 연구소에서 이루어졌다. 보통 C 언어가 컴퓨터의 앞글자 'C' 를 따서 지었다고 생각하겠지만 실제로는 C 언어의 개발자 켄 톰슨 ( Ken Thompson) 에 따르면,  C 언어가 원래 B 언어라는 또 다른 컴퓨터 언어의 발전된 버전이였기에 C 언어라 지었던 것이다.

  C 언어를 개발하게 된 동기는 유닉스 운영체제의 발전과 밀접한 관련이 있다. 그들은 운영체제를 PDP-11 ( 16비트 마이크로프로세서의 컴퓨터 ) 에 이식시키려고 했는데, 그들이 사용하려고 했던 B 언어는 PDP - 11 컴퓨터의 몇가지 주요한 기능들을 사용할 수 없어서 (예를들어 바이트 주소지정방식 등 ) 그들은 C 언어의 초기 버전을 개발하였다.
 
  초기의 PDP - 11 버전의 유닉스 시스템은 어셈블리 언어로 개발되었다. 1973년에 구조체 기능이 추가된 C 언어는 굉장히 강력한 언어가 되어서 어셈블리로 쓰여졌던 유닉스 운영체제의 커널을 C 언어로 다시쓰게 되었다. 이는 어셈블리 언어가 아닌 다른 언어로 쓰여진 최초의 언어 중 하나가 되었다. ( 그 외에도 어셈블리 언어로 쓰여지지 않는 운영체제의 커널은 멀틱스(Multics) 시스템의 PL/I 언어와, Burroughs B5000 는 ALGOL 이다. )


  1978년에 브라이언 커닝핸(Brian Kernighan) 과 데니스 리치(Dennis Ritchie) 는 'The C Programming Language ( C 프로그래밍 언어) '  라는 책의 첫 출판을 하였다. 이 책은 흔히 프로그래머들 사이에서 "K&R" 이라고 불리어 졌으며 이 때문에 책에서 나온 C 언어는 흔히 "K&R C"  라고 불리어졌다. 두번째 에디션의 'The C Programming Language' 는 책 표지에 ANSI C 마크가 부착되어있다.

  K&R 에 나와있는 몇 가지 언어의 중요한 기능들을 살펴보자면 :

  • 표준 입출력 (I/O) 라이브러리
  • long int 데이터 형식
  • unsigned int 데이터 형식
  • 복합 할당 연산자 (compound assignment operators) =op 는 i=-10 과 같이 애매모호한 의미를 띄는 것을 막기 위해 op= 로 바뀌었다. 왜냐하면 i=-10 은 원래 i =- 10 으로 번역되었으나 실제로 프로그래머가 의미하는 것은 i = -10 일 수 도 있기 때문이다.

  1989 C 표준이 발표된 후, 많은 해 동안 K&R C 는 아직도 많은 사람들이 사용하는 언어였다. 왜냐하면 많은 수의 낡은 컴파일러들이 아직도 사용되고 있었고 아주 잘 쓰여진 K&R C 코드는 C 표준도 잘 만족하였다.

  1970 ~ 1980 년 동안 여러 버전의 C 는 수 많은 메인프레임 컴퓨터, 미니 컴퓨터, IBM PC 를 포함한 마이크로 컴퓨터 등에 이식되면서 이에 대한 인기가 치솟았다. 1983년에는 미국 표준 협회 (American National Standards Institute , ANSI ) 는 위원회를 조직해서 X3J11 를 C 의 표준으로 결정하였다. 1989 년에는 표준이 ANSI X3 으로 승인되었다. 이 때 이 버전의 C 언어를 ANSI C 또는 표준 C 라 부르며 가끔씩 C89 라 부르기도 한다.

  1990 년에 ANSI C 표준은 국제 표준화 기구 (International Organization for Standardization, ISO ) 에 의해 흔히 C90 이라 불리던 ISO/IEC 9899:1990 으로 받아들여 졌다. 그 후로 C 표준화 작업이 계속되었다.

  C 표준화 작업의 한 목표는 K&R C 의 비공식적인 기능들을 포함하는 C 를 마드는 것이다. 표준화 위원회는 이전에 포함되지 않았던 함수 프로토 타입 (function prototypes) , void 포인터, 국제 문자표에 대한 지원과 전처리기 등에 대한 사항을 추가시켰다

  C89 는 현재의 여러 C 컴파일러에서도 지원이 되었고 이는 현재의 대부분의 C 코드가 이 언어를 바탕으로 쓰여졌다. 표준 C 로 쓰여진 소프트웨어와 적당한 하드웨어만 있으면 현재의 어떤 플랫폼 에서도 상당히 잘 작동할 수 있다.

   C 언어가 가장 필요한 부분은 임베디드 시스템이나 운영체제와 같은 시스템 프로그래밍에서다. 코드의 효율이나 특정한 하드웨어 주소 접근 능력 등과 같은 것들 때문에 시스템 프로그래밍에 매우 적합하다. 또한 C 는 비록 프로그램의 크기가 커질 수록 복잡히 진다는 단점이 있지만 엔드-유저(end-user) 프로그램에 매우 많이 이식되어 있다. C 가 매우 많이 사용됨에 따라 라이브러리, 컴파일러,  그리고 다른 언어의 컴파일러 들이 모두 C 로 작성되어 있다.

참고자료 : http://en.wikipedia.org/wiki/C_(programming_language)

출처 : http://kevin0960.tistory.com/