boez » 24 фев 2010, 12:34
Работа кода из ОЗУ применяется в двух случаях:
1. Чтобы работало побыстрее. Вроде как на LPC не сильно актуально, там MAM есть, аффтары утверждают что программа из флеши тоже исполняется на полной скорости. Реализация: прога вся пишется во флеш, но при старте часть кода, который должен исполняться из ОЗУ, копируется туда (механизм тот же, что и для инициализированных данных).
2. Чтобы флешу зря не мучать. Это тот вариант, про который я говорил. Вся прога, в том числе и векторы прерываний, собирается для работы в ОЗУ и записывается в ОЗУ прямо через JTAG из среды. Естественно размер кода ограничен размером ОЗУ - но это не проблема для светодиодной мигалки. В общем, это идеальный режим для мелких тестов - потому как все очень просто, нажал в IDE кнопку "Debug" - и прога скомпилилась, залилась в МК и побежала. Или встала на начале функции main(), а дальше по шагам.
К сожалению не работал всерьез с кейлом, только с CrossWorks. На приведенных скринах ничего не менял, просто открыл первый попавшийся пример-мигалку и выбрал конфигурацию RAM - файл Ram.ini именно в таком виде прописался сам. Поиск показал, что такой файл есть во многих папках с примерами, в нем написаны некие инструкции для отладчика. Что это за формат - я не знаю, но действия достаточно очевидные: загрузить скомпилированный файл в ОЗУ, установить PC на 0x40000000 (начало ОЗУ) и запустить исполнение. Еще упомянута функция main, возможно на нее поставится брейкпоинт.
А что касается вопроса откуда стартует LPC - вообще он всегда стартует с бутлоадера. Бутлоадер проверяет состояние ножки P0.14 (на олимексовской плате переключатель ICSP), если на ней 0 - переходит в режим ISP. Если 1 - он проверяет, есть ли во флеши программа. Прошивающий софт при прошивке считает контрольную сумму векторов прерываний и помещает ее в специальную ячейку. Бутлоадер считает контрольную сумму векторов во флеши, затем сверяет ее с этой ячейкой. Если сошлось - значит во флеши валидная программа, тогда управление передается ей на адрес 0x00000000. Если нет - опять же ISP (ну то есть он ждет заливки программы по уарту).
Если отладка по JTAG работает, определить куда плюхнулся МК, легко - нажать "стоп" и посмотреть адрес в PC. Флеш находится с нулевого адреса, ОЗУ с 0x40000000, бутлоадер еще дальше (0x7fff....). Отладчик через JTAG может менять ОЗУ и любые регистры - поэтому ему на эти перемычки-суммы глубоко пофиг, он может ручками заставить проц выполнять то, что ему надо.