Я использую микросхему LPC2132 ARM для разработки программы. Однако моя программа выросла, чем пространство на микросхеме.
Как я могу подключить свою микросхему к своего рода микросхеме внешней памяти для содержания дополнительного исполняемого кода? Действительно ли это возможно? В противном случае, что обычно делают люди, когда у них заканчивается пространство микросхемы?
Ответ Марка хороший. Один вопрос - у вас не хватает оперативной памяти, или флэш-памяти, или и того, и другого? Решения / ответы могут зависеть от ...
Пару лет назад я оказался в похожей ситуации (не хватало места (флэш-память и оперативная память) на LPC2148. Из частей, совместимых по выводам, это была самая большая вспышка и самая большая оперативная память. Таким образом, это была неудачная ситуация, когда «довольствуйся тем, что у тебя есть». И, как сказал Марк, был выбран не тот чип (ну, на самом деле, требования и функциональность вышли за рамки того, что чип изначально должен был делать ... . Я уверен, что никто другой никогда не сталкивался с этим ;-))
Так или иначе, я оказался в «битве байтов». Вот что я помню (заметьте, большую часть этого кода я унаследовал от клиента ...)
Блин, их еще куча, но мне нужно бежать на встречу.Все, что я помню, это то, что это был прогресс, десятки и сотни байтов за раз, который в конечном итоге дал довольно значительную экономию. В итоге я восстановил около 20% из флеш-памяти и ОЗУ, и этого было достаточно для завершения проекта. Мне потребовалось около 2 недель, чтобы очистить этот материал, но экономия того стоила.
Я постараюсь вернуться и опубликовать еще тактику, просто не могу прямо сейчас. Для справки, я бывал в ситуациях, когда мне приходилось загружать / заменять код в и из ОЗУ во время выполнения из последовательной флэш-памяти по мере необходимости (алгоритмы, таблицы и т. Д.), И это было ужасно. Во-первых, постарайтесь максимально сжать текущий код. Это также несколько интеллектуальное упражнение, которое заставляет вас залезть под капот и понять, что, черт возьми, ваш компилятор на самом деле делает.
Последний пункт: напишите хороший жесткий код на протяжении проекта, но делайте такую оптимизацию в конце , когда это необходимо и это оправдано экономическим обоснованием.
Если вам нужно подключить внешнюю память (что означает необходимость изменения оборудования), почему бы не использовать чип с большей памятью. Фактически, некоторые микросхемы будут полностью совместимы по выводам и будут иметь больше флэш-памяти, поэтому вы избежите переделки (только замена микросхемы).
Если нет, что люди обычно делают , когда у них заканчивается свободное место на чипе?
Первое, что они сделают, - это оптимизируют свое приложение . Я не говорю о запуске оптимизатора компилятора (хотя это может быть частью решения), а о применении таких методов, как предложил Дэн.Посмотрите на эффективность использования пространства для ваших структур данных и алгоритмов, часто существует компромисс между объемом и скоростью выполнения, но вам может не понадобиться самый быстрый алгоритм, но вам нужно сэкономить место.
Вам нужно знать свою цель и ее выполнимость в первую очередь. Насколько ваше приложение превышает доступное пространство и насколько оно велико в настоящее время? Это должно быть сказано в карте компоновщика или в журнале сборки. Если вы еще не рассмотрели оптимизацию, я редко видел приложение, которое не могло бы сравнительно безболезненно сбить хотя бы 5%, а тем более согласованными усилиями еще до использования оптимизатора.
Карта компоновщика также сообщит вам объем памяти, используемый каждой функцией / модулем, так что вы можете нацелить оптимизацию там, где она будет иметь наибольший эффект. Вы также можете быть удивлены, обнаружив, что код библиотеки был связан с файлом карты, и спросите себя, почему и можно ли его исключить.
Использование оптимизации компилятора ограничивает возможность простого использования отладчика, но вам не нужно оптимизировать каждый модуль. Поэтому, если вам нужно отлаживать, но также использовать оптимизацию компилятора, оптимизируйте все модули, кроме тех, которые вы отлаживаете в любое конкретное время.
Однако имейте в виду, что код, который кажется работоспособным, но имеет ошибки или использует неопределенное поведение языка, может изменить свое поведение (т. Е. Дать сбой) после оптимизации компилятора; оставляя вас с кодом, который не работает, но не может быть отлажен.Лучшая стратегия, позволяющая избежать этой ситуации, - это создать код с максимальным уровнем предупреждений, допускаемым вашим компилятором (и установить предупреждения для ошибок), и устранить все предупреждения. По возможности используйте инструмент статического анализа, например Lint.
Если вы еще этого не сделали, самым быстрым и радикальным сохранением в вашем случае, вероятно, будет компиляция в набор инструкций Thumb, а не ARM.
Наконец, когда все остальное терпит неудачу, ваша часть является членом семейства устройств LPC2131 / 32/34/36/38, самая большая часть имеет 512 КБ флэш-памяти / 32 КБ ОЗУ, поэтому вы можете переключиться на другую часть в того же семейства и в значительной степени сохраняют программную совместимость. Проверьте таблицу , если вам также нужна совместимость контактов.
Смотрим на таблицу данных для этой части, доступную здесь:
http://www.keil.com/dd/docs/datashts/philips/lpc2131_32_34_36_38 .pdf
Похоже, что у него нет интерфейсов для внешней флэш-памяти или SDRAM с отображением памяти, а также у него нет MMU.
У него есть порты SPI, которые можно использовать для взаимодействия с SD-картами, EEPROM или последовательной флеш-памятью для хранения вне кристалла, но они не будут отображены в памяти, вам придется обрабатывать перемещение сегментов кода в выход, учитывая очень ограниченный барабан на этом чипе, это было бы сложно.
Может быть «достаточно» того, что вы переместите данные во внешнее хранилище и сохраните только код во встроенном ПЗУ, это упростит вашу задачу за счет увеличения задержки при доступе к данным. Вы также можете использовать набор инструкций для большого пальца, который уменьшает размер кода за счет некоторой скорости, а также оптимизирует компилятор для плотности кода, а не для скорости.
Если нет, то что обычно делают люди , когда у них заканчивается свободное место на чипе?
Прискорбный ответ заключается в том, что вы выбрали неправильный чип для своего приложения и / или вам нужно переосмыслить, как ваше приложение спроектирован так, чтобы вписаться в этот чип.
РЕДАКТИРОВАТЬ:
Также похоже, что есть некоторые почти совместимые по выводам детали с большим количеством ресурсов. LPC2138 имеет 512 КБ флэш-памяти и 32 КБ оперативной памяти (по сравнению с 64/16 с вашей стороны). Есть также пара размеров между двумя доступными.
Беглый взгляд на выводы выводов выглядел так, будто единственная разница заключалась в наличии второго АЦП на плате, который мультиплексирован с некоторыми другими выводами. Очевидно, изучите это полностью, но похоже, что вы можете просто переключиться на более дорогие части, не изменяя остальную часть платы.
Вам нужно будет разработать какой-то код модуля с возможностью горячей замены и подключить какой-то чип памяти для внешних модулей.