C언어에서...

어떤 기능이 잘 동작하고 있는지 감시하기 위해서 저는 종종 

static 변수를 사용합니다.


그 예를 한번  설명 드립니다.

다음과 같은 코드가 있습니다.  0.2초마다, 온도를 보고, 높은 온도가 되면 냉각 Fan을 돌립니다.

만약... 디버깅을 위해 print를 넣는다면 0.2초마다 프린트문이 나오는데, 

이 너무 빨리 자주  발생되는 디버깅은 ... 시스템을 느리게할 수 있고, 

프린트들이 추가로 더 들어갈 경우... 내용을 보기 매우 어려워집니다.


void main( void )

{

    int temperature =  0;

    while( 1 )

    {

        temperature = GetTemperature();

        if( temperature > 60)  // 온도가 60도를 넘으면, 냉각 Fan을 100 속도로 돌린다.

            SetFanSpeed( 100 ); 

        else  // 60도 이하에선 Fan을 Off ( 0 속도) 로 한다.

            SetFanSpeed( 0 );

        

      delay( 0.2); // 0.2 초 기다리고 다시 동작...

      printf(" Temp:%d \n", temperature);

    }

}


그래서 저는 아래와 같이 static 변수를 사용해서 디버깅을 합니다.

그러면... 보고자 하는 프린트문이... 아주 많이 찍히지 않고,

간간히 찍힙니다. 아래 빨간 내용 참고하세요.

특히나 CPU리소스가 작은 Embedded system에서는 아래와 같이

프린트문이 너무 많이.. 빨리.. 찍히지 않도록 하는 것이 중요합니다.


void main( void )

{

    int temperature =  0;

    while( 1 )

    {

        temperature = GetTemperature();

        if( temperature > 60)  // 온도가 60도를 넘으면, 냉각 Fan을 100 속도로 돌린다.

            SetFanSpeed( 100 ); 

        else  // 60도 이하에선 Fan을 Off ( 0 속도) 로 한다.

            SetFanSpeed( 0 );

        

      delay( 0.2); // 0.2 초 기다리고 다시 동작...

     {

         static int count = 0;

         if( (count%50 ) == 0)   // 0.2 초 * 50 = 10초에 한번 온도값을 본다.

         printf(" Temp:%d \n", temperature);

    count ++; // count 증가

     }

    }

}





Posted by 고무함지
,

포인터 사용시 주의해야할 것은 포인터 변수의 크기를 알아 내는 것입니다.

크기를 알아야 자료 복사나, 메모리 할당등을 할 수 있기 때문입니다.


여러가지 예제로 확인해보니, 주의할 점이 보이더군요.


1. 포인터 변수 자체의 크기인 경우


2. 포인터가 가르키는 것이 배열인 경우 그.. 배열의 크기가 됨.


3. 포인터가 가르키는 것이 배열인지, 행 하나인지 주의 할 것



아래 내용으로 어떤 차이들이 있는지 확인해보시기 바랍니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void main(void)
{
    int arr[3][4= { {1,2},{3,4,5},{6,7,8,9} };
    //0행 : 1, 2, 0, 0
    //1행 : 3, 4, 5, 0
    //2행 : 6, 7, 8, 9
    printf(" %d,", arr[2][1]);   
    // 배열 2행 1열의 값은 (0열 다음값인) -> 7
 
    printf(" %d,"*(*(arr+2)+1) );
    // 배열 2행 1열의 값은 역시 -> 7
 
    printf(" %d,"sizeof(arr));
    // arr은 전체 배열의 크기인 3x4x4byte = 48
 
    printf(" %d,"sizeof(arr+0));
    // 이건 arr과 동일한 결과가 나올 것으로 예상했으나, 명시적으로 0번째 행을 
    // 지칭 하기 위해서 + 0 을 하는 것임. 0번 행의 포인터이므로 .. 포인터의 크기는 4byte
 
    printf(" %d,"sizeof(arr+1));  // 역시 포인터의 크기 -> 4
    printf(" %d,"sizeof(arr+2));  // 포인터의 크기   -> 4
    printf(" %d,"sizeof(*(arr+2))); 
    // 포인터가 가르치는 곳(*연산자)이므로... 행의 크기 4x4byte = 16
 
    printf(" %d,"sizeof(*(arr + 2)+1));  
    // 포인터의 포인터가 가르키는 곳(**)이므로... 열의 하나의 크기 -> 4 byte
 
    printf("Good bye");
    // 결과  7, 7, 48, 4, 4, 4, 16, 4,
}
 
cs


Posted by 고무함지
,