책을 읽다보니 후에 GPIO_Init설명이 나왔다... 책을 순서대로 학습한다면 지금부터 쓰는거였다.


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

{

  uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;

  uint32_t tmpreg = 0x00, pinmask = 0x00;

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));

  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  

  

/*---------------------------- GPIO Mode Configuration -----------------------*/

  currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);

  if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)

  { 

    /* Check the parameters */

    assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));

    /* Output mode */

    currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;

  }


1줄 : input mode, output mode 판별. 0x0F를 이용하여 하위 4비트의 값만 추출

2줄 : mode가 0x00이 아니면 output모드



typedef enum

{ GPIO_Mode_AIN = 0x0,

  GPIO_Mode_IN_FLOATING = 0x04,

  GPIO_Mode_IPD = 0x28,

  GPIO_Mode_IPU = 0x48,

  GPIO_Mode_Out_OD = 0x14,

  GPIO_Mode_Out_PP = 0x10,

  GPIO_Mode_AF_OD = 0x1C,

  GPIO_Mode_AF_PP = 0x18

}GPIOMode_TypeDef;

/*---------------------------- GPIO CRL Configuration ------------------------*/

  /* Configure the eight low port pins */

  if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)    //CRL인지 확인

  {

    tmpreg = GPIOx->CRL;

    for (pinpos = 0x00; pinpos < 0x08; pinpos++)                                    //어느위치 설정값인지 확인(앞의 학습에서 했음)

    {

      pos = ((uint32_t)0x01) << pinpos;

      /* Get the port pins position */

      currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;                            //맞는 핀 위치 확인

      if (currentpin == pos)

      {

        pos = pinpos << 2;                             //CRL은 4비트 단위로 값 담당. pinpos*4로 위치값 구함(2만큼 왼쪽으로 shift)

        /* Clear the corresponding low control register bits */

        pinmask = ((uint32_t)0x0F) << pos;

        tmpreg &= ~pinmask;                    //원하는 부분만 0으로 만든값을 tmpreg에 and함. 원하는 부분만 0으로 변함

        /* Write the mode configuration in the corresponding bits */

        tmpreg |= (currentmode << pos);        //현재 설정값을 원하는 위치에 shift시켜 or시켜 적용

        /* Reset the corresponding ODR bit */

//CRL,CRH가 아닌 BRR.BSRR레지스터 설정

//input mode에서 pull-down, pull-up으로 설정할 경우, 그 GPIO에 값이 설정되어야한 정상적으로 설정 가능.

//즉, 해당 작업을 밖에서 설정하는것이 아니라, GPIO초기화 과정에서 한번에 처리

//Pull-down : Reset(0), Pull-up : Set(1)

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

        {

          GPIOx->BRR = (((uint32_t)0x01) << pinpos);

        }

        else

        {

          /* Set the corresponding ODR bit */

          if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

          {

            GPIOx->BSRR = (((uint32_t)0x01) << pinpos);

          }

        }

      }

    }

    GPIOx->CRL = tmpreg;

  }

/*---------------------------- GPIO CRH Configuration ------------------------*/

  /* Configure the eight high port pins */

  if (GPIO_InitStruct->GPIO_Pin > 0x00FF)

  {

    tmpreg = GPIOx->CRH;

    for (pinpos = 0x00; pinpos < 0x08; pinpos++)

    {

      pos = (((uint32_t)0x01) << (pinpos + 0x08));

      /* Get the port pins position */

      currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);

      if (currentpin == pos)

      {

        pos = pinpos << 2;

        /* Clear the corresponding high control register bits */

        pinmask = ((uint32_t)0x0F) << pos;

        tmpreg &= ~pinmask;

        /* Write the mode configuration in the corresponding bits */

        tmpreg |= (currentmode << pos);

        /* Reset the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)

        {

          GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));

        }

        /* Set the corresponding ODR bit */

        if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)

        {

          GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));

        }

      }

    }

    GPIOx->CRH = tmpreg;

  }

}



'중도연재종료 > CORTEX M3' 카테고리의 다른 글

UART_ Hello_Wolrd 찍기_2  (0) 2013.06.08
UART_ Hello World 찍기_1  (0) 2013.06.08
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
Posted by 십자성군

P213


참고. STM32_Reference_manual. p140의 table 17, 18


직접 만드는것도 연습이 되나, 되도록 있는 함수를 이용하도록한다. 새로 만든 함수와 기존 함수를 병행하면 헷갈리기 쉽기때문에 본래 있는 함수에 익숙하도록 하자.


P216의 GPIO_Port_Init의 대체함수로 GPIO_Configuration을 이용하자.

아래와 같다.


void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


   GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0+GPIO_Pin_1+GPIO_Pin_4);

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //output

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

}


위의 함수들은 본래 주어진다.


BitAction함수도 본래 주어진다.


GPIO_ReadInputDataBit도 주어진다.




GPIO_TypeDef->IDR

:_IO uint32_t IDR

:0~15번 비트까지 0번 핀에서 15번 핀까지의 입력 데이터의 값을 가지고 있다.

GPIO_Pin은 사용하는 핀에 대하여 1이 들어가 있고<핀정보> IDR에 이를 AND함으로써 데이터값이 1이 들어와 있는 핀에 대해서는 1을 반납한다. 물론 IDR에는 복수핀에 대한 데이터 정보로 되어있고 GPIO_Pin은 단일도 복수도 가능하다. 단일일 경우 해당핀만 조건을 만족하면 되고, 복수이면 여러핀이 조건을 만족해야 한다. Bit_RESET, SET은 각각 0,1이다. 32비트로 처리한다. 반납값 bitstatus는 8비트로 0,1표현


ex)

IDR : 0b1011110111110001

PIN : 0b1001001100101100

&    : 0b1001000100100000

rese: 0b0000000000000000


테스트 파일. LED3개를 이용하여 깜빡임. 스위치 하나.

 Key_Test.zip


'중도연재종료 > CORTEX M3' 카테고리의 다른 글

UART_ Hello World 찍기_1  (0) 2013.06.08
GPIO_Init  (0) 2013.05.25
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Posted by 십자성군

내용핵심

예를들어 GPIOB_BRR이 0x40010C14라고 하자.

여기서 GPIOB : 0x40010C00이며

BRR은 여기에 + 0x14를 더한것이다.

GPIOA : 0x40010800이며 GPIOA_BRR은 0x40010814이다.


이러한것을 #define을 이용하여 일일이 주소를 치던것을 간단하게 GPIOA_BRR, GPIOB_BRR 등으로 쳐서 표현하자는것


이 책에서 나오는 define은 대부분 STMicroelectronics의 Standard Peripheral Driver Library에 적용되어 있다.


여기에 연습하면서 적은 코드를 적어둔다

/////////////////////////////////////////////////////////////////////////////////////

platform_config.h

#define GPIOA_CRL (*(volatile unsigned *)0x40010800)

#define GPIOA_CRH (*(volatile unsigned *)0x40010804)


typedef enum{

  GPIO_Mode_User_Out_PP=0x00,

  GPIO_Mode_Use_Out_OD=0x01,

  GPIO_Mode_Use_AF_PP=0x10,

  GPIO_Mode_Use_AF_OD=0x11

}GPIOMode_Output_TypeDef;


void GPIO_A_Output_Init(uint16_t pinNum, GPIOSpeed_TypeDef speedValE, GPIOMode_Output_TypeDef modeE){

  //modeE : CNF

  //speedValE : MODE

  //pinNum : 비트방식의 pinNum표시. 0x1(0b1), 0x2(0b10)... 16비트:16핀

  //0xFFFF : 0b1111.1111.1111.1111.

  //GPIOSpeed_TypeDef : stm32f10x_gpio.h에 정의

  uint32_t tmpVal = modeE<<2 | speedValE; //CNF와 MODE 붙임

  uint32_t pinpos = 0x00;


  //pin #0~#7(GPIO_CRL)

  if((pinNum & 0xFF)!=0){

    //하위 8비트에 어떤 값이 존재

    for(pinpos=0x00; pinpos<0x08; pinpos++){

      if(pinNum==((uint32_t)0x01) << pinpos){

        //pinpos : 원하는 설정을 저장할 위치(4비트 단위로 건너뜀)

        pinpos = pinpos*4;

        GPIOA_CRL &= ~(0xF << pinpos);  //대상비트를 0으로 Set. 나머지는 그대로 살림(and)

        GPIOA_CRL |= tmpVal << pinpos;  //대상비트에 설정사항(tmpval)적용

        break;

      }

    }

  }

  

  //pin #8~#15

  else{

    //8비트 오른쪽 shift시켜 CRH의 port bit configuration에 적용

    pinNum = pinNum>>8;

    for(pinpos = 0x00; pinpos < 0x08; pinpos++){

      if(pinNum == ((uint32_t)0x01) << pinpos){

        pinpos = pinpos*4;

        GPIOA_CRH &= ~(0xF << pinpos);

        GPIOA_CRH |= tmpVal << pinpos;

        break;

      }

    }

  }

}


책에 있는데 안적은 내용은, 위에서 언급한 Standard peripheral Driver Library에 있기때문


/////////////////////////////////////////////////////////////////////////////////////////////

Test_LED_Function_Used.c


#include <stm32f10x.h>

#include <platform_config.h>


static void delay_int_count(volatile unsigned int nTime)

{

 for(; nTime > 0; nTime--); 

}


void delay_1_second(void)

{

  delay_int_count(806596); 

}


//앞의 platforconfig.h와 비교

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //output

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init(GPIOA, &GPIO_InitStructure);

}


void GPIOA_0_On(void){

  GPIOA->BRR |= GPIO_Pin_0; 

}

void GPIOA_1_On(void){

  GPIOA->BRR |= GPIO_Pin_1; 

}

void GPIOA_4_On(void){

  GPIOA->BRR |= GPIO_Pin_4; 

}


void GPIOA_0_Off(void){

  GPIOA->BSRR |= GPIO_Pin_0; 

}

void GPIOA_1_Off(void){

  GPIOA->BSRR |= GPIO_Pin_1; 

}

void GPIOA_4_Off(void){

  GPIOA->BSRR |= GPIO_Pin_4; 

}


void GPIOA_On_All(void){

  GPIOA_0_On(); 

  GPIOA_1_On(); 

  GPIOA_4_On(); 

}


void GPIOA_Off_All(void){

  GPIOA_0_Off(); 

  GPIOA_1_Off();

  GPIOA_4_Off();

}


void GPIOA_OnOffAll_Mult(uint32_t count){

  for(;count>0;count--)

  {

    GPIOA_0_Off();

    GPIOA_1_On();

    GPIOA_4_On();

    delay_1_second();

    

    GPIOA_0_On();

    GPIOA_1_Off();

    GPIOA_4_On();

    delay_1_second();

    

    GPIOA_0_On();

    GPIOA_1_On();

    GPIOA_4_Off();

    delay_1_second(); 

  }

}


void GPIOA_Test(void){

#if 0

  GPIOA_On_All();

  delay_1_second();

  GPIOA_Off_All();

  delay_1_second();

#else

  GPIOA_OnOffAll_Mult(10);

#endif

}

int main(void){

  RCC->APB2ENR |= RCC_APB2Periph_GPIOA;

  

  //GPIO_Speed_10MHz : output mode의 Open-drain

  GPIO_A_Output_Init(GPIO_Pin_0,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  GPIO_A_Output_Init(GPIO_Pin_1,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  GPIO_A_Output_Init(GPIO_Pin_4,GPIO_Speed_10MHz,GPIO_Mode_User_Out_PP);

  

  while(1){

   GPIOA_Test(); 

  }

}


GPIOA를 이용해서 LED테스트를 해보았다. 직접 읽고 내용을 이해할 수 있었으면 한다.


'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군

P171


소스


static void delay_int_count(volatile unsigned int nTime)

{

for(; nTime>0; nTime--);

}


int main(void)

{

(*(volatile unsigned *)0x40021018 |= 0x8;

(*(volatile unsigned *)0x40010C04 |=0x10;


(*(volatile unsigned *)0x40010C14 |= 0x200;

delay_int_count(10000);

(*(volatile unsigned *)0x40010C10 |= 0x200;


while(1)

{

;

}

}


[GPIO Set Reset 레지스터]

GPIO핀의 값을 Reset하고 Set하는 작업으로 동작을 On, Off시켰다.


1.Port bit Reset register [GPIOx_BRR]

Address offset:0x14

Reset value: 0x0000 0000


GPIO register map을 참고한다.

0x40010C14 |= 0x200;

0x200=0b001000000000이 된다. 즉, BR9가 ON되어 핀9가 Reset된다.(Register reset)


2.Port bit set/reset register [GPIOx_BSRR]

Address offset: 0x10

Reset value : 0x0000 0000


0x40010C10 |= 0x200으로 인해 BS9가 ON되어 핀9가 Set된다.(Register set)


delay_int_count(10000);

시간지연. 설명 pass

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군

p136, 159




MamoryMap

MamoryMap




RCC register map






GPIO register map



소스코드


int main(void){

(*(volatile unsigned*)0x40021018) |= 0x8;

(*(volatile unsigned*)0x40010C04) |= 0x10;


while(1)

{;}

}


schematic



volatile를 사용하는 이유:

컴파일과정에서 컴파일러가 쓸모없다고 판단하여 삭제해버리는 내용이 있다. 이를 삭제하지말고 컴파일 하게 할 때 사용한다.


소스해석


1.

(*(volatile unsigned*)0x40021018) |= 0x8;

0x40021018 : 위 메모리맵의 AHB 영역에서 RCC에 해당한다. RCC레지스터맵에서 0x18은 RCC_APB2ENR을 나타낸다.

0x8은 16진수표현이다. 이를 2진수로 표현하면 0b1000이다. RCC_APB2ENR에서 IOPBEN에 1이 들어간것과 같은의미.


APB2 peripheral clock enable register (RCC_APB2ENR)

address: 0x18    (해당주소. base 0x40021000 + 0x18 = 0x40021018)


역할

GPIO B를 사용하기 위해서, 이것에 Clock을 공급할 수 있도록 enable 시키는것.

APB2ENR의 IOPBEN을 ON시키기 위해서.


2.

(*(volatile unsigned*)0x40010C04) |= 0x10;

0x40010C04=0x40010C00+0x04

이는 GPIOB_CRH이다.


Port configuration register low(GPIOx_CRL)

Address offset : 0x00


Port configuration register high(GPIOx_CRH)

Address offset : 0x04


Table50을 보자. 32비트 레지스터 내용은 각 Pin별로 4비트씩 설정을 할 수 있도록 되어있다.

CRH에서 0x10을 or 시키면, 0b00010000이 된다. 핀 9번, 8번에 대하여 적용되어, pin8번은 0000, 핀9번은 0001이 적용되어 CNF:00, MODE:01이 된다.


책을보면, MODE 01로 Output mode, max speed 10MHz가 적용, CNFy 00으로 General purpose output push-pull이적용된다.


pull-up, pull-down.과

Open-Drain의 PMOS와 NMOS의 공부가 필요

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
Cortex M3 시작. 자료  (0) 2013.05.22
Posted by 십자성군


ARM.zip

첨부내용:

13475.pdf : STM32F103xx 함수설명서

STM32_Module_Sch_V1_2 : 모듈 회로도

STM32_Module_v1_2 : 모듈 설명서

STM32_Reference_manual : 영문메뉴얼

stm32시작하기_2 : 학습자료. 별로 참고하지 않음


사용장비

(주. 인셈)STM32F103 Module Board(STM32_M)

사용교재

ARM Cortex-M3 시스템 프로그래밍 완전정복 I


교재내용을 읽으면서 학습. 보충설명과 같이 기재하겠음

'중도연재종료 > CORTEX M3' 카테고리의 다른 글

GPIO_Init  (0) 2013.05.25
Key가 눌린것 알아채기  (0) 2013.05.24
고급스러운 코딩1.  (0) 2013.05.24
LED 끄기[GPIO Set Reset 레지스터]  (0) 2013.05.24
LED회로도를 통한 기본적인 이해  (0) 2013.05.22
Posted by 십자성군

운영체제가 관리하는 최소 단위의 작업

프로세스(Process)는 일반적으로 프로세서(처리기, CPU)에 의해 처리되는 사용자 프로그램, 시스템 프로그램, 즉 실행중인 프로그램을 의미하며, 운영체제가 관리하는 최소 단위의 작업(Job), 태스크(Task)이다.

쉽게 말해서 운영체제가 관리하는 가장 작은 단위의 작업

 프로세스는 다양하게 정의 될 수 있으며 아래와 같다.

- PCB를 가진 프로그램
- 실기억장치에 저장된 프로그램
- 프로세서가 할당되는 실체 
- 프로시저[각주:1]가 활동중인 것 
- 비동기적 행위[각주:2]를 일으키는 주체
- 목적 또는 결과에 따라 발생되는 사건들의 과정


위의 정의에서 PCB는 무엇일까??

PCB(Process Control Block, 프로세스 제어 블록)는 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓는 곳으로, Task Control Block 또는 Job Control Block이라고도 한다.  쉽게 말해서 프로세스 관련 자료가 있는 장소이다.

각 프로세스가 생성될 때마다 고유의 PCB가 생성되고, 프로세스가 완료되면 PCB는 제거된다.
PCB에 있는 정보는 다음과 같다.

 저장 정보설 명 
 프로세스의 현재 상태준비, 대기, 실행 등의 프로세스 상태
포인터
- 부모 프로세스에 대한 포인터 :  부모 프로세스의 주소 기억
- 자식 프로세스에 대한 포인터 : 자식 프로세스의 주소 기억
- 프로세스가 위치한 메모리에 대한 포인터 : 현재 프로세스가 위치한 주소 기억
- 할당된 자원에 대한 포인터 : 프로세스에 할당된 각 자원에 대한 주소 기억   
프로세스 고유 식별자  프로세스를 구분할 수 있는 고유의 번호 
스케줄링 및 프로세스의 우선순위  스케줄링 정보 및 프로세스가 실행될 우선순위     
CPU 레지스터 정보Accumulator, Index Register, 범용 레지스터, PC등에 대한 정보 
 주기억장치 관리 정보

Base Register[각주:3] , Page Table에 대한 정보

 입,출력 상태 정보입,출력장치, 개방된 파일 목록 
 계정 정보CPU 사용 시간, 실제 사용 시간, 한정된 시간 



이젠 프로세스 상태 전이에 대해서 살펴보자.

 프로세스 상태 전이는 프로세스가 시스템 내에 존재하는 동안 프로세스의 상태가 변하는 것을 의미하며, 프로세스의 상태를 다음과 같이 상태 전이도로 표시할 수 있다.  



프로세스 상태

프로세스의 상태는 제출, 접수, 준비, 실행, 대기(보류) 상태로 나눌 수 있으며, 이 중 주요 세 가지 상태는 준비, 실행, 대기 상태이다.
1)제출(Submit): 작업을 처리하기 위해 사용자가 작업을 시스템에 제출한 상태
2)접수(Hold): 제출된 작업이 스풀 공간인 디스크의 할당 위치에 저장된 상태
3)준비(Ready): 프로세스가 프로세서를 할당받기 위해 기다리고 있는 상태
 
       ※ 프로세스는 준비상태 큐[각주:4]에서 실행을 준비하고 있다.
           접수 상태에서 준비 상태로의 전이는 Job 스케줄러에 의해 수행된다.
           준비 리스트에 있는 프로세스는 각각 우선순위가 주어진다.

4)실행(Run): 준비상태 큐에 있는 프로세스가 프로세서를 할당받아 실행되는 상태
      
      ※ 프로세스 수행이 완료되기 전에 프로세스에게 주어진 프로세서 할당 시간[각주:5]이 종료되면 프로세스는 준비 상태로 전이된다. 
          실행중인 프로세스에 입출력 처리가 필요하면 실행중인 프로세스는 대기중인 상태로 전이된다.
          준비 상태에서 실행 상태로의 전이는  CPU스케줄러에 의해 수행된다.

5)대기(Wait), 보류, 블록(Block): 프로세스에 입,출력 처리가 필요하면 현재 실행 중인 프로세스가 중단되고, 입,출력 처리가 완료될 때까지 대기하고 있는 상태

     ※ 대기 리스트에 있는 프로세스는 우선순위가 주어지지 않는다.

6)완료(Complete): 프로세서를 할당받아 주어진 시간 안에 수행을 완료한 상태 


  


이렇게 프로세스의 상태가 제출 단계에서부터 완료 단계까지 진행되어 가는 과정을 알아보았다.

-------------------------------------------------------------------------------------------------------------
참고로 실행 중지(Suspend)에 관하여 잠시 설명해보면 다음과 같다.
- 하나의 프로세스가 입,출력 이외의 다른 이유에 의해 실행되지 못하는 상태
- 실행 중지된 프로세스는 다른 프로세스도 다시 시작하기 전까지는 실행될 수 없다.
- 프로세스의 실행 중지 요인:
 1) 시스템에 이상이 있거나 부하가 많을 경우 운영체제의 필요에 의해 중지시킨다.
 2) 프로세스의 이상 유무를 확인하기 위해 해당 프로세스를 완전히 종료시키지 않고 중지시킨다. 

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

 다음으로 프로세스 상태 전이 관련 용어에 대하여 설명해 보겠다.

※  Dispatch: 준비 상태에서 대기하고 있는 프로세스 중 하나가 프로세서를 할당받아 실행 상태로 전이되는 과정을 말한다.
     Wake Up: 입,출력 작업이 완료되어 프로세스가 대기 상태에서 준비 상태로 전이되는 과정
     Traffic Controller(교통량 제어기): 프로세스의 상태에 대한 조사와 통보 담당 


지금까지 프로세스에 대해서 설명해 보았고 이제는 스레드(Thread)에 대해서 설명해본다

스레드(Thread)는 프로세스 내에서의 작업 단위로서 시스템의 여러 자원을 할당받아 실행하는 프로그램의 단위이다.
  



어떤 자료들을 보기 전에 하나의 운영체제엔 여러가지 프로그램이 존재할것이다. 프로그램은 단일 프로세스로 존재할 수도 있고 여러개의 프로세스로 존재 할 수도 있다. 그리고 그 프로세스 내에는 여러개의 스레드가 존재할 수도 있다.

운영체제 - 프로세스 - 스레드 이렇게 상위 개념과 하위 개념으로 이해할 수 있는데, 위로 올라갈 수록 보안 장벽이 높다. 그래서 특정 기술들을 사용해야 서로간의 접근이 허용된다.  

다시 스레드로 넘어가보면 스레드를 아래와 같이 설명할 수 있다.

1) 하나의 프로세스에 하나의 스레드가 존재하는 경우에는 단일 스레드, 하나 이상의 스레드가 존재하는 경우에는 다중 스레드라고 해.  
2) 프로세스의 일부 특성을 갖고 있기 때문에 경량(Light Weight) 프로세스라고도 한다.
3) 자신만의 스택(Stack)과 레지스터(Register)를 갖으며 독립된 제어 흐름을 갖는다.
4) 스레드의 분류

 사용자 수준의 스레드
사용자가 만든 라이브러리를 사용하여 스레드를 운용한다.
속도는 빠르지만 구현이 어렵다. 
 커널 수준의 스레드
운영체제의 커널에 의해 스레드를 운용한다.
구현이 쉽지만 속도가 느리다. 

5) 스레드 사용의 장점
 
 - 하나의 프로세스를 여러 개의 스레드로 생성하여 병행성을 증진시킬 수 있다.
 - 하드웨어, 운영체제의 성능과 응용 프로그램의 처리율을 향상시킬 수 있다.
 - 응용 프로그램의 응답 시간(Response Time)을 단축시킬 수 있다.
 - 실행 환경을 공유시켜 기억장소의 낭비가 줄어든다.
 - 프로세스들 간의 통신이 향상된다. 

  1. 프로시저:한 프로그램은 여러 개의 작은 프로그램으로때 분활된 작은 프로그램을 의미하며, 부프로그램이라고도 한다. [본문으로]
  2. 다수의 프로세스가 서로 규칙적이거나 연속적이지 ㅇ낳고 독립적으로 실행되는 것. [본문으로]
  3. 기준레지스터 : 주기억장치가 분할된 영역으로 나뉘어 관리될 때, 프로그램이 한 영역에서 다른 영역으로 옮겨지더라도 명령의 주소 부분을 바꾸지 않고 정상적으로 수행될 수 있도록 하기 위한 레지스터 [본문으로]
  4. 스케줄링 큐 : 여러 프로세스가 프로세서를 할당받기 위해 기다리는 장소 [본문으로]
  5. Timer Run Out [본문으로]

'중도연재종료 > 임베디드' 카테고리의 다른 글

[용어] 운영체제(추가)  (0) 2012.07.01
[용어] 운영체제  (0) 2012.07.01
[용어] Firmware, RTOS, Non-RTOS  (0) 2012.07.01
[용어] 실시간 시스템  (0) 2012.07.01
MPU와 MCU  (0) 2012.07.01
Posted by 십자성군

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

운영체제는 작업 수행방식에 따라 일괄 처리 시스템, 다중 프로그래밍 시스템, 다중 처리 시스템, 다중 시분할 시스템, 실시간 처리 시스템, 분산 처리 시스템 등으로 나눌 수 있다.

1. 일괄 처리 시스템(Batch Processing System)

.일괄적으로 처리하는 시스템
.초기의 컴퓨터 시스템에서 사용된 형태

-일정량 또는 일정 기간 동안 데이터를 모아서 한꺼번에 처리하는 방식

.이러한 일괄 처리를 위해서는 적절한 작업 제어 언어를 제공할 필요가 있다.
.컴퓨터 시스템을 효율적으로 사용할 수 있다.
.한꺼번에 많은 양을 처리한다->반환시간(Turn Around TIme)이 늦다.

.하나의 작업이 모든 자원을 독점한다.->CPU 유휴 시간이 줄어든다. (CPU가 동작하지 않고 쉬는 시간)
-급여계산, 지불 계산, 연말 결산 등의 업무등에 사용.

2. 다중 프로그래밍 시스템(Multi-Programming System)

-하나의 CPU와 주기억장치를 이용하여 여러 개의 프로그램을 동시에 처리하는 방식
.CPU + 주기억장치 를 이용
.하나의 주기억장치에 두 개 이상의 프로그램을 기억시켜 놓고, 하나의 CPU와 대화하면서 동시에 처리하는 방식
->CPU의 사용률과 처리량이 증가

3. 시분할 시스템(Time Sharing System)

.여러 명의 사용자가 사용하는 (하나의)시스템에서---

.컴퓨터가 사용자들의 프로그램을 번갈아가며 처리한다->각 사용자에게 독립된 컴퓨터를 사용하는 느낌을 준다 


.라운드 로빈(Round Robin)방식이라고도 한다

.여러 사용자가 각자의 단말장치를 통하여 동시에 운영체제와 대화하면서 각자의 프로그램을 실행
.하나의 CPU는 같은 시점에서 여러 개의 작업을 동시에 수행할 수 없기 때문에

->CPU의 전체 사용 시간을 작은 작업 시간량(Time Slice)으로 나누어

->그 시간량 동안만 번갈아가면서 CPU를 할당하여 각 작업을 처리하는 원리
만약 이러한 시스템에 다중 프로그래밍 방식이 결합된다면 모든 작업이 동시에 진행되는 것처럼 대화식 처리가 가능하겠지??
.시스템의 전체 효율은 좋아지겠으나 개인별 사용자 입장에서는 반응 속도 느려질 수 있다.(응답 시간이 길어진다)

4. 다중 처리 시스템(Multi-Processing System) 

여러개의 CPU와 하나의 주기억장치를 이용하여 여러 프로그램을 동시에 처리하는 방식
.하나의 CPU가 고장나더라도 다른 CPU를 이용하여 업무처리가 가능

->그래서 시스템의 신뢰성과 안전성이 높아.
.여러 CPU는 하나의 메모리를 공유하며 단일 운영체제에 의해 관리
->프로그램의 처리 속도가 빠르다기억장치, 입출력장치 등의 자원 공유에 대한 문제점을 고려해야함


5. 실시간 처리 시스템(Real Time Processing System)

데이터 발생 즉시, 또는 데이터 처리 요구가 있는 즉시 처리하여 결과를 산출하는 방식
.처리 시간이 단축되고, 처리 비용이 절감
.우주선 운행이나, 레이저 추적기, 핵물리학 실험 및 데이터 수집, 전화교환장치의 제어, 은행의 온라인 업무 등 시간에 제한을 두고 수행되어야 하는 작업에 사용된다.


6. 다중 모드 처리(Multi-Mode Processing)

일괄 처리 시스템, 시분할 시스템, 다중 처리 시스템, 실시간 처리 시스템을 한 시스템에서 모두 제공하는 방식

7. 분산 처리 시스템(Distributed Processing System)

여러 개의 컴퓨터(프로세서)를 통신 회선으로 연결하여 하나의 작업을 처리하는 방식
->단말장치나 각 컴퓨터 시스템은 고유의 운영체제와 CPU, 메모리를 가지고 있다. 시분할 시스템과 대비


'중도연재종료 > 임베디드' 카테고리의 다른 글

프로세스의 개요+스레드  (0) 2012.07.01
[용어] 운영체제  (0) 2012.07.01
[용어] Firmware, RTOS, Non-RTOS  (0) 2012.07.01
[용어] 실시간 시스템  (0) 2012.07.01
MPU와 MCU  (0) 2012.07.01
Posted by 십자성군

출처 : http://wingsofgod.tistory.com 
대부분의 내용을 그대로 가져와서 말만 조금 바꾸었음을 미리 알립니다.


운영체제(OS, Operating System)

컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임  윈도우, 리눅스, 매킨토시 등등


컴퓨터 사용자와 컴퓨터 하드웨어 간의 인터페이스로서 동작하는 시스템 소프트웨어의 일종

다른 응용 프로그램이 유용한 작업을 할 수 있도록 환경을 제공해준다.


운영체제의 대표적인 네가지 목적

  처리 능력(Throughput)

 일정 시간 내에 시스템이 처리하는 일의 양 

 반환 시간(Tum Around Time)

 시스템에 작업을 의뢰한 시간부터 처리가 완료될 때까지 걸린 시간 

 사용가능도(Availability)

 시스템의 자원을 사용할 필요가 있을 때 즉시 사용 가능한 정도 

 신뢰도(Reliability)

 시스템이 주어진 문제를 정확하게 해결하는 정도 

이는 운영체제 성능 평가기준이 된다 


위의 목적을 달성하기 위해 운영체제가 가져야할 기능.장치


1. 프로세서[각주:1], 기억장치[각주:2], 입출력장치, 파일 및 정보 등의 자원을 관리하는 기능을 가진다.
2. 자원을 효율적으로 관리하기 위해 자원의 스케줄링[각주:3] 기능을 제공한다. 
3. 사용자와 시스템 간의 편리한 인터페이스를 제공한다.
4. 시스템의 각종 하드웨어와 네트워크를 관리, 제어한다.
5. 데이터를 관리하고, 데이터 및 자원의 공유 기능을 제공한다.
6. 시스템의 오류를 검사하고 복구한다.
7. 자원 보호 기능을 제공한다.
8. 입,출력에 대한 보조 기능을 제공한다.
9. 가상 계산기[각주:4] 기능을 제공한다. 


운영체제가 관리하는 자원 및 관리기능

 자원

기능

 프로세스 관리

 프로세스 스케줄링 및 동기화 관리 담당

프로세스 생성과 제거, 시작과 정지, 메시지 전달 등의 기능

 기억장치 관리

 프로세스에게 메모리 할당 및 회수 관리 담당

 주변장치 관리

 입,출력장치 스케줄링 및 전반적인 관리 담당 

 파일 관리

 파일의 생성과 삭제, 변경, 유지 등의 관리 담당 


운영체제의 종류에는 Window 시리즈, UNIX, LINUX, MS-DOS, 매킨토시 등이 있다.


단일 작업 시스템에는 DOS, 다중 작업 처리 시스템에는 윈도우 시리즈, UNIX, LINUX 등이 사용된다.

WINDOW XP나 WINDOW 7 같은 경우는 개인용, WINDOW NT, UNIX, LINUX는 서버용 운영체제이다.

(개인용 운영체제와 서버용 운영체제의 차이점: 기본적인 기능은 비슷하지만, 주로 하는 일이 틀립니다. 

서버용 운영체제

.다중사용자가 접속했을 때, task를 분산해서 처리하는데 기능을 많이 부여

개인용 운영체제

.1명이 잘 사용하는데 중점을 둡니다. 


.서버용 운영체제는 여러사람이 골고르게 일을 할 수 있는데 주력하고, 개인용 운영체제는 한사람이 강력하게 일을 할 수 있도록 최적화되어있다.


※ 단일 작업 시스템(Single Tasking System)
  - 컴퓨터 시스템을 한 개의 작업이 독점하여 사용하는 방식으로, 예를 들어 DOS에서 워드 작업을 하다가 PC통신을 하려면 워드 작업을 종료해야 하는 것을 의미한다.

 다중 작업 처리 시스템(Multi-Tasking System)
  - 여러 개의 프로그램을 열어 두고 다양한 작업을 동시에 진행하는 방식으로, 예를 들어 Windows에서 워드 작업을 하고 있는 상태에서 음악을 들으며 엑셀, 그림판 등의 프로그램을 실행시켜 놓고, 필요할 때마다 해당 프로그램으로 바로 바로 전환하여 사용할 수 있는 것을 의미한다. 


  1. 처리기, Processor [본문으로]
  2. 주기억장치, 보조기억장치 [본문으로]
  3. 어떤 자원을 누가, 언제, 어떤 방식으로 사용할지를 경정해 주는것을 말한다. [본문으로]
  4. Virtual Computer, 한대의 컴퓨터를 여러 개의 컴퓨터 처럼 보이게 하는 가상 컴퓨터 운영체제에 의해 만들어지며 사용자의 관점에서는 가상 컴퓨터가 실제 컴퓨터처럼 보일 수도 있고 아주 다르게 보일 수도 있다. [본문으로]

'중도연재종료 > 임베디드' 카테고리의 다른 글

프로세스의 개요+스레드  (0) 2012.07.01
[용어] 운영체제(추가)  (0) 2012.07.01
[용어] Firmware, RTOS, Non-RTOS  (0) 2012.07.01
[용어] 실시간 시스템  (0) 2012.07.01
MPU와 MCU  (0) 2012.07.01
Posted by 십자성군

Fireware

.OS미사용

.태스크 수가 많지 않으며, 동시에 접근하거나 우선순위 보장이 필요 없는 경우 사용

.즉, 과거의 임베디스 시스템같이 단순한 기능의 경우


RTOS

태스크들이 원하는 시간 안에 원하는 결과를 얻도록 보장해주는 운영체제

.태스크 수는 그리 많지 않으나 태스크 간 우선순위 보장이 반드시 필요한 경우

.임베디드 시스템의 근간


Non-RTOS

여러개의 태스크들이 동시에 같은 자원에 접근하려 할 때 중간에서 중재하는 OS

.같은 자원에 여러개의 태스크가 동시에 접근해야 할 경우


자원 : 네트워크 카드나 메모리 등과 같은 소프트웨어 구동에 필요한 시스템 자원

태스크 : 독립적으로 실행 가능한 SW 단위로서 프로세스, 스레드가 이에 속함

'중도연재종료 > 임베디드' 카테고리의 다른 글

[용어] 운영체제(추가)  (0) 2012.07.01
[용어] 운영체제  (0) 2012.07.01
[용어] 실시간 시스템  (0) 2012.07.01
MPU와 MCU  (0) 2012.07.01
MPU와 MCU  (0) 2012.07.01
Posted by 십자성군