Array x tamanho

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Array x tamanho

Mensagempor lrfad2 » 24 Out 2006 17:45

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
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor Fábio Pereira » 24 Out 2006 17:53

Olá Leandro,

Respondendo as suas perguntas:

A memória dos ARMs é linear.

Qual a mensagem de erro que você recebe ?

Até +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor xultz » 24 Out 2006 19:36

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!
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor lrfad2 » 25 Out 2006 07:53

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
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor Fábio Pereira » 25 Out 2006 09:13

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é +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor lrfad2 » 25 Out 2006 09:52

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
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor ivan » 25 Out 2006 10:27

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)
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor lrfad2 » 25 Out 2006 14:18

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!
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor Fábio Pereira » 25 Out 2006 14:27

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é +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor lrfad2 » 25 Out 2006 17:44

Por acaso alguem sabe configurar o arquivo *.xcl do IAR?
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor lrfad2 » 27 Out 2006 13:28

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];
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor xultz » 27 Out 2006 16:20

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...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor lrfad2 » 30 Out 2006 09:55

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
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo


Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x