Как я могу запустить код ARM из внешней памяти? - PullRequest
8 голосов
/ 12 апреля 2010

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

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

Ответы [ 6 ]

10 голосов
/ 13 апреля 2010

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

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

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

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

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

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

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

8 голосов
/ 12 апреля 2010

Глядя на таблицу для этой части доступны здесь:

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

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

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

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

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

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

EDIT:

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

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

2 голосов
/ 12 апреля 2010

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

1 голос
/ 13 апреля 2010

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

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

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

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

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

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

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

Наконец, когда все остальное терпит неудачу, ваша часть является членом семейства устройств LPC2131 / 32/34/36/38, «самой большой» части, имеющей 512K Flash / 32K RAM, поэтому вы можете перейти на другую часть в та же семья и в значительной степени сохраняют совместимость программного обеспечения. Проверьте таблицу , если вам также нужна совместимость выводов.

0 голосов
/ 31 июля 2013

Перейти на процессор TI OMAP. Все они запускают код из памяти DDR3 (или DDR2) и могут работать на частоте 1 ГГц для некоторых моделей. Единственным недостатком здесь является то, что все эти типы процессоров - это расположение печатных плат памяти BGA и DDR2 / 3.

0 голосов
/ 12 апреля 2010

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

...