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?
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?
Respostas:
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
@
é 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 )
@
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.
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".
@
sintaxe, não apenas o Mplab.