Выполнять инструкции из ОЗУ в дружественном для микроконтроллера

12

Один из моих проектов очень выиграл бы от возможности запуска программы, которая не хранится в микроконтроллере (но вместо этого хранится на SD-карте).

Итак, я ищу устройство, которое позволит мне загрузить код с SD-карты в ОЗУ, а затем выполнить код из ОЗУ. В настоящее время у меня есть только программатор, который поставляется с PicKit2, поэтому я бы предпочел остаться с PIC.

Кто-нибудь знает, какие, если таковые имеются, PIC могут сделать это? Если никакие PIC не способны на это, то какие микроконтроллеры будут работать для этого? Предпочтительно те, которые доступны в совместимом макете.

Ponkadoodle
источник
2
да? ... Что именно вам нужно выполнить из барана? и что вы подразумеваете под «статичным»? Вы на самом деле не пытаетесь написать самоизменяющийся код? Вы говорите об отсутствии динамического выделения памяти? иначе не маллок?
Отметьте
2
@ Марк Я хочу иметь возможность загрузить программу с внешнего устройства, такого как SD-карта, и выполнить ее. Я постараюсь объяснить лучше в моем посте.
Ponkadoodle
2
Гоча, единственный PIC, о котором я знаю, который позволил бы это, PIC32. Если вы не сделаете что-то сумасшедшее, например скопируете это с SD-карты на флэш-память, которая будет довольно быстро съедать циклы вспышки, если ваши программы переключения часто. Большинство маленьких 8/16-битных uC сильно сегментированы между пространством данных (ram) и программным (flash) и не позволяют счетчику программ обращаться к ram (архитектура Гарварда, отсутствие защиты памяти и т. Д.).
Марк

Ответы:

5

Есть несколько PIC, которые позволяют вам добавлять внешнюю память программы. Я никогда не делал этого, но Примечания по применению AN869 и AN778 имеют больше информации о том, как реализовать внешнюю память.

Даниэль Грилло
источник
11

Другой вариант, который следует рассмотреть, - это использование интерпретированного языка для ваших программ, хранящихся на SD-карте. Таким образом, процессор не выполняет машинный код, считанный с карты, он просто обрабатывает его как данные.

Такой подход дает вам гибкость за счет скорости.

Есть много вариантов на выбор: Обзор языковых интерпретаторов высокого уровня / компиляторов для микроконтроллеров

Тоби джеффи
источник
1
Сверните свой собственный DSL. Этот вариант привлекает меня больше всего из предложенных решений.
Амос
6

Как уже было сказано, PIC (кроме PIC32) не могут этого сделать. Вам, вероятно, придется обратиться к более крупным процессорам в любом семействе или к процессору с внешней шиной памяти, поскольку большинство микроконтроллеров имеют очень ограниченные ресурсы оперативной памяти.

Процессоры MSP430 могут запускать код из своего пространства ОЗУ, но вам понадобится что-то вроде F5438 с 16 КБ пространства ОЗУ - запуск кода в 128 байт на самом деле не вариант!

Если у процессора есть внешняя шина, вы можете поместить оперативную память в пространство кода. Возможно, вам придется добавить дополнительную логику для отображения ОЗУ в две области памяти, если архитектура процессора не позволяет записывать данные в память выполнения.

Я запустил код из ОЗУ в системе, основанной на 8051, но это означало, что ОЗУ должно было отображаться в пространство ВНЕШНЕЙ памяти для программирования, а затем обратно в пространство КОДА для выполнения. Программа загрузки / мониторинга обрабатывает переключение и загрузку банка памяти. Пожалуйста, не спрашивайте код - я сделал это около 30 лет назад, и он давно потерян (и написан на PL / M-51)

uɐɪ
источник
5

Ни один из PIC низкого и среднего диапазона не может выполняться из ОЗУ из-за их архитектуры памяти.

Любой процессор на базе ARM должен выполняться из оперативной памяти. Хотя они, как правило, находятся в пакетах smd, существует довольно много модулей размера DIP, в которых уже загружен микроконтроллер. Взгляните, например, на mbed или LPCXpresso . Они оба поставляются либо с загрузчиком, либо, в случае LPCXpresso, с интерфейсом отладки вместе с бесплатными компиляторами.

Если вы предпочитаете использовать простые 8-битные микросхемы, подумайте о чем-то из семейства freescale HCS08. Они могут выполняться из ОЗУ, и существует ограниченная по коду версия IDE и компилятора C, доступного бесплатно.

Я вполне уверен, что MPS430 должен быть в состоянии сделать это, но я никогда не делал это сам.

Клинт Лоуренс
источник
Mbed фактически получает двоичные файлы, копируя их на встроенную флешку и затем сбрасывая. Он отображается как флэш-накопитель при подключении к USB-порту компьютера. Если вы можете разработать метод использования флэш-накопителя вместо SD-карты или настроить его так, чтобы двоичный файл с SD-карты автоматически копировался на флэш-накопитель и выполнялся сброс, тогда вам может повезти. Mbed не требует аппаратного программиста.
Амос
5

Пропеллер загружает свою программу из внешнего хранилища.

joeforker
источник
1
Обычно чип Propeller загружается из 32K EEPROM (24LC256), но вместо этого есть способ загрузки с SD-карты: gadgetgangster.com/news/45-designer-news/…
tcrosley
3

Я помню, как читал о загрузчике для AVR, который перепрошивал чип с файлом .hex (предположительно) с SD-карты. Я не могу найти первоисточник, но этот поиск Google вызывает пару интересных хитов. Да, я знаю, что это AVR, а не PIC, но вам может пригодиться, если PIC не сработает.

blalor
источник
+1 за загрузчик ПОС .
Дэвидкари
3

Как отмечали другие авторы, вы не можете выполнять из ОЗУ на 8 или 16-битном PIC, потому что они используют архитектуру Гарварда (отдельный код и пространство данных). Практически целесообразно загружать программу с SD-карты и записывать ее в память кода, зависит от того, как часто вы собираетесь это делать.

Если вы пытаетесь создать динамическую среду, такую ​​как ОС, которая постоянно накладывает программы, то нет. Но в моем случае у меня есть программа, которая при необходимости загружает драйверы с SD-карты объемом 2 ГБ. PIC24FJ256GB110 имеет минимум 10000 циклов стирания / записи. Даже если бы это делалось пять раз в день, вспышка длилась бы не менее 5 с половиной лет.

(Примечание: цифра в 10000 является минимумом. Типичная стойкость циклов стирания / записи может быть в пять раз больше - поэтому, если вы занимаетесь разработкой, вы, вероятно, можете перезагружать процессор 140 раз в день - каждые 3 1/2 минуты на восемь часов - и это может продолжаться еще год.)

tcrosley
источник
2

В моей школе мы использовали процессоры HC11 или HC12 с внешней оперативной памятью для загрузки и выполнения программ ... но я забыл название плат / комплекта :( В любом случае, микроконтроллеры Freescale HC (S) -линии обращаются к ОЗУ и ПЗУ одинаково , так что вы можете загрузить код в оперативную память и выполнить его.

Исходя из очереди blalor, лучшим решением может быть добавление на вашу плату кнопки, которая может перепрошивать PIC из данных, хранящихся на SD-карте, которую вы вставляете вместе с загрузчиком. Я не могу себе представить, какой код не подходит для больших PIC; если у вас есть статические данные (графика, текст, звук), сохраните их на внешнем хранилище.

Ник Т
источник
1

Вы, вероятно, не можете выделить из ОЗУ, но для вашего приложения у вас может быть небольшой загрузчик во флэш-памяти, который затем может считывать данные с SD-карты в оставшуюся часть флэш-памяти. Я использовал этот подход с флэш-микросхемой, управляемой SPI, чтобы позволить загружать встроенное ПО с беспроводной линии связи и затем устанавливать его после получения полностью; Я не могу придумать ни одной конкретной причины, по которой он не будет работать с SD-картой, хотя SD-совместимый загрузчик может занимать некоторое место.

Supercat
источник
Я сделал нечто подобное для устройства, у которого было несколько несколько разных прошивок и целей: записать все файлы во внешнюю SPI-флеш-память (которая доступна в размерах, значительно превышающих размеры большинства микроконтроллеров) и перепрошить контроллер одним из изображений с загрузчиком, если кнопка удерживается во время сброса.
Кевин Вермеер
0

Многие микроконтроллеры позволят вам сделать это, звучит как на картинке. то, что вы хотели бы сделать, это иметь загрузчик, который использует spi для чтения с SD-карты, скопировать программу, которая, вероятно, хочет быть известным или жестко закодированным именем файла, вероятно, в корневом каталоге, проанализировать этот файл в ram и затем перейти к программа в оперативной памяти. Контроллеры на базе ARM, безусловно, позволят вам сделать что-то подобное.

В качестве альтернативы можно было бы использовать загрузчик, считывающий SD-карту через spi, и вместо того, чтобы копировать в оперативную память и записывать ветвления на часть флэш-памяти. Вероятно, вы хотите иметь кнопку, если кнопка нажата при включении питания или сбросе, а затем загрузите новую программу с SD-карты, в противном случае, если подпись или контрольная сумма выглядит хорошо на этой загружаемой части флэш-памяти, а затем в загрузочной ветви этой части флэш-памяти. Или, может быть, если SD-карта присутствует, загрузите с нее, иначе ветвь загружаемой части флэш-памяти. Можно использовать этот метод на основе рук и AVR, возможно, даже на основе изображений, но мой опыт с фотографиями устарел. Msp430 Я бы также предположил. По сути, если вы можете перепрограммировать части флэш-памяти, с которой вы выполняете, с самого процессора микроконтроллера,

Старожил
источник
Хм, на самом деле я не запрограммировал AVR от AVR, извините, что был более последовательным с хоста. Внедряет третье решение, которое, как вы видите, делают многие дешевые доски для хобби ... используют два микроконтроллера. В этом случае один из них будет удерживать другой в режиме сброса, считывать SD-карту, программировать другой микро, через последовательный или другой, а затем сбрасывать сброс на другом микро. На платах для хобби / eval часто есть один микро для интерфейса usb, и он обычно подходит к другому.
old_timer