문제

나는 모든 바이트가 계산하는 8051의 프로젝트를 진행하고 있습니다. 따라서, 나는 평소에 보이지 않는 일부 글로벌 변수를 사용하고 있습니다. 포인터를 함수로 전달하는 정상적인 방법은 여기에 너무 많은 오버 헤드를 추가합니다.

단일 비트 변수를 사용하는 여러 기능이 있습니다 (컴파일러 별 확장자 ) 정상 반환 값 외에 함수의 결과를 알리기 위해.

bit global_error_flag = 0;
bit global_data_ready_flag = 0;

unsigned char A_Function (void) {
    // Do some stuff

    if ( badness ) {
        global_error_flag = 0;
        global_data_ready_flag = 1;

        return 0;
    }

    if ( data_is_ready_use ) {
        global_data_ready_flag = 1;
    }

    return a_value;    
}

void Other_Function (void) {
    unsigned char c;

    c = A_Function();

    if( global_error_flag) {
        // Do error stuff here.
    }
    else
    if( global_data_ready_flag ) {
        // Do data processing here.
    }
    global_error_flag = 0;
    global_data_ready_flag = 0;

}

이 기술이 악한 것이라는 점을 감안할 때 코드를 더 명확하게 할 수있는 방법이 있습니까?

어떤 함수 호출 이이 플래그를 설정하는 부작용을 나타 내야합니까? 의견이 충분합니까? API (준-헝가리 스타일)를 나타내는 기능의 이름을 지정해야합니까? 매크로를 사용하여 그러한 통화를 표시해야합니다.

#define FUNCTION_SETS_FLAGS(code) (code)

FUNCTION_SETS_FLAGS( c = A_Function() );

다른 아이디어가 있습니까?

도움이 되었습니까?

해결책

당신의 글로벌은 명확성으로 표시되어 있습니다. 좋은 출발입니다.

이상적으로는 잘못되면 컴파일하지 않는 것을 원합니다. 즉, 매크로와 댓글이 작동하지 않는다는 것을 의미합니다.

나는 기능에 대한 명명 대회를 고수합니다 - 반드시 헝가리 인은 아니지만 A_Function_Returns_Flags, 당신이 그것을 생각할 수 있다면, 또는 덜 장점.

다른 팁

컨벤션을 사용하여 "헝가리어"라고 부르 든 아니든 관계 없이이 문제를 표시 할 수있는 가장 좋은 방법입니다. 문체 적으로, 어떤 종류의 명명 접두사가 빈 #define보다 적어도 나에게 바람직 할 것입니다.

이것은 실제로 꽤 일반적이라고 생각합니다. S60 프로그래밍 환경은 함수에 대한 많은 기존 태그를 사용하여 예를 들어 예외를 던지는 것을 나타냅니다.

나는 박사 학위를 받았다. Java에서 비슷한 문제에 대해. 나는 당신이하지 말아야 할 한 가지를 말할 수 있습니다. 문서에 의존하지 마십시오. 왜냐하면 당신은 실제로 그것을 읽는 사람에 의존하기 때문입니다. 메소드 이름에 약간의 힌트를 추가하여 사용자가 부작용에 대해 배우기 위해 문서를 읽어야한다는 것을 나타냅니다. 당신이 무언가를 선택하고 그것과 일치한다면, 아마도 가장 기회가 될 것입니다.

함수가 글로벌 변수에 영향을 미친다고 언급하려면 간단한 (헝가리) 접두사가 도움이 될 수 있습니다.

그러나 영향을 미치는 모든 단일 깃발을 언급하고 싶다면 함수 헤더를 사용하는 것이 아마도 갈 길입니다. 예를 들어,

  /*************************************************************************
     * FUNCTION    : <function_name>
     * DESCRIPTION : <function description> 
     * PARAMETERS  : 
     *  Param1  - <Parameter-1 explanation>
     *  Param2  - <Parameter-2 explanation>
     *  Param3  - <Parameter-3 explanation>
     * RETURN      : <Return value and type>
     * GLOBAL VARIABLES USED: 
     *  Global1 - <Global-1 explanation>
     *  Global2 - <Global-2 explanation>
     *  Global3 - <Global-3 explanation> 
  *************************************************************************/

이것은 실제로 당신에게 도움이되지 않지만 GCC는 반대 당신이 원하는 것 : 아니요 부작용. 참조 const 그리고 pure 속성. 이것은 문서화보다 최적화를위한 것입니다. 생각 : 컴파일러가 주어진 함수가 인수 이외의 데이터를 검사하지 않는다는 것을 알고 있다면 다음과 같은 더 똑똑한 최적화를 수행 할 수 있습니다. 루프 별 코드 모션.

매크로를 사용하여 함수를 시뮬레이션하여 더 많은 매개 변수를 가질 수 있습니다.


unsigned char _a_function(void);

#define A_Function(ret_val) (*(ret_val) = _a_function(), !global_error_flag)

...
unsigned char var;
/* call the function */
if (!A_Function(&var))
{
    /* error! */
}
else
{
    /* use var */
    var++;
}

나는 그것을 컴파일하려고 시도하지 않았으므로 이것이 효과가 있다고 말할 수는 없지만 그렇게해야한다고 생각합니다.

먼저 나는 각 깃발에 대해 한 명의 생산자와 하나의 소비자 만있는 방식으로 코딩하려고 노력할 것입니다. 그런 다음 필요할 때만 깃발을 지우거나 설정합니다. 부작용을 나타내는 것은 기능 위의 표준 헤더 인 Doxygen 스타일로 충분해야합니다.

    // Function func
    // Does something
    // Consumes ready_flag and  sets error_flag on error.

    int func()
    {
        if (ready_flag)
        {
            //do something then clear the flag
            if (some_error)
                error_flag = x;
            ready_flag = 0;
        }
        //don't mess with the flags outside of their 'scope'
        return 0;
    }

반면에, 오류 및 준비 플래그가 상호 배타적 인 경우 바이트 (또는 바이트/레지스터 내부 비트)를 사용하여 준비 또는 오류 상태를 나타낼 수 있습니다.

0 오류의 경우 0, 준비되지 않은/오류가없는 경우 1, 준비/오류가없는 경우 2 (또는 -1, 0, 1 등).

IIRC, 표준 8051 명령 세트는 단일 비트에서 작동하지 않으므로 (다양한) 플래그에 전체 바이트를 사용해도 큰 성능을 제공해서는 안됩니다.

아직 그렇게하지 않았다면 Sourceforge의 SDCC 프로젝트, 그것은 8051을 대상으로하는 임베디드 개발에 특별히 사용되는 C 컴파일러이며, 컴파일러는 다양한 사용 사례에 대한 여러 가지 사용자 정의, 목표 별 컴파일러 내입자를 지원합니다. 또한 개인적으로 개발을 발견했습니다. 새로운 향상 및 기타 관련 기능 요청에 대한 아이디어에 대해 매우 개방적이고 반응을 보인 팀.

이러한 글로벌 변수를 실제로 고수 해야하는 경우 함수에 대한 참조를 함수 인수로 기대함으로써 함수가 수정 될 수 있음을 분명히 할 수 있습니다.

unsigned char A_Function (bit *p_error_flag, bit *p_data_ready_flag)
{
  ...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top