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.