Como declarar matrizes de grandes dimensões no compilador C para PIC18 dispositivos

K

kekon

Guest
Eu uso Microchip compilador C para dispositivos PIC18. Meu projeto consiste PIC18F252 dispositivo que tem cerca de 1500 bytes de RAM interna. Apesar de que eu não posso declarar matrizes maiores que 256 bytes como o erro relatórios vinculador que ele é incapaz de memória reserva. char buffer [255]; - isso faz com buffer de erro vinculador char [120]; - nenhum erro Ela também diz respeito à atribuição dos dados em linguagem de montagem com RES directiva: tampão RES 255 - o que provoca erro de vinculador bem tampão RES 120 - sem o mesmo erro problema aparece quando outras variáveis ​​ocupam mais de 255 bytes de RAM. Por que é assim? Existe alguma solução?
 
parece um problema comum em alguns dos compilador usando com settings.I padrão não tenho certeza, mas você pode brincar com as opções do compilador, memória etc algo modelos ..
 
Você deve definir os campos de dados maiores no script de linker. Aqui está um exemplo de programa que aloca matriz de 350 unsigned char. 8O
 
Obrigado pela ajuda. Eu também encontrei uma solução em C documentação do compilador no site da Microchip. Mas eles dizem que qualquer acesso a tais matrizes deve ser feito por ponteiros da seguinte forma: # include # pragma udata CAMPO unsigned char r [350]; # pragma vazio udata main (void) {char * ptr; ptr = & r [0]; ptr [300] = 0x12;} Esta é, provavelmente, devido ao compilador que é capaz de detectar quando é neccesary para mudar RAM banco quando accesing "r" tampão diretamente. Então, provavelmente um acesso indireto é correto: ptr [300] = 0x12;
 
Bem, como eu vi na desmontagem do meu código C18 cuida de acesso bancados quando você escrever diretamente valor como: r [300] = 0x12; 11: r [200] = 0x12; 0000E2 0102 MOVLB 0x2 0000E4 0E12 MOVLW 0x12 MOVWF 0000E6 6FC8 0xC8 , banco e para acesso indexado C18 usa FSR0. pp = 120; r [pp] = 0x15; 12: pr = 120; 0000E8 0E78 MOVLW 0x78 0000EA 0100 MOVLB 0 0000EC 6F8A MOVWF 0x8a, bancados 0000EE 6B8B CLRF 0x8b, inclinadas 13: r [PR] = 0x15; 0000F0 0E00 MOVLW 0 0000F2 258A ADDWF 0x8a, W, bancados 0000F4 6EE9 MOVWF 0xfe9, ACESSO 0000F6 0E02 MOVLW 0x2 0000F8 218B ADDWFC 0x8b, W, bancados 0000FA 6EEA MOVWF 0xfea, ACESSO 0000FC 0E15 MOVLW 0x15 MOVWF 0000FE 6EEF 0xfef, ACESSO Mas se você diz que Microchip recomands indireta acesso deve haver uma boa razão para isso.
 
= 0x12;} Esta é, provavelmente, devido ao compilador que é capaz de detectar quando é neccesary para mudar RAM banco quando accesing "r" tampão diretamente. Então, provavelmente um acesso indireto é correto: ptr [300] = 0x12;
Eu usei esse método com o meu PIC 18F25K20 e eu só tenho a resposta: Erro - 'campo' secção não pode caber a seção. Seção 'campo' comprimento = Não 0x0000015e memória RAM suficiente para usar este método eu presumo? Que outras medidas posso tomar?
 
SIMCE, graças uma montanha para que o exemplo. Todos os demais - eu sei que provavelmente pode ser tentador para soltar um RTFM de vez em quando, mas vamos ser honestos, quem tem tempo de ler todos os manuais para tudo. Fazemos o melhor que podemos e quando um projeto é devido em breve, só precisamos saber como fazer o que precisamos fazer e vamos voltar para o resto mais tarde (se tivermos sorte ...). Eu escrevi alguns baldes de c no meu dia, mas enganando com o vinculador para um PIC não é apenas algo que eu tenho tido tempo (ou tinha a) aprender sobre, o meu patrão só quer resultados ontem. Obrigado mais uma vez, adereços grandes.
 
C18 ou PICC18? Você deve usar matriz como linguagem C típico.
 

Welcome to EDABoard.com

Sponsor

Back
Top