Linker - Alocar dados na FLASH do MSP430F149 em C (migrado)

Software e Hardware para uC Texas

Moderadores: andre_luis, 51

Linker - Alocar dados na FLASH do MSP430F149 em C (migrado)

Mensagempor Fábio Pereira » 17 Out 2006 11:39

Postado anteriormente por Gibim:

Pessoal, gostaria de saber como faço para alocar um segmento
de memória utilizando o IAR.?

Pelo que andei lendo, no manual do LINKER, ele diz que existe
algumas opções de alocar espaço de memória.

O meu problema é reservar um espaço de memória para o compilador
não sobescrever nos dados, e poder acessar e modificar esses
valores durante o uso do programa.

Exemplo:


//**************************************
// MacroLógica Instrumentação - by Gibim
//**************************************
#include <io430x14x.h>

-Z(CODE)SEGA=,1000-1080; // Ou
-b(CODE)BSEG1,BSEG2,BSEG3=8000,4000,10000; // Ou
-P(CODE)BANKED=[8000-BFFF]*4+10000; // Place banked code

// Qualquer um desses serveria, mas o
// compilador não aceita.


Também aceito sugestões, mas tem que ser em C. Uma vez que se
fosse em assembler, seria mais fácil, era apenas definir
um ORG 1000h, e acessar os segmentos apagando e escrevendo na
memória FLASH.

Obrigado a quem puder ajudar.

Fernando Gibim

Edited by - gibim on 11/12/2005 19:26:01

Edited by - gibim on 11/12/2005 19:26:43

Fabio Pereira
Conselheiro


Brazil
2205 Posts Posted - 12/12/2005 : 09:20:14
--------------------------------------------------------------------------------
Se você utilizar a área da memória de informação, isso não será necessário.

Até +

Fábio Pereira
ScTec - Automação e Projetos Especiais
www.sctec.com.br


gibim
Professor


Brazil
275 Posts Posted - 21/12/2005 : 15:43:58
--------------------------------------------------------------------------------
Pessoal, olha o que eu consegui fazer.

__no_init unsigned long int variavel1 @ 0x1000;
__no_init unsigned int variavel2 @ 0x1004;


Tentei inicializar seus valores, mas não consegui.

Com isso:


#define SEGA 0x1080;
const int variavel1 @ "SEGA" = 3;


Com isso é possível alocar espaços específico na memória também, mas ainda não consegui gravar os dados em tempo de montagem, na hora que compila.

Para endereços quaisquer, o problema é avisar o Linker para não subscrever se o local for fora
da memória de dados. No meu caso MSP430F149 indo de 0x1000 até 0x10FF.

Veleu


Jaguar Aeroespacial LTDA
LEIN - Lab. Eng. Inercial

Fabio Pereira
Conselheiro


Brazil
2205 Posts Posted - 21/12/2005 : 18:19:31
--------------------------------------------------------------------------------
É bem fácil:

1- Altere o arquivo do linker para que o mesmo não utilize a área de FLASH desejada. Insira também uma nova declaração para criar um segmento alocando a memória reservada (no caso, 0xE000 a 0xE1FF):


// -------------------------------------------------------------------// ROM memory (FLASH)// -------------------------------------------------------------------// Code//-Z(CODE)CSTART=E000-FFDF//-Z(CODE)CODE=E000-FFDF-Z(CODE)CSTART=E200-FFDF-Z(CODE)CODE=E200-FFDF// Constant data//-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=E000-FFDF-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=E200-FFDF-Z(CONST)FLASH_DATA=E000-E1FF

2- No fonte em C, basta criar uma matriz de constantes e fixá-la no segmento criado anteriormente:


#pragma location = "FLASH_DATA"const unsigned long int curva[] = { 1,2,3,4,5,6};

Até +

Fábio Pereira
ScTec - Automação e Projetos Especiais
www.sctec.com.br


gibim
Professor


Brazil
275 Posts Posted - 13/01/2006 : 16:25:47
--------------------------------------------------------------------------------
Muito legal esta solução. Vou utiliza-lá. Obrigado.

Jaguar Aeroespacial LTDA
LEIN - Lab. Eng. Inercial

Shagrath81
Candidato



12 Posts Posted - 06/06/2006 : 02:24:05
--------------------------------------------------------------------------------
Estou precisando deste mesmo esquema em um projeto, mas fiquei com algumas duvidas.


1- nesta declaração: const unsigned long int curva[] = { 1,2,3,4,5,6}; sou obrigado a utilizar um "long int" ou posso utilizar um "unsigned char"? (preciso de blocos de 8 bits, pelo que entendi parece que sim.)

2- sou obrigado a utilizar toda memoria que reservei ou podem existir espaços em branco?

3- Posso colocar
#pragma location = "FLASH_DATA"
const unsigned long int curva[] = { 1,2,3,4,5,6};
no inicio do código nas declarações? e continuar em seguida o restante do programa?
estou perguntando isso pois tenho medo da possibilidade de redirecionar o "main()" para algum lugar "caótico!"

Valeu pessoal,
Abraço



andre_teprom
Mestre


Brazil
754 Posts Posted - 06/06/2006 : 08:35:05
--------------------------------------------------------------------------------
Gibim,

1- O Set de instruçoes assembly do MSP430 permite otimizar a utilizacao de memoria no uC, mesmo quando voce faz acessos de 8 bits nesse chip de 16 bits ( vide datasheet ). Eu já armazenei dados - em RAM - de 8 bits, declarando como unsigned char . Por aí entao, dá para supor que o mesmo possa ser feito em Flash ( const ).

2- Os espaços em branco continuarao alocados para esta variável. Só estarao disponíveis se voce declarar esta variável localmente numa função, ou se utilizar o recurso de alocacao dinamica de memoria.

3- Também nao sei...

at+

------------------------
ANDRE CASTRO
Teprom Consult. Assess. Tec. Ltda.
www.teprom.eng.br

"Palavra quando acêza, não queima em vão, deixa uma beleza posta, em seu carvão." ( Quinteto Violado )

Fabio Pereira
Conselheiro


Brazil
2205 Posts Posted - 06/06/2006 : 08:59:20
--------------------------------------------------------------------------------
1- O meu exemplo utilizando long int foi apenas isso: um exemplo. Para quem conhece MSP430, sabe que a memória é mapeada em bytes e portanto, pode ser programada desta forma. Sendo assim, não haveria problemas em declarar a variável como sendo char ou int;

2- Obrigado você não é, mas a memória que você não utilizar irá permanecer sem uso, já que a diretiva do linker impede a sua utilização para código;

3- Pode sim.

Até +



Fábio Pereira
ScTec - Automação e Projetos Especiais
www.sctec.com.br


Shagrath81
Candidato



12 Posts Posted - 11/06/2006 : 23:02:04
--------------------------------------------------------------------------------
Obrigado Fabio e Gibim,

No dia mesmo que perguntei, testei e tudo funcionou.

Usei unsigned char e rodou direitinho.

Abraços.
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

Voltar para Texas

Quem está online

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

cron

x