Ponteiro para função em "large-code" com XC16

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Ponteiro para função em "large-code" com XC16

Mensagempor barboza » 04 Out 2013 02:08

Pessoal, estou portando um código do PIC18 para PIC24 e com o crescimento do projeto, tive que habilitar no compilador "large-code" quando o código se tornou maior que 64K.

Porém, existem no código alguns ponteiros para funções que deixaram de funcionar após a opção large-code, pois os ponteiro são do tipo 16 bits e não conseguem mais endereçar corretamente.

The MPLAB XC16 C Compiler fully supports pointers to functions, which allows functions
to be called indirectly. Function pointers are always 16 bits wide.
In the small code model (up to 32 kWords of code), 16-bit wide function pointers can
access any function location. In the large code model, which supports more than 32
kWords of code, pointers hold the address of a GOTO instruction in a lookup table.
These instructions are able to reach any memory location, but the lookup table itself is
located in the lower program memory, thus allowing the pointers themselves to remain
as 16-bit wide variables.


Tenho um tipo definido, uma variável para guardar o ponteiro e depois chamo a função usando o ponteiro.

Código: Selecionar todos
typedef BOOL (*pp_timers_callback) (void);

pp_timers_callback pp_cb;

pp_cb = MinhaFuncao;

if ((p_cb())
{
   xyz;
}


Alguém tem alguma luz?

Já pesquisei e li o manual do compilador que tem vários identificadores e qualificadores de tipo, mas ainda não conseguir colocar para rodar.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Ponteiro para função em "large-code" com XC16

Mensagempor andre_luis » 04 Out 2013 08:11

Declarando como far não resolveria ?


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Ponteiro para função em "large-code" com XC16

Mensagempor barboza » 04 Out 2013 09:10

andre_teprom escreveu:Declarando como far não resolveria ?


+++


Pode ser que funcione, vou testar e lhe digo mais tarde.

2.5.3 Far Objects and Functions
The __far qualifier may be used to indicate that variables or functions may be located
in ‘far memory’. Exactly what constitutes far memory is dependent on the target device,
but it is typically memory that requires more complex code to access. Expressions
involving far-qualified objects may generate slower and larger code.
Use the native keywords discussed in the Differences section to look up information on
the semantics of this qualifier.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Ponteiro para função em "large-code" com XC16

Mensagempor barboza » 04 Out 2013 22:39

barboza escreveu:
andre_teprom escreveu:Declarando como far não resolveria ?


+++


Pode ser que funcione, vou testar e lhe digo mais tarde.

2.5.3 Far Objects and Functions
The __far qualifier may be used to indicate that variables or functions may be located
in ‘far memory’. Exactly what constitutes far memory is dependent on the target device,
but it is typically memory that requires more complex code to access. Expressions
involving far-qualified objects may generate slower and larger code.
Use the native keywords discussed in the Differences section to look up information on
the semantics of this qualifier.



Esta M também não rodou......
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Ponteiro para função em "large-code" com XC16

Mensagempor vtrx » 05 Out 2013 08:18

Ja tentou declarar a variavel como 'extern'?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Ponteiro para função em "large-code" com XC16

Mensagempor andre_luis » 05 Out 2013 12:33

Qual é exatamente o erro que está ocorrendo ? De compilação ou de link ?


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Ponteiro para função em "large-code" com XC16

Mensagempor barboza » 05 Out 2013 12:51

andre_teprom escreveu:Qual é exatamente o erro que está ocorrendo ? De compilação ou de link ?


+++


link / execução.....

Cheguei a __psv__ definition, mas ainda não rodou também.

O estranho é que se defino os pointeiros de forma estatica, funciona:

Código: Selecionar todos
pp_timers_callback const pp_cb[EN_TIMER_ID_END] = {
      p_timer_wdt_cb,
      p_output_timer_cb,
      p_input_timer_cb,
      p_app_StackTask_cb,
      p_app_state_machine_cb

};


Assim, consigo acessar e rodar os ponteiros (para funções);

Mas se estão em RAM e dinâmicos, não funcionam.

Código: Selecionar todos
pp_timers_callback pp_cb2[EN_TIMER_ID_END];


Pelo o que entendi lendo a documentação do compilador / PIC, ele faz saltos "largos" usando uma tabela com os gotos...

The MPLAB XC16 C Compiler fully supports pointers to functions, which allows functions
to be called indirectly. Function pointers are always 16 bits wide.
In the small code model (up to 32 kWords of code), 16-bit wide function pointers can
access any function location. In the large code model, which supports more than 32
kWords of code, pointers hold the address of a GOTO instruction in a lookup table.
These instructions are able to reach any memory location, but the lookup table itself is
located in the lower program memory, thus allowing the pointers themselves to remain
as 16-bit wide variables.
As function pointers are only 16-bits wide, these pointers cannot point beyond the first
64K of FLASH. Should the address of a function that is allocated beyond the first 64K
of FLASH be taken, the linker will arrange for a handle section to be generated. The
handle section will always be allocated within the first 64K. Each handle provides a
level of indirection which allows 16-bit pointers to access the full range of FLASH. This
operation may be disable with the --no-handles linker option.


Só não achei muita explicação sobre o "handles"
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Ponteiro para função em "large-code" com XC16

Mensagempor barboza » 05 Out 2013 18:39

Não me pergunte como, mas esta M voltou a funcionar como deveria e esperado.....
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Ponteiro para função em "large-code" com XC16

Mensagempor andre_luis » 05 Out 2013 18:41

Apenas por curiosidade, funcionou na versão original do código, ou com as modificações sugeridas ?


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: Ponteiro para função em "large-code" com XC16

Mensagempor barboza » 05 Out 2013 18:44

andre_teprom escreveu:Apenas por curiosidade, funcionou na versão original do código, ou com as modificações sugeridas ?


+++


Com o original..... Fiquei 3 dias pesquisando soluções, testando e comparando modificações, hoje testei uma opção de compilação com o código original e funcionou, ai retirei a opção para confirmar que era ela e também funcionou.... E agora José???
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Ponteiro para função em "large-code" com XC16

Mensagempor andre_luis » 06 Out 2013 07:08

É....trabalhar com ponteiros exige certos cuidados.

Pode ser que agora nessa sua última simulaçãp voce tenha usado uma entrada de dado diferente de modo que o índice do ponteiro não esteja apontando mais para algma região que represente um acesso indevido.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

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

x