1. 프로세스(process)의 정의프로세스는 1960년대 운영체제 Multics를 설계한 사람들이 처음 사용하였고 그 후 IBM 운영체제에서는 task라는 용어로 사용되었다. 일반적으로 실행중인 프로그램이라는 개념이 많이 사용된다. 여기서 프로그램은 비활동적인 개체로서, CPU가 이 프로그램에게 생명을 불어 넣을 때 비로소 그것을 우리는 프로세스라고 부르는 활동 중인 개체가 된다. 하나의 프로세스는 생성된 후에, 프로그램에 명시된 작업을 수행하고, 작업이 완료되면 최종적으로 종료되어 없어진다. 임의의 프로세스는 다른 프로세스를 생성하도록 OS에게 시스템 콜 함수를 통하여 요청할 수 있다. 이 때 생성을 요청한 프로세스는 부모 프로세스(parent process)가 되고, 이 과정에서 생성된 프로세스는 자식 프로세스(child process)가 된다. 종료되는 과정은 실행중인 프로세스 자신이 스스로 OS에 시스템 콜 함수를 통하여 종료를 요청한다. 부모 프로세스는 필요에 따라 특정한 자식 프로세스를 강제로 종료시키도록 OS에 시스템 콜 함수로 요청할 수도 있다.2. 프로세스의 상태일반적으로 가장 많이 보급되어 있는 컴퓨터에는 CPU가 한 개밖에 없고, 또한 하나의 CPU는 동시에 한 개의 프로세스만을 처리할 수 있다. 프로세스의 상태(state)는 프로그램이 수행되면서 변화되는데 이들 상태가 반복되면서 프로세스는 완료된다.(1) 제시상태(submit)사용자가 작업을 복수개의 카드덱 형태로 카드리더에 적재하는 것을 작업을 시스템에 제시하였다 봄으로써 이를 제시상태라 한다. 카드덱에는 작업제어를 위한 작업제어 카드도 같이 있다.(2) 보류상태(hold)운영체제가 작업제어 카드를 해석하여 작업 스케줄러에 의해 작업을 디스크에 수록한 상태를 말한다.(3) 준비상태(ready)운영체제의 작업 스케줄러가 보류상태의 작업을 주기억장치에 적재하여 CPU가 할당되기를 기다리는 상태를 말한다.(4) 실행상태(running)하나의 프로세스가 CPU를 차지하고 있는 상태를 말한다. 운영체제의 프로세스 스케줄러에 의해 할당된다.(5) 대기상태(block)실행중인 프로세스가 할당시간을 초과하기 전에 자신의 입출력 명령을 수행하기 위해 스스로 CPU를 반납하고 채널 등의 입출력 처리기를 사용하며 입출력 완료 신호가 올 때 까지 대기하고 있는 상태를 말한다. waiting상태라고도 한다. 프로세스의 4가지 상태전이 중 프로세스 자신이 프로세스 전이를 일으키는 것은 대기뿐이고 나머지는 모두 외적조건에 의해 발생하는 것이다.(6) 종료상태(complete or halted)실행상태의 프로세스가 정상적으로 작업을 종료하거나 오류가 발생되어 작업이 끝난 상태를 말한다.3. 프로세스에 대한 작업OS는 프로세스의 생성(create)과 파괴(kill) 그리고 연기(suspension), 재시작(resume) 등 몇 가지 작업을 수행하는데 OS에 의한 작업 내용은 다음과 같다.프로세스의 생성과 실행(1) OS에 의해 어떤 프로그램이 선택되면 그 프로그램은 프로세스로 생성되면서 이 때 PCB에도 프로세스 이름, 우선순위, 할당된 자원목록 등의 정보가 기록되며 만들어진다.(2) 생성되는 프로세스는 우선순위에 따라 준비 리스트의 맨 뒤, 혹은 적당한 위치에 들어가 CPU 할당을 기다리게 된다.(3) 각 프로세스는 실행 중 운영체제의 프로세스 생성 시스템인 fork 시스템을 호출하여 몇 개의 자식 프로세스( children process)를 번식(spawn)할 수 있는데 이 때 자식 프로세스를 만드는 프로세스를 부모 프로세스 (parent process)라 한다.(4) 부모 프로세스는 자식 프로세스와 병행적으로 수행을 계속하고 부모 프로세스가 먼저 수행이 끝난 경우 부모 프로세스는 모든 자식 프로세스들이 종료될 때까지 기다린다. 자식 프로세스는 자신의 부모 프로세스 자원만을 공유한다. 자식 프로세스는 부모의 자원을 공유하지 않고 OS로부터 직접 자원을 얻는다. 이 경우 너무 많이 생성된 프로세스의 자원 요구로 인하여 시스템이 과부하(over load)걸릴 수 있다.프로세스의 파괴(kill)(1) 실행 중이던 프로세스가 프로그램의 마지막 문장의 실행을 마치면 각 프로세스는 부모 프로세스에게 실행결과를 되돌려 주고 종료된다.(2) 대부분 시스템의 경우 자식 프로세스는 부모 프로세스가 종료된 후 존재할 수 없으며 또 부모 프로세스는 자식 프로세스가 끝나지 않았더라도 다음의 경우 자식 프로세스의 실행을 종료시킬 수도 있다.a) 자식 프로세스가 할당된 자원의 사용을 초과한 경우-이 경우 부모 프로세스는 자식 프로세스의 상태를 수시로 검사한다.b) 자식 프로세스에게 할당된 작업이 더 이상 필요치 않은 경우c) OS에 의해 최상위 프로세스가 종료되면 그 프로세스의 모든 자식 프로세스는 파괴된다.프로세스의 연기(suspension)프로세스는 준비, 실행, 대기 등의 상태에서 사용자, 오퍼레이터나 OS에 의해 연기 될 수 있다.(1) 프로세스를 연기 시켰다가 재시작 (resume)시키는 경우1) 프로세스를 실행 중 다른 프로세스가 의심스러운 경우 사용자는 현재 프로세스를 삭제 (abort)시키지 않고 연기만 시켜 확인 후 재시작한다. 데이터 파일의 크기가 커서 작업시간이 오래 걸린다고 확인되었으면 중지되었던 프로세스를 “continue id(프로세스 번호)”명령에 의해 계속 실행시킨다. 만약 데이터 파일의 크기가 문제가 아님이 확인되고 작성한 프로그램 자체에 문제가 있다고 생각되면 다시 원시 프로그램 자체를 고쳐 컴파일 후 재실행해야 정지시켰던 프로세스를 “kill id(프로세스 번호)” 명령으로 파괴한 후 원시 프로그램을 수정하러 간다.2) 프로세스가 실행 중 할당시간이 완료되면 준비상태의 준비 대기큐로 돌아가야 하며 이때 준비 대기큐가 모두 차있는 경우 이 프로세스는 연기 ( suspend) 된 준비 상태가 되고 일정시간이 지난 후 재시작 되어 준비상태로 돌아간다. 대기 중이던 프로세스에서도 조건이 만족되어 준비상태로 돌아가야 하나 앞의 경우와 같은 상태가 발생되면 역시 앞의 과정과 같이 연기된 대기상태로 간다. 실행 중이던 프로세스가 입출력을 위해 대기상태의 큐에 들어가야 하나 이미 차있는 경우 연기된 대기상태로 되고 일정시간이 지난 후 재시작되어 대기상태의 대기큐로 들어가게 된다.3) 생성된 프로세스가 너무 많은 경우 운영체제에 의해 시스템 전체의 부하를 줄이기 위해 몇 개의 프로세스를 잠시 연기시킨 후 다시 정상상태가 되면 재시작 한다.4) 시스템의 기능이 이상이 생기면 실행중인 프로세스는 잠시 연기되고 기능이 회복되면 다시 재시작된다.(3) 연기는 일반적으로 짧은 시간동안 일어나며 장기간 연기가 일어나는 경우 그 프로세스에 할당된 자원은 회수된다. 또 짧은 시간동안 연기가 일어나더라도 자원의 성질에 따라 자원이 회수될 수도 있는데 이를테면 주기억장치는 연기 되는대로 시스템으로 회수되고 테이프 드라이브 장치와 같은 것은 계속 할당된 상태로 남아있게 된다.프로세스의 재시작(resume)연기되었던 프로세스는 일정시간이 지난 뒤 연기 사유가 없어지면 연기되었던 지점부터 재시작 된다. 재시작은 다음과 같이 시스템에 따라 프로세스 자신이 하거나 다른 프로세스에 의해 시작된다.4. 스케줄링(1) 개요컴퓨터 시스템이 효율적으로 사용되기 위해서는 두 개 이상의 프로세스가 준비상태에서 기다리고 있을 때, 운영체제는 어떤 프로세스를 먼저 실행할 것인지를 결정해야만 하는데, 이런 결정에 관계된 운영체제 일부분을 스케줄러라 부르고, 그것이 사용하는 알고리즘을 스케줄링 알고리즘이라고 한다.(2) 스케줄링의 단계상위단계 스케줄링은 작업 스케줄링(job scheduling)이라고도 불리며 어느 작업부터 시스템내의 자원을 실제로 사용할 수 있도록 할 것인가를 결정한다. 이 단계에서 시스템에 들어올 작업이 승인받기 때문에 승인 스케줄링(admission scheduling)이라고도 한다. 일단 승인되면, 작업들은 프로세스나 프로세스 그룹들을 형성한다. 중간단계 스케줄링에서는 CPU를 차지할 프로세스를 결정한다. 이 단계는 프로세스들을 일시적으로 중지(suspending)시키고 다시 활성화(activating)시켜서 시스템에 대한 단기적인 부하를 조절한다. 그렇게 함으로써 시스템의 적절한 운영과 최적의 성능을 유지할 수 있다. 중간단계 스케줄러는 작업들에 대한 CPU의 배당과 시스템의 승인 사이의 버퍼 역할을 한다. 하위단계 스케줄링은 사용 가능한 CPU를 어느 프로세스에게 배당할지를 결정한다. (즉, CPU를 프로세스에게 dispatch한다.) 하위단계 스케줄링은 초당 수회씩 작동되는 디스패치에 의해 실행된다. 따라서 이 디스패치는 언제나 주기억장치에 있어야만 한다.(3) 스케줄링의 목적스케줄링 방법은 매우 많으며 설계시 많은 목적들이 고려되어야 한다. 일반적으로 스케줄링 기법(scheduling discipline)은 다음과 같다.1)모든 프로세스들은 똑같이 다루어져야 하며, 무한정 연기되는 프로세스가 있어서는 안 된다.2) 스케줄링 방침은 단위시간당 가능한 최대수의 프로세스들에게 서비스를 제공해야 한다.3) 가급적 많은 수의 대화식 사용자에게 빠른 시간 내에 응답을 주어야 한다.4) 시스템에 로드된 양에 상관없이 주어진 일은 거의 같은 시간 내에 거의 같은 경비로 실행이 가능해야 한다.5) 스케줄링 기법은 시스템 자원들을 가능한 한 쉬지 않도록 유지해 주어 균형 있는 자원의 사용이 가능하도록 해야 한다.6) 오버헤드를 최소화하고 우선순위에 따라 프로세스를 실행해야 한다.5. 프로세스의 우선순위우선순위(priority)는 시스템에 의해 자동적으로 정해지거나 외부사항에 의해 정해진다. 우선순위는 사용료 제도나 그 밖의 다른 방법으로 만들어 낼 수 있다. 또 우선순위는 정적일 수도 있고, 동적일 수도 있으며, 합리적으로 정해지기도 하지만 프로세스간의 구별이 불필요한 경우에는 임의적이 될 수도 있다. 프로세스 실행 중 우선순위가 변하지 않는 것이 정적 우선순위(static priority) 이며 구현이 용이하고 상대적으로 오버헤드도 적다. 그러나 우선순위가 변동되어 이를 조정하려 할 때에는 부적절한 방법이다.
Ⅰ. 제 목라인트레이서의 설계 및 구동Ⅱ. 설 계 목 적교내 학술제의 라인트레이서 대회를 통하여 하드웨어 및 소프트웨어 설계 및 제작을 경험하고 계측 및 제어를 이해 및 숙달 할 수 있도록 한다.라인트레이서는 검은 바닥에 그려진 흰색 (또는 흰색 바닥에 그려진 검은 선)을 따라가는 로봇으로서 산업체에서 물건을 운반하는 무인 차에 많이 응용되는 기술이다. 이 로봇은 스스로 선을 감지하고, 자신의 동력으로 선이 그려진 주행판을 완주해야 한다. 이를 위해서는 눈에 해당하는 센서, 발에 해당하는 모터, 머리라고 할 수 있는 프로세서 부분의 연구가 필요하고, 또 로봇에 이들을 잘 운용하고 보다 효율적으로 빨리 움직일 수 있도록 프로그램을 개발해야 한다.본 프로젝트는 독립 전원을 가지고 한 쌍의 스텝 모터와 센서를 사용하여 움직이며 라인트레이서가 라인에서 벗어난 정도를 광센서를 통하여 감지하여 그 감지된 빛의 양에 따라 적절히 양쪽 스텝 모터의 속도 차를 두어 계속 라인트레이서의 중심선이 LINE의 중앙으로 향하며 주행하도록 하며, 나머지 두 개의 센서를 가지고 표시선을 감지하게 하여 정해진 위치( 오른쪽에 표시선이 온 자리)에서 정지하도록 하는 것을 목표로 한다.Ⅲ. 이론 및 원리1. 동작 원리라인트레이서는 바닥에 그려진 선을 감지해야 한다. 이때, 광센서를 이용하게 되는데, 광센서는 빛을 쏘았을 때, 색에 따라 빛을 반사하는 양이 다름을 이용하는 것으로, 흰색은 빛의 반사가 많고, 검정색은 빛을 흡수하여 반사량이 극히 적으므로, 이 차이점을 이용하여 라인트레이서는 바닥에 있는 선을 감지하게 된다. 그리고, 이 바닥에 감지된 정보를 구동에 유용한 정보로 가공하여 CPU에서 처리해서 모터가 회전하도록 한다. 구동에 유용한 정보로 가공한다는 것은 센서를 통해 받아들인 값은 빛의 양이므로 아날로그 값인데 이를 제어하기 위해서는 디지털 값으로 바꾸어 주어야 한다. 이때, 사용하는 것이 비교기나, ADC로, 비교기는 값을 0또는 1의 값으로 바꾸어주고, ADC는 아날로그 값을 대한 오차를 곧바로 비교하는 방법이다. 6개의 센서의 특성 차이와 6조의 센서의 발광부와 수광부의 간격이 일정하지 않음으로 생기는 오차는 피할 수 없으나, 프로그램으로 구현하기 쉽고, 초당 센서를 체크하는 수를 증가시켜 흰 선을 잘못 오인하는 오류를 줄였다.센서의 구동과 보정값 결정센서의 구동은 PWM출력을 이용하여 센서를 펄스 구동하게 된다.// 센서 구동을 위한 PWM출력 셋팅outp(0xc3, TCCR1A); //센서 구동을 위한 타이머1 10bit pwm, A 반전outp(0x01, TCCR1B); //클럭 프리스케일 CK// 1/4000000 * 1024 * 2 =512us 주기outp (47 , OCR1AL); //삽질에 의한 센서 듀티비 셋팅^^ 4.39%정도outp (50, OCR1BL); //버저용 PWM셋팅outp(0xff, DDRB); //pwm출력용 셋팅// 센서 값 입력을 받아들이고 보정값 결정하는 부분while(!stop){ //정지 신호 올때까지 무한 반복left1=inp(PINF)&0x40; //센서 배치 left1,2,3 , right 3,2,1left2=inp(PINF)&0x20; //포트를 읽을 경우는 포트 이름이 PIN*left3=inp(PINF)&0x10; //포트 전체를 읽어서 각 비트에 맞는 값과 AND연산right1=inp(PINF)&0x02;right2=inp(PINF)&0x04;right3=inp(PINF)&0x08;left_mark=inp(PINF)&0x80;right_mark=inp(PINF)&0x01;// outp(inp(PINF)>>2, PORTC); /*센서 값 잘 들어오는지 확인하는 부분*/}void call_trim(void){if( left1) {time_l = time - (255-time_l)/4;time_r = time + (255-time_r)/4;}else if( right1 ) {time_l = time + (255-time_l)/4;time_r = time - (255-time_r)/4;를 세어 100번 (2cm 진행) 중 15회 이상 탭을 감지하였을 때, 탭이 있다고 판단한다.이렇게 모터의 구동 중에 센서와 연관을 하는 이유는 탭이 있음을 확인하고 이에 맞게 동작하는 것이 쉬운 것이 아니기 때문이다. 예를 들어, 교차로에서는 양쪽 탭이 동시에 걸리게 되어, 탭을 인식하지만 정지하여서는 안 된다. 그리고, 오른쪽 탭만 있음을 인식하였을 때, 이것이 출발선인지 정지선인지를 알아야 하고 이에 맞게 정지하여야 하므로 매우 중요한 과정이다.스텝모터는 테이블을 미리 정의하여 상을 내보내는 사이의 시간을 조절하게 되는데 바로 VEC_table이 모터에 보내는 상과 상 사이의 지연되는 시간을 조절하는 테이블이다. 속도가 증가할수록 (table의 index 값이 증가할수록) 값이 작아진다. Handle_Buffer_Table은 조향에 쓰이는 테이블로 센서의 값을 비교했을 때 값이 차이가 심할수록 (table의 index 값이 증가할수록) 값이 커지는데, 실제로 상과 상 사이에 지연 시간은 Handle_Buffer_Table과 VEC_table의 곱으로 나타난다. 따라서, Handle_Buffer_Table은 VEC_table이 영향을 주는 정도를 유동적으로 변화시켜주는 장치가 된다.모터를 구동시키기 위한 SLA7024/7026 chip의 핀들의 역할.모터부의 회로도간단한 모터의 동작원리 및 개요1. Stepping motor의 개요stepping motor는 AC servo, DC servo motor에 비하여 값이 싸고 정확한 각도 제어에 유리하여 우리 주위에서 쉽게 접할수가 있다. 일반적으로 기계적인 이동량을 정밀하게 제어하는 일에 DC servo motor나 stepping motor가 많이 사용되고 있으며, 특히 stepping motor는 pulse에 의해 digital적으로 제어하는 것이 가능하므로 micom에서 사용하기에 적합한 motor이다. stepping motor가 DC motor나 AC motor와 크게다른 점은 모터의 shaft의 위 volatile unsigned short u16;#define FULL_STEP 7#define BOTH 3#define LEFT 1#define RIGHT 2#define STRAIGHT 3#define NOT_CNT 255 //교차로, 마크 감지후 마크 체크 않하는 거리 값#define MARK_CNT 5 //마크 체크 거리 값u08 PATH_DIR[200];u16 PATH_LEN[200];u08 l_mark_cnt=0, r_mark_cnt=0, cross_cnt=0, s_mark_cnt=0; /*마크의 확실한 체크를 위한변수*/u08 not_chk_cnt=0;u08 right_pass=0, left_pass=0, start_pass, goal_pass;u08 stop;u08 path_cnt; /*길 저장용 테이블 인덱스*/u16 stop_step; /* 정지선 통과후 일정 거리 직진 후 정지용 변수*/u16 step_val; /*구간 별 거리(스텝수) 저장용 */u08 drv_index=0; /*몇번째 주행인지 저장*/u08 sw; /*2차 주행에서 가속 상태 체크하는 변수*/u08 temp; //모터 상 출력용 임시 변수*/u08 time_l=0;u08 time_r=0;u08 time=0;u08 r_phase_cnt=0,l_phase_cnt=0;u16 speed_lmt =1250; //초기속도 설정u16 acc_tbl_cnt=0; //모터 가감속 테이블 인덱스 */u08 step_status=0; //양쪽 모터 작동확인(가감속시 사용)*/u16 step_val; //구간 별 거리(스텝수) 저장용 *///스텝모터 1-2상const u08 R_PHASE_TABLE[8]={ 0x08, 0x0A, 0x02, 0x06, 0x04, 0x05, 0x01, 0x09};const u08 L_PHASE_TABLE[8]={ 0x90, 0x10, 0x50, 0x40, 0x60, 0x20, 0xA0, 0x80};//센서마크u08 left1, left2, left3,left232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,다.