Página 1 de 1

Memoria RAM MSP430FG4618

MensagemEnviado: 26 Mai 2008 19:24
por alessandro
Estou tentando usar uma matrix em meu codigo:

int matrix[3000];

Só que esta dando erro que pelo que entendi, falta memória, se eu diminuo para [2000], ai compila. Me corrijam aí algum erro:

3000 * 2byte (int matrix) = 6KB, é isso? No datasheet desse mcu diz 8KB de RAM, pelo que entendi lá é BYTE nao BIT, ok?

Alguém sabe o que esta acontecendo? O compilador acaba usando mais do que achamos que vai usar?

OBS: O compilador é o IAR com licença FULL.


Alessandro

MensagemEnviado: 27 Mai 2008 07:32
por alessandro
Pessoal, pelo que estou vendo ele compila normalmente mas ao tentar gravar (ele entra no modo DEBUG) ai sim ele apresenta o tal erro.

Talvez possa ser o espaço a mais ocupado pelo código do DEBUG????

MensagemEnviado: 27 Mai 2008 07:59
por Fábio Pereira
Olá Alessandro,

Você não esclareceu muito a situação: ou é erro de compilação ou não ...

No primeiro post você disse que o programa dava erro ao compilar, no segundo você diz que compila mas dá erro no debug.

Os MSPs não utilizam código adicional para debug. Toda a depuração é feita através do hardware JTAG existente no chip.

Qual exatamente é o erro que você está obtendo?

T+

MensagemEnviado: 27 Mai 2008 08:39
por alessandro
Olá Fabio,

Vou esclarecer melhor, ficou estranho.
Ele compila normalmente, mas quando clico no DEBUG para passar o código para a pastilha ele dá a mesagem:

Error[e16]: Segment DATA16_Z (size:0x2710 align: 0x1) is too long for segment definition. At least 0x710 more bytes needed. The problem ocorred while at the moment of placement the available memory were "CODE:1100-30ff"
Reserved ranges relevant to this placement:
1100-30ff DATA16_I
Error wile unning Linker

MensagemEnviado: 28 Mai 2008 08:57
por Fábio Pereira
Hmmm,

Agora sim ...

Isto é um erro do linker, o seu programa nem chegou a ser descarregado na memória do MCU ...

O linker está reclamando que o segmento DATA_Z tem 10000 bytes e não cabe na definição de segmento. Você tem outras arrays declaradas? Qual o tamanho da pilha? O arquivo de configuração do linker está correto?

T+

MensagemEnviado: 28 Mai 2008 10:30
por alessandro
Fabio, parece que sai um problema, logo vem outro...

Achei o que estava errado, realmente era a configuração do Chip usado nos projeto. O que estava definido era de um modelo cuja memória era inferior. Trocado o device pelo modelo correto funcionou corretamente, valeu!

Agora, neste caso mesmo, venho notando que as vezes quando entramos no modo DEBUG a seta que indica o inicio do programa não aparece, ou seja, logo no início não tenho a opção de ir vendo linha à linha.

Pressiono BREAK e a seta aparace, mas aparece na janela DISASSEMBLY, não aparece em meu código. Noto que ao diminuir a matrix para [2000] a seta aparece.

Há uma explicação para isso?

O código é simples, somente para testar essa matrix.

#include "msp430xG46x.h"

int matrix [3000]; ===> SETA MODO DEBUG NAO APARECE
int matrix [2000]; ===> SETA MODO DEBUG APARECE


main( void )
{
volatile unsigned int i;

WDTCTL = WDTPW + WDTHOLD;


while(1)
{
int tempo;

for(tempo=0;tempo<3000;tempo++)
{
matrix[tempo] = tempo;
}
}
}

MensagemEnviado: 29 Mai 2008 12:09
por alessandro
Dá a entender que seja algo referente a memória, pois apesar de compilar com uma matrix[2000] ou [3000] sem erros, no momento do debug da problema.

No corpo de mensagens do IAR diz que usei:
28 bytes of CODE memory
6000 bytes of DATA memory (+2 bytes shared)

Meu chip tem 8000 bytes, não sei o que esta havendo. Não achei nada ainda na net ou datasheet que explicasse isso.

MensagemEnviado: 03 Jun 2008 08:09
por Fábio Pereira
Olá Alessandro,

A dica do Hernan Tradatti (da lista de MSP430) estava correta? Me parece que realmente o seu programa não esteja conseguindo sair da área de inicialização de variáveis (que é executada antes do main), devido a um estouro do watchdog.

Se você declarar a array como __no_init, ela não será inicializada automaticamente e provavelmente o programa atingirá o main() conforme o esperado.

Outra solução seria você alterar o código de inicialização e inserir uma instrução para desativar o watchdog logo no início do código.

Até +

MensagemEnviado: 03 Jun 2008 14:24
por alessandro
Fábio, a dica foi na mosca, realmente pela matrix ser muito grande levava-se um tempo conisderavel para carregar o inicio da rotina e por isso o WDT estourava (pelo que entendi),

Após usar o comando __no _init( ); resolveu o problema.

Valeu,

Alessandro