336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


Android SDK 설치중 문제발생

뭥미? 난 그저 클릭만 했을뿐인데...

Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml, reason: HTTPS SSL error. You might want to force download through HTTP in the settings.

해결은 아주 간단하다

Linux나 Windows 상관없이 Available Package 텝에서

Add Site를 누르고 밑에 주소를 입력해주면 끝~!

http://dl-ssl.google.com/android/repository/repository.xml

참 쉽죠~잉
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
소스가 간단해서 분석이 쉬울줄 알았는데 왠걸 젠장...
interrupt가 복병.. interrupt에서 중요한일은 다 하기때문에
I2C도 잘 모르는 상황에서 시간을 좀 잡아먹을듯 싶다
I2C를 잘 모른다면 먼저 S3C2240 Datasheet에서 I2C부분 읽어볼것을 추천

CamReset();

 

          rCIGCTRL |= (1<<31); //camera interface software reset

             Delay(10);

             rCIGCTRL &= ~(1<<31);

 

 

rCLKCON |= (1<<19);         //Control HCLK into Camera enable

 

CamPortSet();

 

void CamPortSet(void)

{

                          save_GPJCON = rGPJCON;

                          save_GPJDAT = rGPJDAT;

                          save_GPJUP = rGPJUP;

            

                          rGPJCON = 0x2aaaaaa;     // 0010 1010 1010 1010 1010 1010 1010

                                                             // GPJ CAM으로 set

                          rGPJDAT = 0;                   // Data register 0으로 초기화

                          rGPJUP = 0;                     // GPJ pull-up

}

 

 

ChangeUPllValue(60, 4, 1);              // UPLL clock = 96MHz, PLL input 16.9344MHz

 

void ChangeUPllValue(int mdiv,int pdiv,int sdiv)

{

    rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;  

}

 

 

rCLKDIVN|=(1<<3);            // UCLK 48MHz setting for UPLL 96MHz

// 0:48MHz, 1:24MHz, 2:16MHz, 3:12MHz...

                                        // Camera clock = UPLL/[(CAMCLK_DIV+1)X2]

Uart_Printf("1...\n");

             switch(USED_CAM_TYPE)             // USED_CAM_TYPE = 5

             {

             case CAM_AU70H :

                           if (AU70H_VIDEO_SIZE==1152)

                                        SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock for SXGA

                           if (AU70H_VIDEO_SIZE==640)

                                        SetCAMClockDivider(CAMCLK16000000); //Set Camera Clock for VGA

                           break;

             case CAM_S5X3A1 :

                           SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock for SXGA

                           break;

             default :              // 24MHz

                           SetCAMClockDivider(CAMCLK24000000); //Set Camera Clock 24MHz s5x532, ov7620

 

void SetCAMClockDivider(int divn) // CAMCLK24000000 = 5

{

             rCAMDIVN = (rCAMDIVN & ~(0xf))|(1<<4)|(divn); // CAMCLK is divided..

}

 

 

                           //Uart_Printf("rCAMDIVN : 0x%x\n", rCAMDIVN);        //0x11

                           break;

             }

 

Uart_Printf("2...\n");

// Initializing camera module

CamModuleReset(); // s5x532 must do this..

 

void CamModuleReset(void)

{

             switch(USED_CAM_TYPE)             //USED_CAM_TYPE = 5

             {

             case CAM_OV7620 : // reset - active high

             case CAM_S5X532 : // reset - active low, but H/W inverted.. so, in this case active high

             case CAM_S5X433 : // reset - active low, but H/W inverted.. so, in this case active high

             case CAM_S5X3A1 : // reset - active low, but H/W inverted.. so, in this case active high

                           rCIGCTRL |= (1<<30);          //external camera reset high

                           Delay(30);

                           rCIGCTRL &= ~(1<<30);     //external camera reset low

                           break;

             case CAM_AU70H : // reset - active low

#if REBIS

             case CAM_MICRON: // reset - active low CAM_MICRON = 5

#endif

             default :

                          //CIGCTRL [30] : External camera processor reset or power down

                           rCIGCTRL &= ~(1<<30);     //external camera reset low

                           Delay(10);

                           rCIGCTRL |= (1<<30);        //external camera reset high

                           break;

             }

}

 

 

Delay(500); // ready time of s5x433, s5x532 IIC interface. needed...

CameraModuleSetting();

 

int CameraModuleSetting(void)

{

             unsigned int i, j, save_E, save_PE, RegAddr, RegData;

             static U8 rdata[256];

             int donestatus;

         

             IicPortSet();

             //void IicPortSet(void)

             //{

             //           save_GPECON = rGPECON;

             //           rGPECON = rGPECON & ~(0xf<<28) | (0xa<<28);

             //                                                               //GPE15:IICSDA , GPE14:IICSCL     

             //}                                                              //IIICSDA : IIC-bus data

                                                                              //IICSCL : IIC-bus clock

             // for camera init, added by junon

             pISR_IIC = (unsigned)Cam_IICInt;                 //explain two rows

 

 

 

             rINTMSK &= ~(BIT_IIC);

 

             //Enable ACK, Prescaler IICCLK=PCLK/512,

             //Enable interrupt, Transmit clock value Tx clock=IICCLK/16

             rIICCON  = (1<<7) | (1<<6) | (1<<5) | (0x3);

 

             rIICADD  = 0x10;                    //24A0 slave address = [7:1]

             rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)

             rIICLC = (1<<2)|(3);                                     // SDAOUT has 5clock cycle delay

 

             donestatus=1;

 

#if REBIS

#else

             Camera_WriteBlock();

//           Camera_ReadBlock();

#endif

            

             return donestatus;

}

 

 

void __irq Cam_IICInt(void)

{

 

#if REBIS            //REBIS = 1

 

             U32        iicSt, i;

 

             ClearPending(BIT_IIC);

             //#define              ClearPending(bit) {\           //BIT_IIC = 0x1 << 27

             //                         rSRCPND = bit;\  //INT_IIC Requested(Source pending register)

             //                         rINTPND = bit;\    //INT_IIC Requested(Interrupt pending register)

             //                         rINTPND;\

             //           }           

 

             iicSt   = rIICSTAT;

             rINTMSK |= BIT_IIC;

 

             if(iicSt & 0x8){}           //When bus arbitration is failed.

             if(iicSt & 0x4){}           //When a slave address is matched with IICADD

             if(iicSt & 0x2){}           //When a slave address is 0000000b

             if(iicSt & 0x1){}           //When ACK isn't received

 

             switch( _CAMiicMode )

             {

                           case CAMRDDATA:          

                                        if( (_CAMiicDataCount--) == 0 )       // case by I2C_Read16 or Rd_CamIIC

                                        {

                                                     _CAMiicData[_CAMiicPt++] = rIICDS;

           

                                                     rIICSTAT = 0x90;  // Stop MasRx condition

                                                                                           // Rx/Tx Enable & Master receive mode

                                                     rIICCON               = 0xEF;  // Resuems IIC operation.

                                                                                           //prescaler? Tx clock = IICLK/(15 + 1)

                                                                                           // No interrupt pending

                                                                                           // IIC-Bus Tx/Rx interrupt enable

                                                                                           // IICCLK = fPCLK/512

                                                                                           // IIC-bus acknowledge enable

                                                     Delay(1);             // Wait until stop condtion is in effect., Too long time... 

                                                                              //# need the time 2440:Delay(1), 24A0: Delay(2)

                                                                                // The pending bit will not be set after issuing stop condition.

                                                     break;   

                                        }

                                        _CAMiicData[_CAMiicPt++] = rIICDS;     //The last data has to be read with no ack.

                                                                 //IICDS : Multi-master IIC-bus transmit/receive data shift register

                                        if( (_CAMiicDataCount) == 0 )

                                        {

                                                     rIICCON = 0x6F;   // Resumes IIC operation with NOACK

                                                                              //in case of S5X532 Camera.

                                                                              //prescaler? Tx clock = IICLK/(15 + 1)

                                                                              // No interrupt pending

                                                                              // IIC-Bus Tx/Rx interrupt enable

                                                                              // IICCLK = fPCLK/512

                                                                              // IIC-bus acknowledge disable

                                        }

                                        else

                                        {

                                                     rIICCON = 0xEF;  // Resumes IIC operaton with ACK.

                                        }

                                        break;

 

                           case CAMWRDATA:                       //case by I2C_Write16 or Wr_CamIIC

                                        if( (_CAMiicDataCount--) == 0 )

                                        {

                                                     rIICSTAT = 0xD0;  // stop MasTx condition

                                                     rIICCON               = 0xEF;  // resumes IIC operation.

                                                     Delay(1);             // wait until stop condtion is in effect.

                                                                              // # need the time 2440:Delay(1), 24A0: Delay(2)

                                                                               // The pending bit will not be set after issuing stop condition.

                                                     break;

                                        }

 

                                        rIICDS    = _CAMiicData[_CAMiicPt++];        //_iicData[0] has dummy.

                                        for(i=0;i<10;i++);                                         //for setup time until rising edge of IICSCL

                                        rIICCON  = 0xEF;                                         //resumes IIC operation.

                                        break;

 

                           case CAMSETRDADDR:                // case by I2C_Read16 or Rd_CamIIC

                          // Uart_Printf("[S%d]",_iicDataCount);

                                        if( (_CAMiicDataCount--) == 0 )

                                        {

                                                     rIICSTAT = 0xD0;  //stop MasTx condition

                                                     rIICCON               = 0xEF;  //resumes IIC operation.

                                                     Delay(1);                           //wait until stop condtion is in effect.

                                                     break;                  //IIC operation is stopped because of IICCON[4]   

                                        }

 

                                        rIICDS    = _CAMiicData[_CAMiicPt++];

                                        for(i=0;i<10;i++);          //for setup time until rising edge of IICSCL

                                        rIICCON  = 0xEF;          //resumes IIC operation.

                                        break;

                           default:

                                        break;     

             }

 

             rINTMSK &= ~BIT_IIC;

 

#else      // #if REBIS

 

             U32 iicSt,i;

 

             ClearPending(BIT_IIC);

             iicSt   = rIICSTAT;

             rINTMSK |= BIT_IIC;

 

             if(iicSt & 0x8){}           //When bus arbitration is failed.

             if(iicSt & 0x4){}           //When a slave address is matched with IICADD

             if(iicSt & 0x2){}           //When a slave address is 0000000b

             if(iicSt & 0x1){}           //When ACK isn't received

 

             switch(_CAMiicMode) {

                           case CAMRDDATA:

                                        if((_CAMiicDataCount--)==0) {

                                                     _CAMiicData[_CAMiicPt++] = rIICDS;

           

                                                     rIICSTAT = 0x90;      //Stop MasRx condition

                                                     rIICCON  &= ~(1<<4);      //Resumes IIC operation.

                                                     Delay(1);             //Wait until stop condtion is in effect., Too long time... 

                                                                              // # need the time 2440:Delay(1), 24A0: Delay(2)

                                                                                //The pending bit will not be set after issuing stop condition.

                                                     break;   

                                        }     

                                        _CAMiicData[_CAMiicPt++] = rIICDS;     //The last data has to be read with no ack.

 

                                        if((_CAMiicDataCount)==0)

                                                     rIICCON &= ~((1<<7)|(1<<4));          //Resumes IIC operation with NOACK

                                                                                                        // in case of S5X532 Cameara 

//                                                   rIICCON = 0x6f;                              //Resumes IIC operation with NOACK

                                                                                                        // in case of S5X532 Cameara        

                                        else

                                                     rIICCON &= ~(1<<4);         // Resumes IIC operation with ACK

                                                                                           // No interrupt pending

                                        break;

                           case CAMWRDATA:

                                        if((_CAMiicDataCount--)==0) {

                                                     rIICSTAT = 0xd0;                //stop MasTx condition

                                                     rIICCON  &= ~(1<<4);                //resumes IIC operation.

                                                     Delay(1);             // wait until stop condtion is in effect.

                                                                              // # need the time 2440:Delay(1), 24A0: Delay(2)

                                                                  //The pending bit will not be set after issuing stop condition.

                                                     break;   

                                        }

                                        rIICDS = _CAMiicData[_CAMiicPt++];        //_iicData[0] has dummy.

                                        for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL

                                                     rIICCON &= ~(1<<4);                     //resumes IIC operation.

                                        break;

                           case CAMSETRDADDR: //Uart_Printf("[S%d]",_iicDataCount);

                                        if((_CAMiicDataCount--)==0) {

                                                     rIICSTAT = 0xd0;                //stop MasTx condition

                                                     rIICCON  &= ~(1<<4);                //resumes IIC operation.

                                                     Delay(1);      //wait until stop condtion is in effect.

 

                                                     break;                  //IIC operation is stopped because of IICCON[4]   

                                        }

                                        rIICDS = _CAMiicData[_CAMiicPt++];

                                        for(i=0;i<10;i++);          //for setup time until rising edge of IICSCL

                                                     rIICCON &= ~(1<<4);             //resumes IIC operation.

                                        break;

                           default:

                                        break;     

             }

 

             rINTMSK &= ~BIT_IIC;

 

#endif    //           #if REBIS #else

 

}

 

 

void Camera_WriteByte(void)

{

 

#if REBIS

 

             U32 RegAddr;

             U16 RegData;

 

             Uart_Printf("Input Write Register Address of %s\n=>", CAM_NAME);

             RegAddr = (U32)Uart_GetIntNum();

   

             Uart_Printf("Input Write Transfer Data into %s\n=>", CAM_NAME);

             RegData = (U16)Uart_GetIntNum();

 

             I2C_Write16( CAM_ID, RegAddr, RegData );

 

#else

 

             unsigned int i, j, save_E, save_PE, RegAddr, RegData, pageNo;

         

#if (USED_CAM_TYPE==CAM_S5X532)||(USED_CAM_TYPE==CAM_S5X3A1)

             Uart_Printf("Input Write Page No of %s\n=>", CAM_NAME);

             pageNo = (U8)Uart_GetIntNum();

#endif

 

             Uart_Printf("Input Write Register Address of %s\n=>", CAM_NAME);

             RegAddr = (U8)Uart_GetIntNum();

   

             Uart_Printf("Input Write Transfer Data into %s\n=>", CAM_NAME);

             RegData = (U8)Uart_GetIntNum();

 

#if (USED_CAM_TYPE==CAM_S5X532)||(USED_CAM_TYPE==CAM_S5X3A1)

             Wr_CamIIC(CAM_ID, (U8)0xec, pageNo);  // set Page no

#endif

             Wr_CamIIC(CAM_ID, (U8)RegAddr, RegData); // set register after setting page number

 

#endif    //           #if REBIS #else

 

}

 

 

Camera_WriteBlock();

 

void SetCAMClockDivider(int divn) // CAMCLK24000000 == 5

{

             rCAMDIVN = (rCAMDIVN & ~(0xf))|(1<<4)|(divn); // CAMCLK is divided..

}

 

 

Uart_Printf("Initializing end...\n");

'Programming > 그밖에...' 카테고리의 다른 글

섹시한 라이브러리?? libsexy.so  (0) 2010.09.14
Android SDK 설치시 error  (0) 2009.11.20
Touch screen Calibration  (0) 2009.09.10
CIE L*a*b*  (0) 2009.06.01
단위환산표  (0) 2008.05.21
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

요즘 firmware 단에서 보드 가지고 놀다가 터치스크린을 이용해 뭐좀 해볼라는데
제길... 정확히 mapping하는게 아무래도 쉬운일이 아닌것 같아 구글링해본 결과...
역시 간단히 해결될만한건 아니었다.

공개되어있는 소스를 참고해 결국 해결!

http://www.ezcircuits.net/zbxe/10646
↑↑이곳에서 touch screen calibration에 관한 소스를 볼수 있다

'Programming > 그밖에...' 카테고리의 다른 글

Android SDK 설치시 error  (0) 2009.11.20
S3C2440 Camera test 분석(진행중...)  (0) 2009.10.15
CIE L*a*b*  (0) 2009.06.01
단위환산표  (0) 2008.05.21
PIC Basic으로 구현한 자동응답 디지털 도어락  (0) 2008.05.15
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
길이

단위

mm

cm

m

km

in

feet

yard

mile

mm

1

0.1

0.001

-

0.03937

-

-

-

cm

10

1

0.01

-

0.393701

0.032808

-

-

m

1000

100

1

0.001

39.3701

3.28084

1.09361

-

km

-

-

1000

1

-

3280.84

1093.61

0.621371

in

25.4

2.54

-

-

1

0.083333

0.027778

-

feet

304.8

30.48

0.3048

-

12

1

0.33333

-

yard

914.4

91.44

0.9144

0.000914

36

3

1

0.000568

mile

-

-

1609.344

1.609344

-

5280

1760

1



면적

단위

in²

ft²

yd²

acre

mile²

 1

 0.0001

-

0.155

0.001076

 0.00012

-

-

 10000

 1

 0.000001

 1550

 10.7639

 1.19599

0.000247

 -

 -

 1000000

 1

 -

 -

 -

  247.105

 0.386102

in²

 6.4516

 0.000645

 -

 1

 0.006944

 0.000772

-

 -

ft²

 929.03

 0.092903

 -

 144

 1

 0.111111

  0.000023

 -

yd²

 8361.27

 0.836127

 -

 1296

 9

 1

 0.000207

 -

acre

 -

 4046.86

 0.004047

 -

 43560

 4840

 1

 0.001562

mile²

 -

 -

 2.589987

 -

 -

 -

 640

 1



중량

단위

 ㎏

ton

lb

UK cwt

UK ton

US cwt

 US ton

 ㎏

 1

0.001

2.20462

 0.019684

 0.000984

 0.022046

0.001102

 ton

 1000

 1

 2204.62

 19.6841

 0.984207

 22.0462

 1.10231

lb

  0.453592

 0.000454

 1

 0.008929

 0.000446

 0.01

 0.0005

 UK cwt

 50.8023

 0.050802

 112

 1

 0.05

 1.12

 0.056

 UK ton

1016.05

 1.01605

 2240

 20

 1

 2204

 1.12

 US cwt

45.3592

 0.045359

 100

 0.892857

 0.044643

 1

 

 US ton

907.185

 0.907185

 2000

 17.8571

 0.892857

 20

 



부피
/용량

단위

ltrs(dm³)

in³

ft³

yd³

UK pint

UK gall

US pint

US gall

1

 -

0.001

0.061024

0.0000353

 -

0.00176

0.00022

0.002113

 0.000264

 -

 1

 1000

 61023.7

 35.3147

 1.30795

 1759.75

 219.969

 2113.38

 264.172

ltrs(dm³)

 1000

 0.001

 1

 61.0237

 0.035315

 0.001308

 1.75975

 0.219969

 2.11338

 0.264172

in³

 16.3871

 0.000016

 0.016387

 1

 0.000579

 0.0000214

 0.028837

 0.003605

 0.034632

 0.004172

ft³

 28316.8

 0.028317

 28.3168

 1728

 1

 0.037037

 49.8307

 6.22883

 59.8442

 7.48052

yd³

 764555

 0.764555

 764.555

 46656

 27

 1

 1345.429

 168.1784

 1615.793

 201.974

UK pint

 568.261

 0.0005683

 0.568261

 34.6774

 0.020068

 0.000743

 1

 0.125

 1.20095

 0.150119

UK gall

 4546.09

 0.0045461

 4.54609

 277.42

 0.160544

 0.005946

 8

 1

 9.6076

 1.20095

US pint

 473.176

 0.0004732

 0.473176

 28.875

 0.01671

 0.000619

 0.832674

 0.104084

 1

 0.125

US gall

 3785.41

 0.0037854

 3.785411

 231

 0.133681

 0.004951

 6.661392

 0.832674

 8

 1



부피/유속

단위

ltrs/sec

ltrs/h

 ㎥/sec

㎥h

cfm

ft³/h

UK gall/m

UK gall/h

US gall/m

US gal/h

 ltrs/sec

 1

3600

 0.001

3.6

2.118882

127.133

13.19814

791.8884

 15.85032

 951.019

 ltrs/h

 0.000278

 1

 -

 0.001

 0.00588

 0.035315

 0.003666

 0.219969

 0.004403

 0.264172

 ㎥/sec

 1000

 3600000

 1

 3600

 2118.88

 127133

 13198.1

 791889

 1585

 0.3951019

 ㎥h

 0.277778

 1000

 0.000278

 1

 0.588578

 35.3147

 3.66615

 219.969

 4.402863

 264.1718

 cfm

 0.471947

 1699.017

 0.000472

 1.699017

 1

 60

 6.228833

 373.73

 7.480517

 448.831

 ft³/h

 0.007866

 28.3168

 -

 0.028317

 0.016667

 1

 0.103814

 6.228833

 0.124675

 7.480517

 UK gall/m

 0.075768

 272.766

 0.0000758

 0.0272766

 0.160544

 9.63262

 1

 60

 1.20095

 72.057

 UK gall/h

 0.001263

 4.54609

 -

 0.004546

 0.002676

 0.160544

 0.016667

 1

 0.020016

 1.20095

 US gall/m

 0.06309

 227.125

 0.0000758

 0.227125

 0.133681

 8.02832

 0.832674

 49.96045

 1

 60

 US gal/h

 0.001052

 3.785411

 -

 0.003785

 0.002228

 0.133681

 0.013878

 0.832674

 0.016667

 1



압력

단위

atmos

mmHg

bar

pascal

inH₂O

inHg

psi

㎏/㎠

atmos

 1

 760

 1.0132

 101325

406.781

 29.9213

 14.6959

 1.033

 mmHg

 0.0013158

 1

 0.001333

 133.322

 0.53524

 0.03937

 0.019337

 0.00136

bar

 0.9869

 750.062

 1

 100000

 401.463

 29.53

 14.504

 1.01957

 pascal

 0.0000099

 0.007501

 0.00001

 1

 0.004015

 0.000295

 0.000145

 0.00001

inH₂O

 0.0024583

 1.86832

 0.002491

 249.089

 1

 0.073556

 0.036127

 0.00254

inHg

 0.033421

 25.4

 0.033864

 3386.391

 3.5951

 1

 0.491154

 0.003452

 psi

 0.068046

 51.7149

 0.068948

 6894.76

 27.6799

 2.03602

 1

 0.07029

㎏/㎠

 0.968

 7835.72

 0.9808

 98088

 393.786

 28.965

 14.226

 1

1 kgf/cm2 = 10,000 kgf/m²= 10 mH2O
1 MPa=10^6 N/m²= 101971.6 kgf/m2 = 10.19716 kgf/cm2


단위

Btu/h

w

㎉/h

kw

 Btu/h

 1

0.293017

0.251996

 0.000293

 w

 3.41214

 1

 0.859845

 0.001

 ㎉/h

 3.96832

 1.163

 1

 0.001163

 kw

 3462.14

 1000

 589.845

 1


에너지

단위

Btu

Therm

J

KJ

 Btu

 1

0.00001

1055.06

 1.055

251.996

 Therm

 100000

 1

 -

 105.5

 25199.60

 J

 0.00094

 -

 1

 0.001

 0.2388

 KJ

 0.9478

 9.478E-06

 1000

 1

 238.85

 ㎈

 0.0039683

 0.0039683x105

 4.1868

 -

 1



비열

단위

Btu/lb ℉

J/㎏℃

Btu/lb ℉

1

4186.8

J/㎏℃

0.00023

1

1㎉/㎏℃= 1 Btu/lb ℉



열용량

단위

Btu/lb

J/㎏

Btu/lb

1

2.326

J/㎏

0.4299

1



전열계수

단위

 Btu/ft²h℉

w/㎡℃

㎉/㎡h℃

 Btu/ft²h℉

1

5.67826

4.88243

 w/㎡℃

 0.17611

 1

 0.859845

 ㎉/㎡h℃

 0.204816

 1.163

 1



전열속도

단위

 Btu/ft²h

w/㎡

㎉/㎡h

  Btu/ft²h

1

3.154

2.712

 w/㎡

 0.3169

 1

 0.859

㎉/㎡h

 0.368

 1.163

 1



선속도

단위

ft/m

ft/sec

m/sec

ft/m

1

0.016666

0.00508

 ft/sec

m/sec 60

 1

 0.3048

 m/sec

 196.85

 3.28084

 1



점도

단위

pa·s

㎏f·s/㎡

 g/cm·s(p)

㎏m·h

lbf·s/ft²

 pa·s

 1

0.10197

10

 3.6x10³

2.089x10­²

 ㎏f·s/㎡

 9.80665

 1

 98.07

3.53x10⁴

0.20481

  g/cm·s(p)

 0.1

 1.020x10­²

 1

360

 2.089x10­³

 ㎏m·h

 2.778x10.­⁴

 2.833x10­5

 2.778x10­³

 1

5.80x10­6

 lbf·s/ft²

 47.88

 

 478.8

 1.724x105  

 1



동점도

단위

㎡ /sec

㎠/s(st)

㎡/h

 ft²/sec

ft²/h

㎡ /sec

1

1x10­⁴

 3.6x10³

10.764

 3.875x10⁴

 ㎠/s(st)

 1x10­⁴

 1

 0.36

 1.0764x10­³

 3.785

 ㎡/h

 2.778x10­⁴

 2.778

 1

 2.990x10­³

 10.764

  ft²/sec

 9.290x10­²

 929

 334.4

 1

 3.6x10³

 ft²/h

 2.581x10­5

 0.2581

 9.29x10­²

 2.778x10­⁴

 1

'Programming > 그밖에...' 카테고리의 다른 글

Touch screen Calibration  (0) 2009.09.10
CIE L*a*b*  (0) 2009.06.01
PIC Basic으로 구현한 자동응답 디지털 도어락  (0) 2008.05.15
어드레싱모드(addressing mode)  (0) 2008.04.01
MMU와 MPU의 차이점  (0) 2008.03.31
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

사용자 삽입 이미지
● 사용부품

     PB-2S

     PIC Basic 보드

     LCD

     4X4 키패드

     STEP 모터

     IR 리모콘

● 사용포트(0~26)

      0 ~ 7번포트(0블럭) : IR 리모콘

      8 ~ 15번포트(1블럭) : 키패드

     16 ~ 19번 포트 : STEP 모터

     20번 포트 : 스피커

     21 ~ 22번 포트 : LED

     - 총 23개 포트 사용

● 기능 설명

⋅ 자 동 문 잠 김

     - 문이 닫히면 센서에 의해 확인

     - 잠금장치 해제 후에도 30초가 지날때까지 문을 열지 않으면 자동으로 잠김

     - 문을 닫은 후 바로 열 상황에 대비하여 5초 정도 후에 잠김

             ⟹ 잠금 장치에 센서 사용으로 인한 신뢰도 향상

     - 잠겨있는 상태에서 외부 무단침입 방지를 기능

            ⟹ 비밀번호 입력 외 비정상적인 방법으로 문이 열렸을 경우 경보음

⋅ 비 밀 번 호

     - 비밀번호 수정

          ◦ 문바깥쪽 키패드를 사용하여 변경

◦ 비밀번호 수정 버튼을 누르면 현재 비밀번호 확인절차 이후 변경가능하며 실수 같은 예외사항을 줄이기 위해 바뀐 비밀번호를 한번 더 확인

     - 비밀번호 확인

         ◦ 문 바깥쪽 키패드를 이용하여 비밀번호 입력

         ◦ 숫자 키패드를 누르면 자동으로 비밀번호 입력모드로 변경

         ◦ 정확한 비밀번호가 입력되면 문 잠김이 해제

         ◦ 3회 이상 비밀번호 오류시 경보음

⋅ 음 성 녹 음(자동 응답기능, 미구현)

     - 부재중 이거나 개인적인 사정으로 손님 방문이 불가능 할 때를 위한 기능

     - ‘메뉴버튼 -> 음성녹음 버튼’으로 부재중 멘트 녹음

     - 부재중 모드 활성화시 초인종을 누르면 입력된 멘트 출력

⋅ 초 인 종

     - 초인종이 눌리면 집안에서 인식할 수 있는 소리가 울림
    
     - 자동응답 기능 활성화 시 집안에 소리가 울림기능이 작동하지 않고 스피커를 통해 녹음되어진 메시지를 전달

            ◦ 한번더 초인종을 누르면 매세지 녹음 가능


● 프로그램 소스

DIM I AS BYTE '입력 변수

DIM E AS BYTE '키패트 메뉴 관련

DIM OPW(4) AS BYTE ' 저장된 비밀번호

DIM TPW(4) AS BYTE ' 입력받은 비밀번호

DIM TTPW(4) AS BYTE ' 입력받은 비밀번호

DIM K AS BYTE '임의변수(비밀번호 관련)

DIM M AS BYTE '비밀번호 틀린 횟수

DIM N AS BYTE '확인버튼 관련

DIM L AS BYTE '비밀번호 관련

DIM Q AS BYTE '비밀번호 변경 관련

DIM MT AS BYTE '스텝모터 관련 변수

DIM R AS BYTE '리모콘 입력 관련 변수

DIM P AS BYTE '센서 관련 변수

DIM PT AS BYTE '리모콘 관련 변수(센서 1 잠금장치)

DIM PO AS BYTE '리모콘 관련 변수(센서 2 문)

DIM LM AS BYTE '잠금장치 관련 변수(LM=0 열림, LM=1 잠김)

DIM CNT AS BYTE '카운트

DIM CNTT AS BYTE '카운트

SET PICBUS HIGH

LCDINIT

K = 0

M = 1

P = 1

LM = 1

CNT = 0

CNTT = 0

PO = 0

OUT 21,1

PT = 0

OUT 22,1

'0으로 비밀번호 초기화

OPW(0) = 15

OPW(1) = 15

OPW(2) = 15

OPW(3) = 15

10R = BYTEIN(0) '리모콘

IF R = 17 THEN

PO = 0

OUT 21,1

ELSEIF R = 18 THEN

PO = 1

OUT 21,0

ELSEIF R = 20 THEN

PT = 0

OUT 22,1

ELSEIF R = 21 THEN

PT = 1

OUT 22,0

END IF

IF K = 0 THEN

CLS

LOCATE 2,1

PRINT "DIGITAL"

LOCATE 2,2

PRINT "DOOR LOCK"

END IF

IF P = 1 AND PT = 1 THEN

CLS

LOCATE 1, 1

PRINT "ARLET!!!"

BEEP 20

BEEP 20

BEEP 20

BEEP 20

BEEP 20

GOTO 100

ELSEIF P = 1 AND PO = 1 THEN

CLS

LOCATE 1, 1

PRINT "ARLET!!!"

100BEEP 20

BEEP 20

BEEP 20

BEEP 20

BEEP 20

GOTO 100

END IF

I = KEYDELAY(PADIN(1), 1, 30, 30)

IF I = 0 THEN GOTO 10

'메뉴버튼(E = 1)

IF I = 5 THEN

IF E = 0 THEN

40K = 1

CLS

LOCATE 0,0

PRINT "<*MENU*>"

LOCATE 0,1

PRINT "1.CHANGE THE P/W"

LOCATE 0,2

PRINT "2.RECORDING"

LOCATE 0,3

PRINT "3.Listen"

E = 1

ELSEIF E =1 THEN

E = 0

K = 0

GOTO 10

END IF

'열기버튼

ELSEIF I = 1 OR E = 5 THEN

OUT 17, 1

OUT 16, 0

OUT 18, 1

CLS

LOCATE 6,1

PRINT "OPEN"

PLAY 20, "C7D7E7"

FOR I = 0 TO 47

OUT 19, 1

DELAY 2

OUT 19, 0

DELAY 2

NEXT I

CLS

P = 0

K = 0

LM = 0

PO = 1

OUT 21,0

GOTO 70

'잠금버튼(센서 사용시 필히 수정!!)

ELSEIF I = 9 THEN

60IF LM = 0 THEN

P = 1

PO = 0

PT = 0

OUT 17, 1

OUT 16, 1

OUT 18, 1

CLS

LOCATE 6,1

PRINT "CLOSE"

PLAY 20, "E7D7C7"

FOR I = 0 TO 47

OUT 19, 1

DELAY 2

OUT 19, 0

DELAY 2

NEXT I

CLS

PT = 0

OUT 21,1

OUT 22,1

K = 0

LM = 1

ELSEIF LM = 1 THEN

P = 1

PO = 0

PT = 0

OUT 17, 1

OUT 16, 1

OUT 18, 1

CLS

LOCATE 6,1

PRINT "CLOSE"

PLAY 20, "E7D7C7"

CLS

PT = 0

OUT 21,1

OUT 22,1

K = 0

LM = 1

END IF

'자동응답 버튼(E = 2)(보이스 레코더 사용시 필히 수정)

ELSEIF I = 13 THEN

CLS

LOCATE 2,1

PRINT "Be away"

PLAY 20, "G7E7"

IF E = 0 THEN

DELAY 1000

PRINT " ON"

PLAY 20, "C7D7E7"

E = 2

ELSE

DELAY 1000

PRINT " OFF"

PLAY 20, "E7D7C7"

E = 0

END IF

CLS

K = 0

'확인 버튼(비밀번호 확인)

ELSEIF I = 14 THEN

CLS

IF K = 4 THEN

FOR N = 0 TO 3

IF OPW(N) = TPW(N) THEN

IF N =3 THEN

LOCATE 6,1

PRINT "OPEN"

PLAY 20, "C7D7E7"

CLS

OUT 17, 1

OUT 16, 0

OUT 18, 1

FOR I = 0 TO 47

OUT 19, 1

DELAY 2

OUT 19, 0

DELAY 2

NEXT I

LM = 0

PO = 1

OUT 21,0

GOTO 70

END IF

ELSE

IF M = 3 THEN

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

LOCATE 2,2

PRINT "Num."

PRINT DEC(M)

PLAY 20, "G4G4G4G4G4G4G4"

DELAY 2000

CLS

K = 0

M = 1

GOTO 10

ELSE

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

LOCATE 2,2

PRINT "Num."

PRINT DEC(M)

PLAY 20, "G4"

CLS

K = 0

M = M + 1

GOTO 10

END IF

END IF

NEXT N

END IF

K = 0

'CALL 버튼

ELSEIF I = 16 THEN

IF E = 2 THEN

CLS

LOCATE 2, 1

PRINT "Be away"

LOCATE 2, 2

PRINT "Message..."

DELAY 4000

ELSEIF E = 0 THEN

CLS

LOCATE 2, 1

PRINT "CALLING..."

PLAY 20, "G2E2"

END IF

CLS

K = 0

'숫자패드 옵션

ELSE

CLS

'메뉴 버튼 활성화 시

IF E = 1 THEN

IF I = 12 THEN

CLS

LOCATE 0,0

PRINT "CHANGE P/W"

L = 0

K = 0

N = 0

M = 1

Q = 1

GOTO 20

ELSEIF I = 11 THEN

CLS

LOCATE 0,0

PRINT "RECORDING..."

DELAY 2000

CLS

L = 0

E = 0

K = 0

GOTO 40

ELSEIF I = 10 THEN

CLS

LOCATE 0,0

PRINT "LISTENING..."

DELAY 2000

CLS

L = 0

E = 0

K = 0

GOTO 40

END IF

ELSEIF E = 0 OR E = 2 THEN

IF K <= 3 THEN

L = 0

LOCATE 1,1

PRINT "Enter the p/w"

TPW(K) = I

LOCATE 6,2

FOR L = 0 TO K

PRINT "*"

NEXT L

K = K + 1

ELSE

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

PLAY 20, "G4"

CLS

K = 0

GOTO 10

END IF

END IF

END IF

GOTO 10

'비밀번호 변경부분

20IF K <= 5 THEN

L = 0

LOCATE 1,1

PRINT "Enter the p/w"

I = KEYDELAY(PADIN(1), 1, 30, 30)

IF I = 0 THEN GOTO 20

TPW(K) = I

LOCATE 6,2

FOR L = 0 TO K

PRINT "*"

NEXT L

K = K + 1

ELSE

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

PLAY 20, "G4"

CLS

K = 0

GOTO 20

END IF

IF I = 14 THEN

CLS

FOR N = 0 TO 3

IF OPW(N) = TPW(N) THEN

IF N = 3 THEN

CLS

PLAY 7, "C7D7E7"

L = 0

K = 0

N = 0

M = 1

Q = 1

GOTO 30

END IF

ELSE

IF M = 3 THEN

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

LOCATE 2,2

PRINT "Num."

PRINT DEC(M)

PLAY 20, "G4G4G4G4G4G4G4"

DELAY 2000

CLS

K = 0

M = 1

GOTO 10

ELSE

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

LOCATE 2,2

PRINT "Num."

PRINT DEC(M)

PLAY 20, "G4"

CLS

K = 0

M = M + 1

GOTO 20

END IF

END IF

NEXT N

K = 0

END IF

GOTO 20

30IF K <= 4 THEN

L = 0

LOCATE 1,1

PRINT "Enter new p/w"

I = KEYDELAY(PADIN(1), 1, 30, 30)

IF I = 0 THEN GOTO 30

TTPW(K) = I

LOCATE 6,2

FOR L = 0 TO K

PRINT "*"

NEXT L

IF K = 3 THEN

CLS

PLAY 20, "C7D7E7"

L = 0

K = 0

N = 0

M = 1

Q = 1

GOTO 50

END IF

K = K + 1

ELSE

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

PLAY 20, "G4"

CLS

K = 0

GOTO 30

END IF

GOTO 30

50 IF K <= 4 THEN

LOCATE 1,1

PRINT "Enter again"

I = KEYDELAY(PADIN(1), 1, 30, 30)

IF I = 0 THEN GOTO 50

TPW(K) = I

LOCATE 6,2

FOR L = 0 TO K

PRINT "*"

NEXT L

IF K = 3 THEN

CLS

FOR N = 0 TO 3

IF TPW(N) = TTPW(N) THEN

IF N = 3 THEN

FOR N = 0 TO 3

OPW(N) = TPW(N)

NEXT N

CLS

LOCATE 2,1

PRINT "P/W changed"

PLAY 20, "C7D7E7"

L = 0

K = 0

N = 0

M = 1

Q = 1

GOTO 40

END IF

ELSE

IF M = 3 THEN

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

LOCATE 2,2

PRINT "Num."

PRINT DEC(M)

PLAY 20, "G4G4G4G4G4G4G4"

DELAY 2000

CLS

K = 0

M = 1

E = 0

GOTO 10

ELSE

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

PLAY 20, "G4"

CLS

K = 0

M = M + 1

GOTO 50

END IF

END IF

NEXT N

END IF

K = K + 1

ELSE

CLS

LOCATE 2,1

PRINT "INPUT ERROR"

PLAY 20, "G4"

CLS

GOTO 50

END IF

GOTO 50

70R = BYTEIN(0)

CNT = CNT + 1

LOCATE 6,1

PRINT "OPEN"

IF E= 0 AND CNT = 250 THEN

CNTT = CNTT + 1

IF CNTT = 5 THEN GOTO 60

ELSE

IF R = 21 THEN

CNT = 0

CNTT = 0

PT = 1

OUT 22, 0

E = 1

GOTO 70

ELSEIF R = 20 THEN

CNT = 0

CNTT = 0

PT = 0

OUT 22, 1

DELAY 5000

E = 0

GOTO 60

END IF

END IFl

GOTO 70

'Programming > 그밖에...' 카테고리의 다른 글

Touch screen Calibration  (0) 2009.09.10
CIE L*a*b*  (0) 2009.06.01
단위환산표  (0) 2008.05.21
어드레싱모드(addressing mode)  (0) 2008.04.01
MMU와 MPU의 차이점  (0) 2008.03.31
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

◉ 어드레싱 모드(addressing mode)

프로그램이 수행되는 동안 피연산자가 지정되는 방법은 명령어의 어드레싱 모드에 의해 좌우된다.

어드레싱 모드는 실제의 피연산자를 정하기 위해 명령어 속에 있는 주소 필드의 값을 수정하거나 다른 것으로 대체하는 것들을 규정한다.

포인터, 카운터 인덱싱, 프로그램 리로케이션 등의 편의를 사용자에게 제공함으로써 프로그래밍을 하는데

융통성을 주거나 명령어의 주소 필드의 비트를 줄이기 위해 어드레싱 모드 기법이 사용된다.

• 함축 어드레싱 모드(implied addressing mode mode)

• 즉치 어드레싱 모드(immediate addressing mode)

• 레지스터 어드레싱 모드(register addressing mode)

• 레지스터 간접 어드레싱 모드(register indirect addressing)

• 변위 어드레싱 모드(displacement addressing mode)

• 직접 어드레싱 모드(direct addressing mode)

• 간접 어드레싱 모드(indirect addressing mode)

• 상대 어드레싱 모드(relative addressing mode)

• 인덱스 어드레싱 모드(indexed register addressing mode)

• 베이스 레지스터 어드레싱 모드(base register addressing)


함축 어드레싱 모드(implied addressing mode)

명령어 실행에 필요한 오퍼랜드를 지정하지 않아도 묵시적으로 수행하는 방식.

메모리를 참조하지 않고

• 레지스터 단독으로 수행하는 방법.

• 장점 : 명령어 길이가 짧다.

예)

SHL : 누산기의 내용을 좌측으로 시프트하는 명령어

CPL : Acc의 내용을 1의 보수하여 다시 누산기에 로드하는 명령


즉치 어드레싱 모드(immediate addressing mode)

오퍼랜드에 연산에 필요한 숫자 데이터를 직접 넣어주는 방식.

명령어 자신이 데이터를 직접 포함하고 있어 명령어의 실행이 바로 이루어지는 방법.

• 데이터를 구하기 위해 메모리를 액세스할 필요가 없음.

• 상수를 정의하거나 변수값을 초기화하는데 편리하게 사용.

• 사용할 수 있는 수의 크기가 오퍼랜드 필드의 크기로 제한.

 

레지스터 어드레싱 모드(register addressing mode)

• 연산에 사용할 데이터가 레지스터에 저장되어 있으며 레지스터를 참조하는 지정 방식.

• 오퍼랜드 필드의 내용은 레지스터 번호이며 그 번호가 가리키는 내용이 명령어 실행 데이터로 사용.

장점 : 명령어에서 오퍼랜드 필드의 길이가 적어도 되고 데이터 인출을 위한 메모리 접근이 필요 없다.

• 유효주소는 레지스터의 번지가 된다.

 

레지스터 간접 어드레싱 모드(register indirect addressing mode)

오퍼랜드 필드가 레지스터의 번호(레지스터의 내용이 가리키는 메모리가 유효 주소)이다.

지정 레지스터의 내용은 실제 데이터를 인출함.

기억장치 영역은 레지스터의 길이에 달려 있다.

 

변위 어드레싱 모드(displacement addressing mode)

• 두개의 오퍼랜드를 가지며 직접 주소지정방식과 레지스터 간접 주소지정방식을 조합하여 수행.

• 첫 번째 오퍼랜드는 레지스터의 번호, 두 번째 오퍼랜드는 변위를 나타내는 주소.

• 유효 주소= 변위 + 레지스터의 내용

 

직접 어드레싱 모드(direct addressing mode)

오퍼랜드 필드의 내용이 실제 데이터가 들어 있는 메모리 주소를 지정하고 있는 유효주소가 되는 방식.

메모리에 저장되어 있는 데이터를 인출하기 위해 한번만 메모리에 접근하면 되므로 유효주소 결정을

위한 다른 절차나 계산이 필요없다.

• 장점 : 오퍼랜드가 메모리의 번지가 되기 때문에 간단함.

단점 : 오퍼랜드의 비트 수가 제한되어 있기 때문에 직접 접근할 수 있는 기억장치 주소 공간이 제한.

 

간접 어드레싱 모드(indirect addressing mode)

• 오퍼랜드 필드의 값이 해당하는 주기억장치 주소를 찾아 간 후 그 주소의 내용으로 다시 한 번 더

주기억장치의 주소를 지정하는 방식.

직접 주소지정방식에서 주소를 지정할 수 있는 기억장치 용량이 제한되는 단점을 해결하기 위한 방법.

• 장점 : 메모리의 번지지정을 더 크게 할 수 있다.

• 단점 : 명령어 실행 과정에서 두 번씩 메모리를 참조함으로써 시간이 많이 걸린다.

 

상대 어드레싱 모드(relative addressing mode)

• 유효주소 = (현재 명령어의 오퍼랜드 내용) + (프로그램 카운터의 내용)

• 장점 : 전체 메모리 주소가 명령어에 포함되어야 하는 일반적인 분기 명령어보다 적은 수의 비트만

있으면 된다.

 

인덱스 어드레싱 모드(indexed register addressing mode)

• 유효주소 = 인덱스 레지스터의 내용 + 변위

• 인덱스 레지스터는 인덱스 값을 저장하는 특수 레지스터.

• 변위는 기억장치에 저장된 데이터 배열의 시작 주소를 가리킨다.

• 인덱스 레지스터의 내용은 그 배열의 시작주소로부터 각 데이터까지의 거리를 나타낸다.

 

베이스 레지스터 어드레싱 모드(base register addressing mode)

• 유효주소 = 베이스 레지스터의 내용 + 변위

• 프로그램 전체를 재배치에 사용.

[출처] 어드레싱모드|작성자 빅초이

'Programming > 그밖에...' 카테고리의 다른 글

Touch screen Calibration  (0) 2009.09.10
CIE L*a*b*  (0) 2009.06.01
단위환산표  (0) 2008.05.21
PIC Basic으로 구현한 자동응답 디지털 도어락  (0) 2008.05.15
MMU와 MPU의 차이점  (0) 2008.03.31
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
[ MMU와 MPU의 차이점]
  - 출처: http://cafe.naver.com/elp.cafe
  - MMU 와 MPU | 소프트웨어 강좌 
  - 2004.04.29 12:20 
  - cslee03   http://cafe.naver.com/elp/134

**** MMU(Memory Management Unit)와 MPU(Memory Protection Unit)
- Memory를 관리한다는 점에서 비슷
- 하지만 MMU와 MPU는 다름
- 정확하게 얘기하자면 MMU는 MPU 기능외에 복잡한 기능을 가지고 있음
  일단 MMU및 MPU에 대한 H/W적인 정보를 원하신다면 www.arm.com에서 관련 정보를 얻으 실수 있읍니다.

**** ARM9에서
- ARM920계열은 MMU를 장착한 Core
- ARM940 계열은 MPU를 장착한 Core
  해당 계열의 Refrence Manual을 다운받아 보시면 MMU및 MPU구조에 대한 설명이 잘 나와 있읍니다.
  ARM946ES(940계열, MPU) http://www.arm.com/pdfs/DDI0155A_946ES.pdf
  ATM920T(920계열 MMU) http://www.arm.com/pdfs/DDI0151C_920T_TRM.pdf


해당 Manual을 보시면 설명이 자세히 나와 있으며,
MMU및 MPU을 이해하시기 위해서는 Cache에 대한 Concept 또한 이해하셔야 합니다.

**** MMU와 MPU에 대해 크게 두가지로 구분
1. MMU와 MPU의 구조, 기능적인 차이(H/W관점)
2. S/W개발에 있어서 MMU와 MPU는 어떤 차이점

우선
1. MPU는 CPU에 Attach된 RAM을 관리하는 장치

Memory를 여러개의 Partition으로 나누어서 Cache/Non-Cache Region등을 나눌수 있고
각 Region별로
- Read/Write Permission을 제어
- Write Bufferable Region등을 지정

간단히 말하면,
메모리를 user가 원하는 대로 나누어서
- Cache Region
- Non-Cache Region
- Write Bufferable Region
- non-Bufferable Region
- Read Only Region
- Read/Write Region
으로 Configure할 수 있으며, Cache관련하여 Invaliation, Clean, Flush등등의 기능을 제공

ARM core에서는 MPU Control
- cp15 register group
- mcr/mrc instruction
을 이용합니다.

__________________________________________________________
| MMU는                                                    |
| MPU가 갖는 기능은 물론 아주 특별히 중요한 기능을 가짐    |
| Virtual Address <-> Physical Address Mapping 기능입니다. |
| 즉 CPU Core에서 발생시키는                               |
|    Virtual Address를 Physical Address로 Mapping하여      |
|    Physical Address로 실제 Memory를 Access하게 됩니다.   |
----------------------------------------------------------

MPU에서는 Virtual Address의 개념이 없읍니다.
즉 Physical Address와 Virtual Address는 항상 1:1 mapping되며,
따라서
User(program)은 항상 DRAM의 physical address를 가지고 memory를 접근하게 됩니다.

반면에
MMU의 경우 Virtual Address <-> Physical Address Mapping기능을 제공합니다.

이러한 기능을 제공하면 어떤 장점이 있냐구요?
여러가지 장점이 있읍니다. 이중 가장 중요한 두가지 점만을 적어 봅니다.

(1) 먼저 memory운영에 있어서 실제 Physical한 Address영역을 Virtual Address로 접근하여 사용함으로써 Memory의 사용 효율을 높일수 있읍니다. 예를 들어 System Booting후에 각종 Program에서 Memory를 이것 저것 사용하다보니 쪼가리 RAM이 여기저기 생겼다라고 가정해 보십시오. 이들 Memory의 Physical Address는 연속적인 Address영역에 존재하지 않읍니다. 예를 들어

0x10000 ~ 0x10200, 0x10600~0x10800, 0x10a00~0x10c00의 사용되지 않은 영역이 있다고 합시다.

보통 프로그램 수행시에, 프로그램은 독립적인 Stack및 Heap영역을 사용하게 되고, 이 영역은 연속적인 Memory Address영역에 존재하여야 합니다. 원칙적 어떤 프로그램이 0x600의 메모리는 원한다하더라도 위의 세영역을 사용할 수 없읍니다. 이유는 연속적인 영역이 아니기 때문이죠. 우리가 코드를 Compile하고 Linking하여 Image를 만들때, 혹은 그 코드내에서 memory를 Allocation받을때 언제나 연속적인 Memory영역을 가정합니다.

근데 MMU가 있는 경우는 상황이 달라집니다.
- MMU는 Virtual Address <-> Physical Address의 Mapping기능을 제공
- 따라서 0x10000 ~ 0x10200, 0x10600~0x10800, 0x10a00~0x10c00의 Physical Address를 0xa0000~0xa0600으로 mapping시킬수 있읍니다.
(참고로 이것은 예일뿐 보통 mapping의 단위는 이와 같이 작지 않고 256K, 512K, 1M...와 같이 근값입니다, 단지 설명을 위한 예라는 점을 기억하세요)

따라서 실제 CPU는 0xa0000~0xa0600의 연속적인 address영역을 사용하고 이를 MMU가 physical address로 mapping하여 0x10000 ~ 0x10200, 0x10600~0x10800, 0x10a00~0x10c00의 영역을 access하게 됩니다.
어떠세요? 이렇게 사용하면 Memory Utilization이 높아지겠죠? 훌륭합니다.
좀 있어보이는 용어로 압축하여 표현하자면 Memory Fragmentation문제를 해결합니다.
있어보이나여? :)


(2) MPU는 Physical Address <-> Virtual Address가 1:1 mapping이라고 했읍니다.
그럼 예를 들어 메모리가 8M이면 8M이상의 크기를 갖는 Application은 어케 동작 할 수 있을까여?
MPU즉 physical, virtual address가 1:1, 즉 같은 값을 갖는 경우라면 불가능 합니다.
하지만 MMU가 있는 경우 상황이 달라집니다.
MMU는 Memory뿐만 아니라 HDD, Flash등등의 영역을 Memory Address로 mapping시킨다음 이를 Memory와 같이 사용할 수 있도록 합니다.
CPU가 어떤 Address를 Access할떄 MMU는 해당 Address가 DRAM상의 address인지, 아니면 HDD와 같은 Device에 memory와 같이 할당된 Address인지 분별하고, memory address인 경우 해당 virtual address에 해당하는 physical address를 이용memory를 access하고, 만약 memory address아니라면 해당 device(예를 들어 HDD)에서 정보를 가져오게 됩니다.
이때 해당 영역을 memory로 Loading하게 됩니다. 이러한 mapping을 위해 MMU는 내부에 mapping table을 가지고 있읍니다.
어떻게 생각하세요? 보통 PC를 생각할때는 이와 같은 기능은 없어서는 안돠겠죠? 또 한번 훌륭합니다.



========================================================================================

두번째로 S/W를 개발하는 입장에서 MMU와 MPU는 어떤 차이점을 유발하는가?



이문제는 그야 말로 Case By Case라고 봅니다.

어떤 분은 MMU없는 것은 사용하기도 싫다 라고 말씀하시던데...제 의견은 그렇지 않습니다. 자신이 개발하려는 목적에 따라 MPU가 좋을 수도 있고, MMU가 좋을 수도 있읍니다.



일단 Linux를 Embedded용으로 많이 사용하시는데, Linux에 있는 많은 Application들을 그대로 사용하시고 싶다면 MMU가 있어야 겟죠. 즉 절라 크기가 큰 Application들을 전부 올리구, PC version으로 release되는 application들을 별 고민 없이 사용하고자 하신다면 MMU있어야 합니다. 주로 application개발 하시는 분들이 원하시는 바죠. 예를 들어 PDA개발하시는 분은 MMU있는 버전 사용하셔야 합니다. 왜냐? Graphic, Window, Application,Game등등 Memory크게 필요한 Application많습니다. HDD나 Flash달아서 memory상에서만 program이 돌지 않고 스위칭하게 됩니다. 따라서 MMU가 없는 경우 memory 크게 달아야 하고, program도 알맞게 수정되어야 합니다. memory와 HDD의 가격은 단순히 비교해서 하드가 80G에 10만원이면 Memory는 256M 10만원....

으...엄청 차이납니다. 글서 Program을 RAM에만 올려서 사용하신다면 돈좀 들여야 할 것 같습니다.



반면에 VDSL Router, IP 공유기 같은 네튼워크 제품 개발하시는 분들....MMU필요없읍니다. Protocol Stack이나 Network Application등은 크기 작습니다. 애써 memory외에 다른 장치에 Program올려놓을 필요없읍니다. 괜히 올렸다가 성능 떡이 되어(memory Access속도는 엄청 빠르죠? HDD에 비교하면 말이여...) 욕 얻어 먹고 팔지도 못합니다. Memory Fragmentation? 요새 Memory엄청 쌉니다. 그거좀 아껴보겟다고 MMU사용합니까? 미친짓입니다...



이외에 H/W적인 특징 외에 개발 과정에 있어서의 문제점두 있읍니다. 예를 들어 linux에서 shared library를 사용하고 싶은데, MMU 장착 CPU용으로 release된 linux에서는 이를 지원하는데 MPU 장착 CPU용으로는 release된 linux에서는 없다면????? 이는 H/W적인 문제에 기인하는 것이 아닙니다. 단지 해당 CPU용으로 Code가 안만들어 졌기 때문이죠... 여기서 한가지 집고 넘어갈 것은 Linux에서 가장 먼저 개발되는 것은 PC용입니다. PC요? 아시다시피 현존하는 가장 빠른 대중화된 CPU인 Pentium씁니다. MMU당근 있죠....글서 처음 개발 되는 각종 코드는 해당 base하에 작성 됩니다. 글서 MPU를 갖는 CPU를 기반으로 어떤 제품을 만들때 특정 Application을 올리려면 기다려야 한다거나 고생을 하는 경우가 많습니다. 물론 개발자 자신이 MMU가 있는 버전용으로 작성된 각종 코드를 맘대루 수정하고 핸들링 하여 사용할 수 있다면 문제 없겠지만....소규모 개발 집단에서 하기에는 버겁습니다.



결국 자신이 개발하려는 제품이 먼지...해당 제품에서 필요한 S/W기능(Stack, Application)이 먼지, 그러한 S/W가 MPU Based Linux에 Porting되어 있는지 알아보셔야 합니다. 이렇게 설명하면 복잡한가여? 남들이 개발 해놓은 스펙을 많이 참고하세요. 즉 Bech-Marking한 제품이 어떤 CPU를 사용하고 어떤 Linux를 사용했는데 어떤 Application이 올라가있더라.... 그렇게 파악할 수 있읍니다. 일단 그렇게 타겟을 잡고 좀더 구체적으로 자신이 사용하고자 하는 Linux에서 사용할 수 있는(큰 수정 없이) S/W를 체크해 봅니다.

예를 들어 IPSec을 개발하고자 합니다. MMU없는거 사용하고 싶습니다. 글서 글로트렉스 Cello 사용하고자 합니다. Cello에는 uClinux사용한다고 합니다. uClinux찾아보니 IPSec(freeSWAN)을 지원합니다. 그럼 사용할 수 있는 거지요... (글로트렉스 광고해서 죄송합니다. :) )



마지막으로 MPU구 어쩌구 저쩌구 MMU > MPU라면 머하러 MPU사용합니까? 라고 질문하시는 분들을 위해 한마디 더...

(1) 첫째 가격...

MMU있는거 가격 비쌉니다. 이유는 ARM의 경우만 하더라고 MMU가 있는 Core(ARM920 Series)는 MPU가 있는 Core(ARM940 Series)보다 Silicon 크기가 2-3배 정도 됩니다. 즉 생산 단가가 비싸진다는 거죠...당근 판매단가 비쌉니다. 머어 허기사 이는 실제 생산 단가일뿐 때로는 시장에서 미친척하는 손해보구 파는 회사두 있읍니다.

(2) 둘째 편리성

MPU의 경우 Virtual<--> Physical Address가 1:1mapping되므로 암생각없이 어디서나 Memory Directly Access가능합니다. 별로 중요하지 않다고생각하실수 있으나 , 실제 성능을 높인다거나 할떄 복잡한 구조적 코딩 대신 성능 위주의 코딩시에 매우 유용합니다.



마지막으로 드리고 싶은 말은 MPU/MMU에 대해 공부하실때 Cache Management에 대해서도 같이 공부하셔야 이해도 쉽고, 얻는 것도 많습니다

'Programming > 그밖에...' 카테고리의 다른 글

Touch screen Calibration  (0) 2009.09.10
CIE L*a*b*  (0) 2009.06.01
단위환산표  (0) 2008.05.21
PIC Basic으로 구현한 자동응답 디지털 도어락  (0) 2008.05.15
어드레싱모드(addressing mode)  (0) 2008.04.01

+ Recent posts