Pergunta

Tenho para armazenar instruções, comandos que vou receber via serial.Os comandos serão 8 bits de comprimento.

Eu preciso para preservar a transparência entre o nome do comando, e o seu valor.De modo a evitar ter de traduzir um número de 8 bits recebidos em série dentro de qualquer tipo.

Eu gostaria de usar Enumerações para lidar com eles no meu código.Apenas uma enumeração corresponde a um nesta plataforma de inteiros de 16 bits.

A plataforma é AVR ATmega169V microcontrolador, no Borboleta de demonstração do conselho.É um 8bit sistema com algum suporte limitado para 16bit operações.Ele não é um sistema rápido e tem cerca de 1 KB de memória RAM.Não tem nada de luxos como e/S de arquivo, ou um sistema operacional.

Para quaisquer sugestões sobre que tipo eu deveria estar usando para armazenar 8 bits comandos?
Tem que haver algo melhor do que um enorme cabeçalho de #define.

Foi útil?

Solução

gcc's -fshort-enums pode ser útil:

Alocar para um tipo de "enum" apenas tantos bytes quanto necessário para a faixa declarada de valores possíveis. Especificamente, o tipo "enum" será equivalente ao menor tipo inteiro que tem espaço suficiente.

Na verdade, aqui'Página SA com muitas informações relevantes. Espero que você se depare com muitos interruptores do GCC que nunca soube que existiam. ;)

Outras dicas

Você está tentando resolver um problema que não existe.

Sua pergunta é marcado C.Na linguagem C tipos de enum no valor de contexto são totalmente compatíveis com os tipos integrais e se comportam como outros tipos integrais.Quando usada em expressões, eles são submetidos a exatamente a mesma integral promoções como outros tipos integrais.Uma vez que você levar isso em conta, você deve perceber que, se você deseja armazenar os valores descritos por enumeração constantes em um 8-bit tipo integral, tudo que você tem a fazer é escolher um genérico de 8 bits tipo integral (dizer int8_t) e usá-lo em vez do tipo enum.Você vai perder absolutamente nada, armazenando a sua enumeração constante de valores em um objeto do tipo int8_t (em oposição a um objeto explicitamente declarada com o tipo enum).

O problema de descrever seria existe em C++, em que tipos de enum são separados muito longe dos outros tipos integrais.Em C++ usando um tipo integral no lugar do tipo enum com a finalidade de salvar a memória é mais difícil (embora seja possível).Mas não em C, onde se requer nenhum esforço adicional, de qualquer natureza.

Não vejo por que uma enumeração não funcionaria. Comparações e atribuições de uma enumeração devem funcionar bem com a ampliação padrão. Apenas tenha cuidado para que seus valores de 8 bits sejam assinados corretamente (eu acho que você gostaria de uma extensão não assinada).

Você obterá comparações de 16 bits dessa maneira, espero que não seja um problema de desempenho (não deveria ser, especialmente se o seu processador for de 16 bits, como parece).

O compilador C da Microsoft permite que você faça algo assim, mas é uma extensão (é padrão em C ++ 0x):

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

Desde que você marcou o GCC, não tenho certeza se a mesma coisa é possível, mas o GCC pode ter uma extensão em gnu99 modo ou algo assim. Dê um giro.

Eu recomendo ficar no enum, em qualquer caso, pelas seguintes razões:

  • Esta solução permite mapear comando de valores que o protocolo serial espera.
  • Se você realmente usar a arquitetura de 16 bits não é tão grande número de vantagens para mover para 8 bits tipo.Pensar sobre aspectos outros, em seguida, 1 byte de memória guardado.
  • Em alguns compiladores eu usei real enum tamanho do número mínimo de bits (enums que poderiam ser enquadrados em bytes usados apenas byte e, em seguida, de 16 bits, em seguida, 32).

Primeiro que você não deve se preocupar com tipo real de largura.Apenas se você realmente precisa de modo eficaz de armazenamento, você deve usar o compilador sinalizadores como -fshort-enums em GNU compilador, mas eu não recomendo, a menos que você realmente precisa deles.

Como última opção, você pode definir "enum", como apresentação de dados para os comandos e usar a conversão de byte com 2 operações simples para guardar / restaurar o valor de comando de/para a memória (e encapsular isso em um só lugar).O que sobre isso?Estas são operações muito simples, então você pode até mesmo inline-los (mas isso permite que você realmente use apenas 1 byte para o armazenamento e de outro lado a realizar operações usando mais utilizável enum definidas como você gosta.

Resposta que é relevante para Compilador de arco (Citado no Guia do Programador C/C ++ do Metaware Designware para o ARC; Seção 11.2.9.2)

O tamanho das enumerações do tamanho de um tipo de enumera depende do status da alternância *long_enums *.

■ Se alternar * long_enums * estiver desligado, o tipo de enumeração mapeia o menor de um, dois ou quatro bytes, de modo que todos os valores possam ser representados.

■ Se alternar * long_enums * estiver ligado, um enum mapas para quatro bytes (correspondendo à Convenção do compilador C AT&T portátil).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top