Declaração variável com @ em C

11

Estou lendo um código C e me deparei com esta declaração no programa:

unsigned char serv_ctr @0x0002;

Alguém pode me indicar documentação ou explicar para que serve o "@ 0x0002" no compilador Mplab XC8 v1.35 C?

be-ee
fonte
14
Eu acho que é uma extensão do compilador colocar a variável em um endereço específico.
Eugene Sh.
2
a pergunta pode beneficiar a tag #mplab, pois é específico do Mplab.
Sylvainulg 22/05/19
Apenas para entender: isso está no tópico deste site? Eu acho que isso pertence ao SO. Ou pode pedir aqui a programação do microcontrolador. Isso tornaria um pouco claro onde essas perguntas deveriam estar.
Adeus SE
6
@KamiKaze Que tópicos posso perguntar aqui? lista "a gravação do firmware para aplicativos bare-metal ou RTOS", como no tópico, e "Software de programação para um PC", como fora do tópico. Como isso parece ser sobre a programação de sistemas embarcados, parece que estamos de olho no tópico. O fato de ele também estar no tópico Stack Overflow não o torna por si só aqui.
um CVn
@KamiKaze obrigado por perguntar, eu tinha questões semelhantes (eu não sou um usuário regular desta SE)
GPPK

Respostas:

20

Isso é para especificar um endereço absoluto para colocar a variável.
Na página 27 do manual do compilador XC8 , seção 2.5.2 Endereçamento Absoluto :

Variáveis ​​e funções podem ser colocadas em um endereço absoluto usando a __at()construção
......
2.5.2.2 DIFERENÇAS
Os compiladores de 8 bits usaram um símbolo @ para especificar um endereço absoluto

Eugene Sh.
fonte
6

@é uma extensão não padrão comum para a linguagem C que permite declarar uma variável em um endereço específico. Ele pode ser usado para registros de hardware mapeados na memória etc. Nesse caso, a variável também deve ser declarada volatile, para que seu exemplo esteja incorreto.

Outros compiladores usam algo como __attribute__(section...ou #pragma ..., todos eles não-padrão C.

A única razão racional (se houver) pela qual as cadeias de ferramentas fazem isso é habilitar a depuração de registro em depuradores de baixa qualidade. A sintaxe não padrão garantirá que o registro se torne parte das informações de saída e depuração do vinculador. O que, por sua vez, permite que você assista o registro no depurador de baixa qualidade, assim como em qualquer outra variável.

Se você tiver um bom depurador, ele terá suporte e conhecimento do seu MCU específico. Então você não precisa de nada fora do padrão no código C, mas pode escrever C padrão puro e portátil:

#define serv_ctr ( *(volatile uint8_t*)0x0002u )
Lundin
fonte
1
Embora os compiladores sejam obrigados a aceitar o último formulário, as implementações podem mapear números para endereços da maneira que entenderem. Além disso, a maioria dos compiladores que vi usam @plataformas de destino de notação com vários espaços de memória ou outros problemas, para que a maioria das coisas declaradas usando @notação se comportasse de maneira diferente de qualquer coisa que pudesse ser feita sem extensões.
Supercat
1

Uma pequena extensão:

Isso não está mais funcionando desde o xc8 2.0 e superior. Agora você tinha que escrever:

unsigned char serv_ctr __at(0x0002);

colocar uma variável ( serv_ctr) em um endereço absoluto ( 0x0002).

Com o XC8 2.0, é possível compilar seu código antigo usando a @sintaxe se você definir as configurações do compilador para usar o formato "C90". A configuração se parece com isso, está em "XC8 Global Options" e é chamada "C standard".

Mike
fonte
Muitos outros compiladores de sistemas embarcados também suportam a @sintaxe, não apenas o Mplab.
Lundin