Execute instruções da RAM em um microcontrolador amigo do hobby

12

Um dos meus projetos se beneficiaria muito com a capacidade de executar um programa que não é armazenado no microcontrolador (mas armazenado em um cartão SD).

Então, estou procurando um dispositivo que me permita carregar o código do cartão SD na RAM e depois executá-lo. Atualmente, só tenho o programador que acompanha o PicKit2, portanto, prefiro ficar com os PICs.

Alguém sabe quais, se houver, PICs podem fazer isso? Se nenhum PIC é capaz disso, então quais são os microcontroladores diferentes que funcionariam para isso? De preferência os que estão disponíveis em um pacote compatível com a placa de ensaio.

Ponkadoodle
fonte
2
hein? ... Para que exatamente você precisa executar a partir do ram? e o que você quer dizer com 'estático'? você não está realmente tentando escrever código de modificação própria, está? Você está falando sobre a falta de alocação dinâmica de memória? aka no malloc?
Mark
2
@ Mark Quero poder carregar um programa de um dispositivo externo, como um cartão SD, e executá-lo. Vou tentar explicar melhor no meu post.
Ponkadoodle 20/10/10
2
pegadinha, o único PIC que eu conheço que permitiria isso é um PIC32. A menos que você faça algo louco, como copiá-lo do cartão SD para o flash, o que consumirá ciclos de flash bem rápido se você alternar com frequência. A maioria dos uC pequenos de 8/16 bits é fortemente segmentada entre o espaço de dados (memória ram) e o programa (flash) e não permite que o contador de programas endereça memória ram (arquitetura Harvard, sem proteção de memória, etc.).
Mark

Respostas:

5

Existem alguns PICs que permitem adicionar memória de programa externa. Eu nunca fiz isso, mas as Notas de Aplicação AN869 e AN778 têm mais informações sobre como implementar a memória externa.

Daniel Grillo
fonte
11

Outra opção a considerar é o uso de uma linguagem interpretada para seus programas armazenados no cartão SD. Dessa forma, o processador não está executando o código de máquina lido no cartão, apenas o trata como dados.

Essa abordagem oferece flexibilidade ao custo da velocidade.

Há muitas opções para escolher: Pesquisa de intérpretes / compiladores de idiomas de alto nível para microcontroladores

Toby Jaffey
fonte
1
Role seu próprio DSL. Esta opção me atrai ao máximo todas as soluções sugeridas.
Amos
6

Como já foi dito, os PICs (que não sejam o PIC32) não podem fazer isso. Você provavelmente terá que ir para os processadores maiores em qualquer família ou para um processador com um barramento de memória externo, pois a maioria dos microcontroladores possui recursos de RAM muito limitados.

Os processadores MSP430 podem executar código a partir de seu espaço em RAM, mas você precisará de algo como o F5438 com 16k de espaço em RAM - executar código em 128 bytes não é realmente uma opção!

Se um processador tiver um barramento externo, você poderá colocar a RAM no espaço de código. Pode ser necessário adicionar alguma lógica extra para mapear a RAM em duas regiões de memória se a arquitetura do processador não permitir que dados sejam gravados na memória de execução.

Eu executei o código da RAM em um sistema baseado em 8051, mas isso significava que a RAM tinha que ser mapeada no espaço de memória EXTERN para programação e, em seguida, novamente no espaço CODE para execução. O programa carregador / monitor lidou com a troca e o carregamento do banco de memória. Por favor, não peça o código - fiz isso há cerca de 30 anos e está perdido há muito tempo (e escrito em PL / M-51)

uɐɪ
fonte
5

Nenhum PIC de faixa baixa e média pode executar a partir da RAM devido à sua arquitetura de memória.

Qualquer CPU baseada em ARM deve executar a partir da RAM. Embora eles tendem a estar em pacotes smd, existem alguns módulos de tamanho 'DIP' que já possuem o microcontrolador carregado. Dê uma olhada no mbed ou no LPCXpresso, por exemplo. Ambos vêm com um gerenciador de inicialização ou, no caso do LPCXpresso, uma interface de depuração junto com compiladores gratuitos.

Se você preferir ficar com micros simples de 8 bits, talvez considere algo da família de freescale HCS08. Eles podem ser executados a partir da RAM e existe uma versão com código limitado do codewarrior IDE e C compilador disponível gratuitamente.

Tenho certeza de que o MPS430 também deve ser capaz de fazer isso, mas nunca fiz isso sozinho.

Clint Lawrence
fonte
Na verdade, o mbed recebe binários, copiando-os para a unidade flash incorporada e sendo redefinidos. Ele aparece como uma unidade flash quando conectado à porta USB de um computador. Se você pode definir um método para usar a unidade flash em vez do cartão SD ou configurá-lo para que um binário do cartão SD seja copiado automaticamente para a unidade flash e uma redefinição seja executada, você pode estar com sorte. O mbed não requer um programador de hardware.
Amos
5

O Propeller carrega seu programa a partir de armazenamento externo.

joeforker
fonte
1
Normalmente, o chip da hélice é iniciado a partir de um 32K EEPROM (24LC256), mas aqui é uma maneira de arrancar a partir de um cartão SD em vez disso: gadgetgangster.com/news/45-designer-news/...
tcrosley
3

Lembro-me de ler sobre um gerenciador de inicialização para AVRs que reimprimiria o chip com um arquivo .hex (presumivelmente) de um cartão SD. Não consigo encontrar a fonte original, mas essa pesquisa no Google mostra alguns hits interessantes. Sim, eu sei que isso é AVR e não PIC, mas você pode achar útil se a coisa PIC não funcionar.

blalor
fonte
+1 para o gerenciador de inicialização PIC .
Davidcary
3

Como outros pôsteres observaram, você não pode executar a partir da RAM em um PIC de 8 ou 16 bits, porque eles usam uma arquitetura Harvard (código separado e espaços de dados). Se é prático ou não carregar um programa em um cartão SD e atualizá-lo para codificar a memória, depende de quantas vezes você fará isso.

Se você está tentando criar um ambiente dinâmico como um sistema operacional que sobrepõe programas constantemente, então não. Mas, no meu caso, eu tenho um programa que carrega drivers conforme necessário em um cartão SD de 2 GB. O PIC24FJ256GB110 possui um mínimo de 10.000 ciclos de apagamento / gravação. Mesmo que isso fosse feito cinco vezes por dia, o flash duraria no mínimo 5 anos e meio.

(Nota: o valor de 10.000 é o mínimo. A resistência típica dos ciclos de apagamento / gravação pode ser cinco vezes maior - portanto, se você estiver desenvolvendo, provavelmente poderá repassar um processador 140 vezes por dia - a cada 3 1/2 minutos por oito horas - e ainda pode durar um ano.)

tcrosley
fonte
2

Na minha escola, usamos processadores HC11 ou HC12 com RAM externa para carregar e executar programas em ... mas esqueci o nome das placas / kit :( De qualquer forma, os MCUs da Freescale HC (S) endereçam a RAM e a ROM de forma idêntica , para que você possa carregar o código na RAM e executá-lo.

Em uma fila blalor, a melhor solução pode ser apenas adicionar um botão em sua placa que reflash o PIC dos dados armazenados em um cartão SD que você insere com um carregador de inicialização. Não consigo imaginar que tipo de código não caberia nos PICs maiores; se você tiver alguns dados estáticos (gráficos, texto, som), mantenha-os no armazenamento externo.

Nick T
fonte
1

Você provavelmente não pode alocar a partir da RAM, mas para o seu aplicativo você pode ter um pequeno carregador em flash que pode ler os dados do cartão SD no restante do flash. Eu usei essa abordagem com um chip flash controlado por SPI para permitir que o firmware fosse carregado a partir de um link sem fio e depois instalado depois de recebido completamente; Não consigo pensar em nenhum motivo específico para não funcionar com um cartão SD, embora um carregador de inicialização compatível com SD possa ocupar algum espaço.

supercat
fonte
Fiz algo semelhante para um dispositivo com alguns firmwares e propósitos ligeiramente diferentes: grave todos os arquivos no flash SPI externo (disponível em tamanhos muito maiores que a maioria dos microcontroladores) e reflita o controlador com uma das imagens com o carregador de inicialização se um botão for pressionado durante a redefinição.
22611 Kevin Vermeer
0

Alguns microcontroladores permitem fazer isso, parece que não é a foto. o que você gostaria de fazer é ter um gerenciador de inicialização que use spi para ler do cartão sd, copie o programa, que provavelmente quer ser um nome de arquivo conhecido ou codificado, provavelmente no diretório raiz, analise esse arquivo no ram e depois ramifique para o programa em ram. Os controladores baseados em ARM certamente permitirão que você faça algo assim.

Uma alternativa seria fazer com que o gerenciador de inicialização leia o cartão sd pelo spi e, em vez de copiar para ram e gravar ramificações em uma parte do flash. Provavelmente deseja ter um botão se o botão for pressionado ao ligar ou redefinir e carregar um novo programa a partir do cartão SD, caso contrário, se a assinatura ou a soma de verificação parecerem boas nessa parte carregável do flash e depois no ramo de inicialização para essa parte do flash. Ou talvez, se o cartão SD estiver presente, carregue-o, caso contrário, ramifique para a parte carregável do flash. Pode usar esse método com base em braço e com base em avr, possivelmente até com base em foto, mas minha experiência com foto é datada. msp430 eu assumiria também. Basicamente, se você pode reprogramar partes do flash a partir do qual é executado, a partir do próprio processador do microcontrolador,

old_timer
fonte
Hmmm, na verdade eu não programei um avr a partir do avr, desculpe pelo over serial de um host. Apresenta uma terceira solução que você vê muitas placas de hobby baratas fazendo ... use dois microcontroladores. Nesse caso, um poderia manter o outro em redefinição, ler o cartão SD, programar o outro micro, via serial ou outro, e liberar redefinir o outro micro. As placas hobby / eval costumam ter um micro para a interface usb e geralmente marcam para o outro.
old_timer