depende da arquitetura. eu nao posso falar muito sobre o ARM pq nao conheco a fundo, mas me parece muito similar e deve ser a mesma coisa.
em termos de organizacao, o coldfire parece muito com um PC, onde memoria ROM e RAM podem estar em qq posicao arbitraria dentro de um espaco de 4GB. mas diferente de um PC, nao existe espaco separado para IO e todo o IO tem que estar dentro deste mesmo espaco de 4GB.
no caso do reference design do MCF52277, usaram a seguinte divisao:
- 0x00000000 a 0x01000000: 16MB de memoria FLASH paralela externa
- 0x40000000 a 0x44000000: 64MB de memoria SDRAM externa
- 0x80000000 a 0x8FFFFFFF: 256MB reservado para memoria interna (128KB de SRAM estao disponiveis)
- 0xF0000000 a 0xFFFFFFFF: 256MB reservado para IO
note que para o coldfire eh indiferente a memoria ser interna ou externa. e alem disso existem as caches on-chip, mas sao transparentes, ou seja, vc ativa e ela vai acelerar a execucao por um fator de ateh 10x, sem que no entanto vc tenha que fazer algo alem de ativar no lugar correto... tem que tomar cuidado: vc nao pode cachear os espacos de IO, senao tudo para de funcionar! :)
alem disso, existe uma serie de chip-selects com enderecos base programaveis, que podem estar em qq espaco nao utilizado e podem ativar qq tipo de dispositivo de memoria (FLASH ou SRAM) ou IO.
do ponto de vista de codigo, tipicamente compila-se o codigo usando enderecamento absoluto, o que significa que durante a compilacao eh utilizado um linker script e este contem o mapa conectando variaveis aos respectivos enderecos. normalmente eh necessario indicar ao compilador o endereco onde ira ficar os blocos de codigo, dados, stack e IO.
note que a unica diferenca entre rodar o codigo em FLASH ou SDRAM/SRAM eh apenas a necessidade de se carregar o codigo de algum lugar, o que nao eh necessario na FLASH.
no caso especifico do uboot e uclinux, por exemplo, o uboot eh compilado para rodar no endereco absoluto 0x00000000, portanto roda direto da FLASH paralela. o uboot consome algo em torno de 128 a 256KB e eh comum se seguir a ele uma area de FLASH com filesystem, q eh vista como um disco e tem capacidade RW. seguindo isso, vem a imagem compactada do uclinux.
normalmente a imagem compactada do uclinux divide-se por sua vez em dois blocos, um com o kernel e outro com um filesystem sem capacidade RW. outra variacao eh colocar essa imagem com o kernel e filesystem em um cartao MMC. isso indifere, pois a imagem eh copiada na SDRAM, o que significa que o kernel esta compilado para o endereco absoluto 0x40000000. as imagens costumam ter entre 3 e 8MB e isso varia conforme a quantidade de tralhas que vc coloca dentro.
daih vem as aplicacoes que estao no filesystem. normalmente eles nao sao compilados em nenhum endereco especifico. ao inves disso usam enderecamento relativo ou linkagem dinamica, o que significa que o uclinux eh quem vai linkar em tempo de execucao o codigo para o endereco onde ele vai ser executado. note que o uboot e kernel do uclinux sao binarios linkados, enquanto os aplicativos q vao no filesystem sao binarios nao-linkados, normalmente em formato elf.
bom, isso eh como a coisa funciona. do ponte de vista de aplicacao, na pratica, vc vai ver tudo mais ou menos como se estivesse em um PC, sendo que a FLASH sera tratada mais ou menos como se fosse um HD. no caso do boot via SPI, imagino que o coldfire tenha que copiar um bloco inicial para a SRAM interna para comecar a rodar, mas isso eh um processo meio automatico.
rcakto escreveu:so uma pergunta que até hj eu nao sei a resposta... o codigo para memorias são feitos em linguagem especial, uso de um programa especial ou simplesmente programe como sempre e coloca a porcaria do .HEX dentro dela??