Página 1 de 1
Memoria RAM MSP430FG4618

Enviado:
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

Enviado:
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????

Enviado:
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+

Enviado:
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

Enviado:
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+

Enviado:
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;
}
}
}

Enviado:
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.

Enviado:
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é +

Enviado:
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