Pergunta

Eu sou novo em programação de sistemas embarcados. Eu estou trabalhando em um dispositivo que usa um chipset 8051. Tenho notado nos programas de exemplo que, quando a definição de variáveis, às vezes eles usam a palavra-chave xdata. assim ...

static unsigned char xdata PatternSize;

enquanto outras vezes a palavra-chave xdata é omitido.

O meu entendimento é que a palavra-chave xdata instrui o compilador que essa variável deve ser armazenado no externo, flash, memória.

Em que casos devo guardar variáveis ??externamente com xdata? Acessando essas variáveis ??leva mais tempo, certo? Valores armazenados usando xdata não permanecer após um hard reset do dispositivo não é?

Além disso, eu entendo que os meios de palavra-chave estáticos que a variável irá persistir através de cada chamada para a função é definida no. Do estática e xdata têm que ser usados ??juntos?

Foi útil?

Solução

A arquitetura 8051 tem três espaços de endereços separados, a RAM núcleo utiliza um endereço de 8 bits, por isso, pode ser de até 256 bytes, XDATA é um espaço de endereçamento de 16 bits (64Kbytes) com capacidade de leitura / gravação, eo espaço programa é uma espaço de endereçamento de 16 bits com execução e somente leitura recursos de dados. Por causa de sua escala pequena endereço de e acoplamento perto do núcleo, abordando a RAM núcleo é mais eficiente em termos de espaço de código e ciclos de acesso

O 8051 núcleo original tinha tiny-on-chip de memória RAM (um espaço de endereçamento de 256 bytes, mas algumas variantes tinha metade disso na memória real), e XDATA referido off-chip de memória de dados (em oposição a memória de programa). No entanto mais modernos 8051 arquitetura dispositivos têm XDATA e um programa de memória on-chip.

Assim que você pode usar a memória de núcleo quando o desempenho é crítico e XDATA para objetos de memória maiores. No entanto, o compilador na maioria dos casos deve tomar essa decisão para você (cheque do seu compilr manual, ele irá descrever em detalhes como a memória é alocada). O conjunto de instruções torna eficiente de implementar a pilha na memória do núcleo, enquanto que os dados estáticos e dinamicamente alocados normalmente seria mais sensato alocados em XDATA. Se o compilador tem uma palavra-chave XDATA, em seguida, ele irá substituir a estratégia do compilador, e só deve ser usado quando a estratégia do compilador de alguma forma falhar, uma vez que irá reduzir a portabilidade do código.

[editar] Note também que a memória de núcleo inclui uma região pouco endereçável 32byte, as instruções de endereçamento de bit usar um endereço de 8 bits para esta região para acessar bits individuais diretamente. A região existe dentro do 256byte byte de memória endereçável núcleo, por isso é tanto endereçável bit e byte [/ edit]

Outras dicas

xdata diz ao compilador que os dados são armazenados na memória RAM externa assim que tem que usar uma instrução diferente para ler e escrever que a memória em vez de RAM interno.

Acesso a dados externos faz demorar mais tempo. Eu costumo colocar variáveis ??de interrupção na RAM interna e a maioria das grandes matrizes na RAM externa.

Quanto ao estado da RAM externa depois de um (não ciclo de energia) hard reset: Isso dependeria da configuração do hardware. Será que uma linha de reset ir para o chip externo? Também alguns chips vêm com XDATA dentro do chip da CPU. Leia de novo. Alguns chips têm uma CPU 8051, mais uma certa quantidade de XDATA dentro do IC.

estática e xdata não se sobrepõem. Estática informa o compilador como alocar uma variável (em uma pilha ou em um local de memória). Xdata diz ao compilador como chegar a essa variável. Estática também pode restringir o espaço de nome dessa variável para apenas esse arquivo. Você pode ter uma variável estática xdata que é local para apenas uma função, e ter uma variável estática que é local para uma função, mas usa memória RAM interna.

Um ponto importante ainda não mencionado é que porque os diferentes instruções são usadas para acessar diferentes áreas de memória, o hardware não tem unificado conceito de um "ponteiro". Qualquer endereço que é conhecido por ser no espaço de dados / IDATA pode ser identificada exclusivamente com um ponteiro de um byte; Da mesma forma qualquer endereço que é conhecido por estar no espaço pData. Qualquer endereço que é conhecido por ser no espaço de código podem ser identificados com um ponteiro de dois bytes; Da mesma forma qualquer endereço que é conhecido por estar no espaço XDATA. Em muitos casos, porém, uma rotina como memcpy não vai saber com antecedência qual o espaço de memória deve ser usado com os ponteiros passaram-in. Para acomodar que, 8x51 compiladores geralmente utilizar um tipo de ponteiro de três bytes que pode ser utilizado para acesso coisas em qualquer espaço de memória (seleciona um byte que tipo de instruções deve ser usada com o ponteiro, e os outros bytes de armazenar o valor). A declaração de ponteiro como:

char *ptr;

irá definir um ponteiro de três bytes, que pode apontar para qualquer espaço de memória. Alterar a declaração

char xdata *data ptr;

irá definir um ponteiro de dois bytes que é armazenado no espaço de dados, mas que só pode apontar para as coisas no espaço XDATA. Da mesma forma

char data * data ptr;

irá definir um ponteiro de dois bytes que é armazenado no espaço de dados, mas que só pode apontar para coisas nos espaços de dados e iData. Código que usa ponteiros que apontam para um espaço de dados conhecida será muito mais rápido (possivelmente por um fator de dez) do que o código que usa os "de uso geral" ponteiros de três bytes.

Como e quando usar área de memória XData depende da arquitetura do sistema. Alguns sistemas podem ter RAM neste endereço, enquanto outros poderiam ter ROM ou Flash. Em qualquer caso, o acesso será mais lento do que o acesso interno RAM, ROM ou Flash.

De um modo geral, grandes itens, itens constantes e menos itens usados ??devem entrar em XData. Não há regras padrão como ao que se passa no XData, uma vez que depende da arquitetura.

O 8051 tem um alcance de 128 bytes de zero pad "pseudo-registos" que (a maioria) compiladores usar como padrão para as variáveis ??declaradas. Mas, obviamente, esta área é muito pequena, e você quer ser capaz de colocar variáveis ??no espaço de endereço de memória de 16 bits também. Isso é o que o xdata (ou seja, "dados externos") especificador é para. O que colocar onde depende, obviamente, sobre o que os dados são e como você planeja usá-lo.

Basicamente, eu acho que essa é a pergunta errada. Você precisa entender sua arquitetura de CPU antes de aprender a usar os recursos específicos 8051 do compilador C.

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