문제

시리얼을 통해 받게 될 명령, 명령을 저장해야 합니다.명령의 길이는 8비트입니다.

명령 이름과 해당 값 사이의 투명성을 유지해야 합니다.직렬로 수신된 8비트 숫자를 어떤 유형으로든 변환할 필요가 없도록 하기 위함입니다.

내 코드에서 이를 처리하기 위해 열거형을 사용하고 싶습니다.열거형만 이 플랫폼의 16비트 정수에 해당합니다.

플랫폼은 AVR ATmega169V 마이크로 컨트롤러입니다. 나비 데모 보드.16비트 작업을 일부 제한적으로 지원하는 8비트 시스템입니다.빠른 시스템은 아니며 약 1KB의 RAM을 가지고 있습니다.파일 I/O나 운영 체제와 같은 사치품이 없습니다.

그렇다면 8비트 명령을 저장하기 위해 어떤 유형을 사용해야 하는지 제안해 주실 수 있나요?
#defines라는 대규모 헤더보다 더 나은 것이 있어야 합니다.

도움이 되었습니까?

해결책

gcc'에스 -fshort-enums 유용 할 수 있습니다 :

"ENUM"유형에 할당 할 수있는 값의 범위에 필요한만큼 바이트 만 할당하십시오. 구체적으로, "Enum"유형은 충분한 공간이있는 가장 작은 정수 유형과 동일합니다.

사실로, 여기'관련 정보가 많은 SA 페이지. 나는 당신이 존재하지 않았던 많은 GCC 스위치를 만나기를 바랍니다. ;)

다른 팁

존재하지 않는 문제를 해결하려고합니다.

귀하의 질문은 C에 태그가 지정됩니다. C에서 값 컨텍스트의 언어 열거 유형은 적분 유형과 완전히 호환되며 다른 적분 유형과 마찬가지로 작동합니다. 표현식에 사용될 때, 그들은 다른 적분 유형과 정확히 동일한 적분 프로모션을받습니다. 이를 고려하면 열거 상수에 의해 설명 된 값을 8 비트 적분 유형으로 저장하려면 적절한 일반 8 비트 적분 유형을 선택하는 것입니다 ( int8_t) 그리고 열거 유형 대신 사용하십시오. 당신은 유형의 객체에 열 상수 값을 저장함으로써 절대적으로 아무것도 잃을 것입니다. int8_t (열거 유형으로 명시 적으로 선언 된 물체와 반대).

당신이 설명하는 문제는 C ++에 존재하며, 여기서 열거 유형은 다른 적분 유형과 훨씬 더 멀리 분리되어 있습니다. C ++에서 메모리를 저장하기 위해 열거 형 유형 대신 적분 유형을 사용하는 것이 더 어렵습니다 (가능하지만). 그러나 C에서는 추가 노력이 필요하지 않습니다.

왜 열거형이 작동하지 않는지 모르겠습니다.열거형과의 비교 및 ​​할당은 기본 확장을 사용하면 모두 잘 작동합니다.8비트 값이 올바르게 서명되었는지 주의하세요(부호 없는 확장을 원할 것이라고 생각합니다).

이런 식으로 16비트 비교를 얻을 수 있습니다. 이것이 성능 문제가 되지 않기를 바랍니다(특히 프로세서가 16비트인 경우에는 그렇지 않습니다).

Microsoft의 C 컴파일러는 이와 같은 작업을 수행 할 수 있지만 확장자입니다 (C ++ 0x의 표준).

enum Foo : unsigned char {
    blah = 0,
    blargh = 1
};

GCC 태그가 지정된 태그이므로 동일한 것이 가능한지 완전히 확신하지 못하지만 GCC는 gnu99 모드 또는 무언가. 소용돌이를 줘.

다음과 같은 이유로 어떤 경우에도 열거적 인 상태를 유지하는 것이 좋습니다.

  • 이 솔루션을 사용하면 직렬 프로토콜이 기대하는 것에 직접 명령 값을 매핑 할 수 있습니다.
  • 실제로 16 비트 아키텍처를 사용하는 경우 8 비트 유형으로 이동할 수있는 이점이 많지 않습니다. 다른 측면에 대해 생각해보십시오. 다른 메모리 바이트 저장.
  • 일부 컴파일러에서 나는 실제 열거 크기를 사용하여 최소한의 비트를 사용했습니다 (바이트 만 사용하는 바이트에 맞는 열거, 16 비트 32).

먼저 실제 유형 너비를 신경 쓰지 않아야합니다. 실제로 효과적인 스토리지 방법이 필요한 경우에만 GNU 컴파일러에서 -fshort -enums와 같은 컴파일러 플래그를 사용해야하지만 실제로 필요하지 않으면 권장하지 않습니다.

마지막 옵션으로서 'enum'을 명령에 대한 프리젠 테이션 데이터로 정의하고 2 개의 간단한 작업으로 BYTE로 변환하여 명령 값을 메모리로 저장 / 복원하여 한 곳에 캡슐화 할 수 있습니다 (한곳에서 캡슐화). 이건 어때? 이들은 매우 간단한 작업이므로 인라인으로도 인라인 작업을 수행 할 수 있습니다 (그러나 저장에는 1 바이트 만 사용할 수 있으며 다른 쪽에서 원하는대로 정의 된 가장 유용한 열거를 사용하여 작업을 수행 할 수 있습니다.

관련된 답변 아크 컴파일러 (Designware Metaware C/C ++ Arc에 대한 프로그래머 안내서에서 인용; 섹션 11.2.9.2)

열거의 크기 열거 유형의 크기는 토글 *long_enums *의 상태에 따라 다릅니다.

■ 토글 * long_enums *가 꺼져 있으면 열거 형식 맵은 1, 2 또는 4 바이트 중 가장 작은 값으로 표시되어 모든 값이 표시 될 수 있습니다.

■ 토글 * long_enums *가 켜져있는 경우, 열거는 4 바이트 (AT & T 휴대용 C 컴파일러 컨벤션과 일치)로 맵핑됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top