Как я могу выполнить код ARM от внешней памяти?

Я использую микросхему LPC2132 ARM для разработки программы. Однако моя программа выросла, чем пространство на микросхеме.

Как я могу подключить свою микросхему к своего рода микросхеме внешней памяти для содержания дополнительного исполняемого кода? Действительно ли это возможно? В противном случае, что обычно делают люди, когда у них заканчивается пространство микросхемы?

8
задан samoz 12 April 2010 в 18:08
поделиться

5 ответов

Ответ Марка хороший. Один вопрос - у вас не хватает оперативной памяти, или флэш-памяти, или и того, и другого? Решения / ответы могут зависеть от ...

Пару лет назад я оказался в похожей ситуации (не хватало места (флэш-память и оперативная память) на LPC2148. Из частей, совместимых по выводам, это была самая большая вспышка и самая большая оперативная память. Таким образом, это была неудачная ситуация, когда «довольствуйся тем, что у тебя есть». И, как сказал Марк, был выбран не тот чип (ну, на самом деле, требования и функциональность вышли за рамки того, что чип изначально должен был делать ... . Я уверен, что никто другой никогда не сталкивался с этим ;-))

Так или иначе, я оказался в «битве байтов». Вот что я помню (заметьте, большую часть этого кода я унаследовал от клиента ...)

  • [+ RAM, -ROM] сделать что-нибудь const, которое может быть
  • {{1 }}
  • [+ ROM] по возможности используйте Thumb (см. Комментарии Марка)
  • [+ ROM] используйте справочные таблицы где возможно
  • [+ ROM] повторно фактор и объединение общих функций (особенно преобразование часто используемых макросов, подобных функциям, в подпрограммы)
  • {{1 }}
  • [+ ROM] все, что является функцией, вызываемой из одного места - поместите ее непосредственно в строку, а не в функцию
  • [ + ROM, + RAM] изменить использование всех операций с плавающей запятой на фиксированную
  • [+ ROM, + RAM] исключить неиспользуемые переменные + константы (используйте lint & карту компоновщика для поиска / устранения / проверки)
  • [+ ROM] попробуйте заменить переключатель w / if / else, и наоборот
  • {{1 }}
  • [+ ROM] убедитесь, что ваш компоновщик настроен d для удаления "мертвого" (неиспользуемого) кода
  • [+ ROM] переработать строки + константы так, чтобы идентичные "вещи" определялись только в одном месте
  • [+ ROM] (вздох, вздох) заменить функции сокрытия данных макросами (или встроенными, если можете) - остерегайтесь приоритетного прерывания, условий гонки, взаимного исключения и т. д.
  • [+ ROM, + RAM] - исключить весь отладочный / временный код - обычно есть переключатели / распечатки контактов ввода / вывода / и т. д. .. которые условно не скомпилированы

Блин, их еще куча, но мне нужно бежать на встречу.Все, что я помню, это то, что это был прогресс, десятки и сотни байтов за раз, который в конечном итоге дал довольно значительную экономию. В итоге я восстановил около 20% из флеш-памяти и ОЗУ, и этого было достаточно для завершения проекта. Мне потребовалось около 2 недель, чтобы очистить этот материал, но экономия того стоила.

Я постараюсь вернуться и опубликовать еще тактику, просто не могу прямо сейчас. Для справки, я бывал в ситуациях, когда мне приходилось загружать / заменять код в и из ОЗУ во время выполнения из последовательной флэш-памяти по мере необходимости (алгоритмы, таблицы и т. Д.), И это было ужасно. Во-первых, постарайтесь максимально сжать текущий код. Это также несколько интеллектуальное упражнение, которое заставляет вас залезть под капот и понять, что, черт возьми, ваш компилятор на самом деле делает.

Последний пункт: напишите хороший жесткий код на протяжении проекта, но делайте такую ​​оптимизацию в конце , когда это необходимо и это оправдано экономическим обоснованием.

10
ответ дан 5 December 2019 в 09:24
поделиться

Если вам нужно подключить внешнюю память (что означает необходимость изменения оборудования), почему бы не использовать чип с большей памятью. Фактически, некоторые микросхемы будут полностью совместимы по выводам и будут иметь больше флэш-памяти, поэтому вы избежите переделки (только замена микросхемы).

2
ответ дан 5 December 2019 в 09:24
поделиться

Если нет, что люди обычно делают , когда у них заканчивается свободное место на чипе?

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

Вам нужно знать свою цель и ее выполнимость в первую очередь. Насколько ваше приложение превышает доступное пространство и насколько оно велико в настоящее время? Это должно быть сказано в карте компоновщика или в журнале сборки. Если вы еще не рассмотрели оптимизацию, я редко видел приложение, которое не могло бы сравнительно безболезненно сбить хотя бы 5%, а тем более согласованными усилиями еще до использования оптимизатора.

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

Использование оптимизации компилятора ограничивает возможность простого использования отладчика, но вам не нужно оптимизировать каждый модуль. Поэтому, если вам нужно отлаживать, но также использовать оптимизацию компилятора, оптимизируйте все модули, кроме тех, которые вы отлаживаете в любое конкретное время.

Однако имейте в виду, что код, который кажется работоспособным, но имеет ошибки или использует неопределенное поведение языка, может изменить свое поведение (т. Е. Дать сбой) после оптимизации компилятора; оставляя вас с кодом, который не работает, но не может быть отлажен.Лучшая стратегия, позволяющая избежать этой ситуации, - это создать код с максимальным уровнем предупреждений, допускаемым вашим компилятором (и установить предупреждения для ошибок), и устранить все предупреждения. По возможности используйте инструмент статического анализа, например Lint.

Если вы еще этого не сделали, самым быстрым и радикальным сохранением в вашем случае, вероятно, будет компиляция в набор инструкций Thumb, а не ARM.

Наконец, когда все остальное терпит неудачу, ваша часть является членом семейства устройств LPC2131 / 32/34/36/38, самая большая часть имеет 512 КБ флэш-памяти / 32 КБ ОЗУ, поэтому вы можете переключиться на другую часть в того же семейства и в значительной степени сохраняют программную совместимость. Проверьте таблицу , если вам также нужна совместимость контактов.

1
ответ дан 5 December 2019 в 09:24
поделиться

Смотрим на таблицу данных для этой части, доступную здесь:

http://www.keil.com/dd/docs/datashts/philips/lpc2131_32_34_36_38 .pdf

Похоже, что у него нет интерфейсов для внешней флэш-памяти или SDRAM с отображением памяти, а также у него нет MMU.

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

Может быть «достаточно» того, что вы переместите данные во внешнее хранилище и сохраните только код во встроенном ПЗУ, это упростит вашу задачу за счет увеличения задержки при доступе к данным. Вы также можете использовать набор инструкций для большого пальца, который уменьшает размер кода за счет некоторой скорости, а также оптимизирует компилятор для плотности кода, а не для скорости.

Если нет, то что обычно делают люди , когда у них заканчивается свободное место на чипе?

Прискорбный ответ заключается в том, что вы выбрали неправильный чип для своего приложения и / или вам нужно переосмыслить, как ваше приложение спроектирован так, чтобы вписаться в этот чип.

РЕДАКТИРОВАТЬ:

Также похоже, что есть некоторые почти совместимые по выводам детали с большим количеством ресурсов. LPC2138 имеет 512 КБ флэш-памяти и 32 КБ оперативной памяти (по сравнению с 64/16 с вашей стороны). Есть также пара размеров между двумя доступными.

Беглый взгляд на выводы выводов выглядел так, будто единственная разница заключалась в наличии второго АЦП на плате, который мультиплексирован с некоторыми другими выводами. Очевидно, изучите это полностью, но похоже, что вы можете просто переключиться на более дорогие части, не изменяя остальную часть платы.

8
ответ дан 5 December 2019 в 09:24
поделиться

Вам нужно будет разработать какой-то код модуля с возможностью горячей замены и подключить какой-то чип памяти для внешних модулей.

-2
ответ дан 5 December 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: