O que é 'char não assinado próximo'?

12

Eu li uma folha de dados e achei variável definida como unsigned char near Sample_X. O que é isso e como isso difere unsigned char Sample_X?

oppo
fonte
3
talvez permita que o compilador use pequenas compensações relativas?
Neil_UK
6
Com base na experiência da parte com x86 no DOS, eu esperaria isso com algum tipo de ponteiro e em um ambiente de 16 bits. No entanto, o que o OP citado não parece um ponteiro e o link da folha de dados implicaria algum MCU. Procure a palavra-chave "near" nos dois links a seguir: microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/Efficient-C-Code
frr
3
Deve notar-se que este é um extensões do compilador, não padrão C
PlasmaHH
Pode ser sobre o CCM. Considerando que o código é direcionado principalmente para um MCU, pode ser uma sugestão indireta ao vinculador pelo suporte do compilador para colocá-lo no CCM (memória acoplada de núcleo), se disponível.
Ayhan
1
FYI, a palavra-chave,, nearé um exemplo de um especificador de classe de armazenamento . Diz ao compilador algo sobre como ou onde o armazenamento da variável deve ser alocado. (Veja a resposta do filo, abaixo, para mais informações near).
Solomon Slow

Respostas:

20

O MCU especificado aqui é uma série Freescale MC9C08 , que usa uma versão ligeiramente aprimorada de sua arquitetura HC08. Este é um núcleo de 8 bits, que (como muitos outros) tem instruções mais curtas e acesso mais rápido a endereços de "página zero" do que outros. Os endereços de página zero têm apenas 8 bits em vez de 16 bits; portanto, as instruções referentes a eles podem ter 2 bytes em vez de 3 e levar 1 ciclo a menos para serem executadas como resultado.

A palavra-chave "near" instrui o compilador a colocar a variável em "zero page", se possível, para obter melhor desempenho. Os compiladores escritos especificamente para o desenvolvimento incorporado, como este , geralmente implementam essas extensões no idioma (aqui descrito como "Suporte C para zero página").

Chromatix
fonte
Eu gosto desta resposta, mas você tem uma fonte para suas informações?
Clonkex
1
Editei a resposta para fornecer mais detalhes e referências. De fato, é da arquitetura HCS08 mais recente da Freescale, mas isso é compatível com o código das arquiteturas HC08 e HC05 mais antigas. As arquiteturas (agora positivamente antigas) 6800 e 6502 também estão intimamente relacionadas.
precisa
Bom, muito melhor!
Clonkex
Portanto, seu uso é muito semelhante à registerpalavra - chave (nos casos em que você realmente tem certeza de que é aqui que precisa de otimização), mas um pouco menos extremo?
Vsz 17/04
Mais ou menos. A diferença se deve principalmente ao fato de que as CPUs de 8 bits normalmente não têm um banco de registros em si, apenas um único acumulador e alguns registros de índice. Mas também é análogo ao uso de ponteiros "near" vs. "far" no x86, pois há uma diferença no tamanho do endereço e quanto tempo leva para concluir um acesso.
precisa
15

Dependendo da arquitetura da CPU, pode haver instruções diferentes para acessar dados em endereços diferentes. Aqui está um exemplo do Keil para um de seus compiladores.

O acesso próximo possui um certo limite de memória; portanto, você pode dar dicas ao compilador para colocar algumas variáveis ​​freqüentemente usadas em uma área acessível por instruções mais curtas (obviamente, descrever o acesso a um espaço de endereço de 32 bits é maior que o endereço de 16 bits. espaço). Isso pode ser traduzido para um código menor / mais rápido.

filo
fonte
7
Há mais informações em Qual é a diferença entre ponteiros distantes e próximos?
Andrew Morton
5
@AndrewMorton: Essa pergunta se relaciona fare aponta para neara arquitetura 8086 amplamente obsoleta. As mesmas palavras-chave são usadas de maneira relacionada, mas diferente, em microcontroladores de 8 bits.
Supercat
@supercat A pergunta é feita geralmente, embora as respostas se concentrem na arquitetura antiga. Alguém experiente deve escrever uma resposta explicando como eles são usados ​​para microcontroladores de 8 bits.
precisa saber é o seguinte
@curiousdannii: O código em questão foi escrito para um micro de 8 bits.
supercat