2138 + Interrupção

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Mensagempor lrfad2 » 22 Nov 2006 08:44

rs... "Depois que inventaram a máquina de costura, não duvido de mais nada ..." essa foi a melhor!

Eu não sei se sou eu que esta muito enferrujado no C, mas esses lances de #include dá muita confusão. (levando em conta vária bibliotecas .c .h etc)
Pelo menos o que entendo é que o compilador substitui o #include "teste.h" pelas linhas de código do arquivo teste.h

Mas sempre dá subrotina desconhecida ou subrotina duplicada. Alguem tem alguma dica de como organizar/ estruturar o programa para não acontecer isso? (Acho que não tem muito a ver, mas estou utilizando o IAR)
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor lrfad2 » 22 Nov 2006 09:49

então Gibim, apesar de não acreditar que resolveria o problema, alterei a configuração do meu projeto (project -> options Alt+F7) igual ao programa que vc enviou, e ai compilou certo.
Só não consegui compreender o estava faltando configurar para dar o tal problema de "linkar". Voltei uma a uma, todas as configurações que havia feito e agora não dá mais problema.

A pergunta é: Em qual ponto das configurações do projeto eu tenho que mexer para conseguir com que o lpc2xxx_cstartup.s79 enxergue o meu arquivo de interrupção?
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor gibim » 22 Nov 2006 14:16

Olha, neste arquivo ***Startup.s79 o linker enxerga os vetores de interrupção e automaticamente desvia os ponteiro de interrupção para aonde vc configurou neste ponto

(...)
org 0x18
irq_handler ldr pc,=irq_handler
org 0x1c
fiq_handler ldr pc,=fiq_handler

; Constant table entries (for ldr pc) will be placed at 0x20
; org 0x20
(...)

Acontece que para o Linker( É um programa que liga objectos gerados por um compilador, formando assim o ficheiro executavel final.) você tem que exportar os simbolos, então estas linhas são necessárias.

(...)
MODULE
COMMON INTVEC:CODE:NOROOT(2)
PUBLIC __program_start
EXTERN ?cstartup
EXTERN FIQ_Interrupt
EXTERN IRQ_Handler

; EXTERN undef_handler, swi_handler, prefetch_handler
; EXTERN data_handler, irq_handler, fiq_handler
(...)

Agora é possível montar seu executável.

Outra coisa embaçada é a respeito das opções de configuração do compilador e o IAR... Você tem que prestar muita atenção nisto. Qualquer parâmetro mal configurado vai dar uns paus muito loucos.

Também não sei lhe explicar porque estava dando erro de linkagem, mas esses problemas são místicos para a maioria da população, inclusive pra mim.

Abraços e boa sorte
Avatar do usuário
gibim
Byte
 
Mensagens: 117
Registrado em: 08 Nov 2006 21:40
Localização: Londrina - PR

Mensagempor lrfad2 » 22 Nov 2006 16:04

Um desses paus místicos, eu consegui achar aonde é.

Quando aparece inconsistência de memória, (ou seja era para ter por exemplo 0x23 na posição de memória 0x02 e tem 0xFF) é por causa do flash loader.
Para acessá-lo vá em Project->Options;
selecione a categoria Debugger e a targeta download;
selecione a opção use flash loader(s), depois click no botão Edit.
Exclua a opção default e selecione o flash loader de 512K (para o caso do LPC2138).
É só colocar o caminho do FlashPhilipsLPC512k.d79. (o próprio IAR já tem esse arquivo)
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor lrfad2 » 22 Nov 2006 16:25

Aparentemente esse flash loader, carrega o programa na flash.
Se for isso, pq qdo resetamos o hardware o programa já não roda automaticamente.
Temos que utilizar, obrigatoriamente, o Flash utility?
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor gibim » 22 Nov 2006 17:22

Sobre o Flash Loader é como se fosse uma rotina, que é montada na RAM para fazer a programação da FLASH do ARM, isso porque existem duas opções **RAM.XCL e **FLASH.XCL (não lembo se é esse o nome exato, verifico depois).

Acontece que ambos os "Flash loader" são montados na RAM, e sua função é receber o programa a ser armazenado na memória do microcontrolador, podendo ser gravado tanto na RAM quanto na FLASH (escolhido pelo arquivo acima **.xcl).

Oque deve estar acontecendo que você está selecionando o arquivo de gravação na RAM, como a memória funciona com os endereçamentos 0x00000000 a 0xFFFFFFFF, a diferença, além do procedimento de gravação, é o segmentos a ser salvo seu programa.

Lembre-se que se a RAM tem 32kb, seu programa será limitado por isso menos a quantidade de bytes do flash loader. No caso de ser armazenado na RAM.
Avatar do usuário
gibim
Byte
 
Mensagens: 117
Registrado em: 08 Nov 2006 21:40
Localização: Londrina - PR

Mensagempor lrfad2 » 23 Nov 2006 11:42

Havia imaginado isso e por isso achei estranho. Estou utilizando o arquivo LPC2138_flash.xcl. Pra te falar a verdade eu não sei aonde ele está enfiando o código, visto que o mesmo já tem + do que 32K (capacidade da RAM) e não está na flash (ou pelo menos não roda).

Uma outra dúvida. Como eu posso declarar uma variável comum (global) a todas bibliotecas e o código principal sem dar o problema de variável redeclarada ou inexistente?
Avatar do usuário
lrfad2
Byte
 
Mensagens: 152
Registrado em: 19 Out 2006 17:35
Localização: São Paulo

Mensagempor gibim » 29 Nov 2006 11:41

Acho que uma boa dica é remover declaração de variáveis de dentro de *.h OBS: outros podem discordar, mas esta prática é um absurdo!;

Usar "volatile unsigned int minhaVariavel";

Declarar fora das funções suas variáveis;

nos arquivos *.h incluir um marcador para que o compilador não faça chamadas recursivas de seus *.h;

Exemp:

#ifndef MATEMATICA_ARM_H
#define MATEMATICA_ARM_H

(seus defines e declaração de funções)

#endif


-> Se mais dúvidas persistirem, diga seu problema exato.

Falow Galera
Avatar do usuário
gibim
Byte
 
Mensagens: 117
Registrado em: 08 Nov 2006 21:40
Localização: Londrina - PR

Anterior

Voltar para ARM

Quem está online

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

x