Página 1 de 1
Array x tamanho

Enviado:
24 Out 2006 17:45
por lrfad2
Boa Noite pesssoal,
Estou utilizando o LPC2138 + compilador da IAR + o J-link. Bom, a minha pergunta é o seguinte. Por que eu não consigo declarar um array de 4Kbytes, visto que eu declarei a minha RAM com 16Kytes?
(Estou "debugando" em RAM onde o tamanho total são 32Kbytes, e eu a dividi em 16Kbytes funcionando como RAM e os outros 16K com memória de programa)
Acredito que não, mas existe paginação de memória?
Qq contribuição é bem vinda
Obrigado a todos,
Leandro

Enviado:
24 Out 2006 17:53
por Fábio Pereira
Olá Leandro,
Respondendo as suas perguntas:
A memória dos ARMs é linear.
Qual a mensagem de erro que você recebe ?
Até +

Enviado:
24 Out 2006 19:36
por xultz
Estranho, com um LPC2106 e compilador gcc, eu declarei uma array de 30.000 posições de 16 bits e ele aceitou numa boa... e está funcionando!

Enviado:
25 Out 2006 07:53
por lrfad2
pois é Xultz... eu tb acho estranho não funcionar
Engraçado que se eu declarar um array de até 1792Bytes não dá problema, acima disso dá..
Fábio: o erro está descrito a seguir
Error[e16]: Segment CSTACK (size: 0x2000 align: 0x2) is too long for segment definition. At least 0x4 more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)CSTACK+2000=40004000-40007FFF", where at the moment of placement the available memory ranges were "CODE:40006002-40007fff"
Reserved ranges relevant to this placement:
40004000-40006001 DATA_Z
40006002-40007fff CSTACK
A minha memória esta mapeada da seguinte maneira:
Exception vector addresses 40000000-4000003F
Internal ROM 40000040-40003FFF
Internal RAM 40004000-40007FFF

Enviado:
25 Out 2006 09:13
por Fábio Pereira
O problema não é com a sua matriz, mas com o segmento cstack (que guarda a pilha utilizada pelos programas em C).
Verifique a configuração das pilhas no seu projeto, provavelmente elas estejam muito grandes.
Até +

Enviado:
25 Out 2006 09:52
por lrfad2
eu já tentei abaixar o tamanho e mesmo assim não funcionou... agora eu tô tentando entender como que cada coisa dessas Stack,IRQ,Heap funciona dentro do controlador... se vc souber de alguma literatura que esteje disponível na net eu agradeço.
de qq maneira... mto obrigado

Enviado:
25 Out 2006 10:27
por ivan
Bem fiz a seguinte conta e gostaria de saber se meu raciocínio está correto:
CSTACK definido = 0x40007FFF - 0x40006002 = 0x1FFD = 8189 bytes(decimal)
CSTACK necessário = (size: 0x2000 align: 0x2) = 4Kbytes * 2 align = 8192
Então:
8192 - 8189 = 3 bytes (faltando)
Error[e16]: Segment CSTACK (size: 0x2000 align: 0x2) is too long for segment definition. At least 0x4 more bytes needed.
Seguindo o raciocínio, o CSTACK ficaria:
CSTACK = 40006002 - 40008003(= 40007FFF + 4)

Enviado:
25 Out 2006 14:18
por lrfad2
Oi Ivan... eu não sei se o seu raciocínio está correto, alias eu nem entendi direito... por que vc multiplicou 4k por 2? (size: 0x2000 align: 0x2) = 4Kbytes * 2 align
Vc sabe definir o que é CSTACK, IRQ STACK, e HEAP?
Vixe cara... eu ainda tô mô perdido!

Enviado:
25 Out 2006 14:27
por Fábio Pereira
CSTACK é a pilha destinada aos programas em C (utilizada para armazenamento temporário de variáveis, contexto, parâmetros de função, etc).
IRQ STACK é a pilha de interrupção IRQ
FIQ STACK é a pilha de interrupção FIQ
HEAP é a área de memória destinada ao armazenamento dinâmico (malloc).
Lembre-se também de que pode ser necessário reservar memória para as pilhas dos demais modos de exceção, caso você os utilize (ou exista a possibilidade de que ocorram).
Até +

Enviado:
25 Out 2006 17:44
por lrfad2
Por acaso alguem sabe configurar o arquivo *.xcl do IAR?

Enviado:
27 Out 2006 13:28
por lrfad2
eu achei um site que explica direitinho como configurar o EW (
http://www.rogerlynx.com/index.html), mas o problema de aparente conflito de memória ainda persiste...
Como na maioria esmagadora das vezes eu trabalhei com Pascal e Assembler, talvez esteja cometendo algum equívoco na hora de declarar as variáveis. Fiz assim..
unsigned int pg1[(unsigned int)(0x0400)];
unsigned int pg2[(unsigned int)(0x0400)];
unsigned int pg3[(unsigned int)(0x0400)];
unsigned int pg4[(unsigned int)(0x0400)];
ou
unsigned int memoria[0x1000];

Enviado:
27 Out 2006 16:20
por xultz
Desculpa a ingorância, mas por que você colocou um type cast na declaração do tamanho da matriz? Eu nunca tinha ouvido falar nisso...

Enviado:
30 Out 2006 09:55
por lrfad2
Bom xultz, eu não sei o que é um type cast mas imagino que seja o "(unsigned int)"... eu coloquei por que estava tentando de tudo para resolver meu problema. Na verdade tanto faz colocar ou não...
para resolve-lo adicionei as seguintes linhas no arquivo *.xcl
-Z(DATA)ABT_STACK+100=40000000-40007FFF
-Z(DATA)UND_STACK+100=40000000-40007FFF
-Z(DATA)FIR_STACK+100=40000000-40007FFF
-Z(DATA)SVC_STACK+100=40000000-40007FFF