Memoria RAM MSP430FG4618

Software e Hardware para uC Texas

Moderadores: andre_luis, 51

Memoria RAM MSP430FG4618

Mensagempor alessandro » 26 Mai 2008 19:24

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
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor alessandro » 27 Mai 2008 07:32

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????
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor Fábio Pereira » 27 Mai 2008 07:59

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+
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 alessandro » 27 Mai 2008 08:39

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
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor Fábio Pereira » 28 Mai 2008 08:57

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+
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 alessandro » 28 Mai 2008 10:30

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;
}
}
}
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor alessandro » 29 Mai 2008 12:09

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.
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32

Mensagempor Fábio Pereira » 03 Jun 2008 08:09

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é +
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 alessandro » 03 Jun 2008 14:24

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
Alessandro
Avatar do usuário
alessandro
Byte
 
Mensagens: 278
Registrado em: 12 Out 2006 19:32


Voltar para Texas

Quem está online

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

x