Porque no CCS não aceita isso?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Porque no CCS não aceita isso?

Mensagempor HC908 » 04 Nov 2007 20:38

por que ele não aceita isso?
Porque o ponteiro não acessar uma constante, no CCS ?


void mandar_msg(const char *DATA,byte tamanho)
{


}


void main(void)
{

mandar _msg((char*)"Teste",5);


}
Editado pela última vez por HC908 em 04 Nov 2007 23:30, em um total de 2 vezes.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor zielpunkt » 04 Nov 2007 21:58

Ponteiro é uma variável que contém o endereço de uma determinada variável, posicionada na memória, Deus sabe onde. Mas o teu ponteiro sabe onde. Portanto, como uma variável ponteiro poderia ter um valor fixo (constante), seja no CCS ou em qualquer outro compilador C ? (Se eu estiver falando bobagem, podem me escrachar, mas me expliquem porque eu quero aprender).

Quando declara um ponteiro, diferentemente de outras declarações de variáveis, você está informando o tipo de variável para a qual ele vai apontar, mas como ele indica um endereço de memória, o seu "tipo" é conhecido internamente pelo compilador em função do "tamanho" desses endereços para onde vai apontar. Como ele pode apontar para qualquer endereço de memória (em função de como você o utiliza), ele não pode ser uma constante.

Outra coisa: este trecho de código que você postou é meio estranho pra mim. Confesso que não entendi a sua passagem dos parâmetros pra função. Aquele (char*)...Se isso é um ponteiro para uma determinada função(!), não seria (*char)?

Abço.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor HC908 » 04 Nov 2007 23:07

Compilo este codigo no compilador da freescale e no da IAR e da certo. ou seja ele guarda a string na flash do dispositivo e imprimir com ajudar da função void mandar _msg(const char *DATA,byte tamanho)
. Agora no CCS não aceita isto. O que eu quero na verdade e guardar a string na flash do dipositivo e com ajuda do ponteiro imprimir esta string.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor Maurício » 04 Nov 2007 23:19

Pode não ser isso, mas, experimenta juntar as palavras que estão separadas pelo sublinhado:

void mandar _msg

por

void mandar_msg

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor HC908 » 04 Nov 2007 23:30

valeu amigo. + não é isso não. o compilador imformar
Attempt to create a pointer to a constant

ou seja o ponteiro não consegue apontar para uma constante
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor Maurício » 04 Nov 2007 23:50

É.... lamento!

O Keil aceita esse tipo de codificação, sem problemas.
Vc já experimentou criar uma string e passar a string pra função usando CONST ?

Desse jeito aqui:

char string [ ] = "Teste";

mandar_msg( string, strlen(string));

Se não funcionar, deve realmente ser coisa do CCS.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Fábio Pereira » 05 Nov 2007 08:59

Vou dar o meu pitaco:

A questão real é: PICs são máquinas Harvard e constantes não são armazenadas na RAM e sim na FLASH (que é memória de programa).

O CCS espera que o seu ponteiro aponte para uma área da memória de dados (RAM), o que não é o caso.

A solução seria você escrever algum tipo de função para conversão intermediária ou copiar a sua constante da FLASH para a RAM em tempo de execução.

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

Re: Porque no CCS não aceita isso?

Mensagempor Rodrigo_P_A » 05 Nov 2007 09:24

Escreve assim que funciona:

void mandar_msg(char *DATA,byte tamanho)
{


}


void main(void)
{

mandar _msg("Teste",5);


}

já usei assim, e funciona

cada compilador tem suas particularidades mesmo.
---
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor ze » 05 Nov 2007 09:29

o lance do const tem sentido. veja como envio 1 string para uma display lcd 16x2:
Código: Selecionar todos
void lcd_write(unsigned char c)
{
tlcd=0;//PORTC é usada na int
while(tlcd<2); //garante que aciona display apenas FORA da int

PORTC = (PORTC & 0x0f) | (c & 0xf0);
LCD_STROBE;
c <<= 4;
PORTC = (PORTC & 0x0f) | (c & 0xf0);
LCD_STROBE;
delay(500);
}
/**********************************************************************/
void msgdsp(unsigned char l,unsigned char c,const char * s)
{
LCD_RS=0;
lcd_write(l+c);  //posiciona cursor
LCD_RS=1;
while(*s)
lcd_write(*s++);
}
Código: Selecionar todos
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Porque no CCS não aceita isso?

Mensagempor HC908 » 05 Nov 2007 09:49

Alou rodrigo assim tambem não funcionou. Fiz d ojeito que fabio mandou fazer. eu leio a flash e jogo na ram

[quote="Rodrigo_P_A"]Escreve assim que funciona:

void mandar_msg(char *DATA,byte tamanho)
{


}


void main(void)
{

mandar _msg("Teste",5);


}

já usei assim, e funciona

cada compilador tem suas particularidades mesmo.[/quote
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Re: Porque no CCS não aceita isso?

Mensagempor LeandroPIC » 05 Nov 2007 12:44

HC908 escreveu:por que ele não aceita isso?
Porque o ponteiro não acessar uma constante, no CCS ?


void mandar_msg(const char *DATA,byte tamanho)
{


}


void main(void)
{

mandar _msg((char*)"Teste",5);


}


Porque CCS não presta!!! hahaha

Descupe não resisti.....

tentei fazer isso no compilador Hitech, e funcinou perfeitamente.


Para que é isso afinal. se for para mandar uma string para a serial ou display use o Printf, esse o CCS aceita.
Avatar do usuário
LeandroPIC
Byte
 
Mensagens: 163
Registrado em: 06 Jul 2007 12:19

Re: Porque no CCS não aceita isso?

Mensagempor Maurício » 05 Nov 2007 14:04

LeandroPIC escreveu:Para que é isso afinal. se for para mandar uma string para a serial ou display use o Printf, esse o CCS aceita.


Porque passar um ponteiro para uma função utilizando o modificador CONST, é a única maneira de garantir que aquela variável não será alterada pela função.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor ze » 05 Nov 2007 14:08

apaguei...
abraço...
Editado pela última vez por ze em 07 Nov 2007 14:06, em um total de 1 vez.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: Porque no CCS não aceita isso?

Mensagempor LeandroPIC » 06 Nov 2007 11:28

Maurício escreveu:
Porque passar um ponteiro para uma função utilizando o modificador CONST, é a única maneira de garantir que aquela variável não será alterada pela função.

[]'s


Desculpe não entendi.....!!!!
Avatar do usuário
LeandroPIC
Byte
 
Mensagens: 163
Registrado em: 06 Jul 2007 12:19

Mensagempor Maurício » 06 Nov 2007 13:44

Parâmetros passados para uma função em C, são passados por valor, ou seja, C copia o valor dos dados e passa a cópia dos dados para a função.
Estes dados de entrada podem ser alterados pela função mas permanecem inalterados fora dela.

Quando vc passa um ponteiro para uma função, a função pode modificar o conteúdo que o ponteiro aponta. É uma característica do C.
Se vc usa o modificador CONST, como no caso do HC908, vc força a linguagem a NÃO ALTERAR o conteúdo de memória que aquele ponteiro aponta. Vc passa um dado da memória, como se fosse uma constante. Mesmo através de ponteiros.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Próximo

Voltar para PIC

Quem está online

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

cron

x