Цитата(Kitsok @ Nov 21 2007, 14:22)

Ресетится контроллер, передается управление по адресу 0x0, который мемори контроллером транслируется в 0x00100000 (флеш).
Выполняется там что-то, копируется что-то из флеша в страницу памяти по адресу 0x00200000(РАМ). Потом мы ставим бит remap, следующая инструкция откуда возьмется - из RAM или из FLASH?
Давайте представим это так: есть три области - с нуля, с 0x00100000 (флеш), и с 0x00200000(ОЗУ). Если РС указывает на вторую область, программа исполняется из флеш. Если на третью - из ОЗУ. Если на первую - то зависит от ремапа. Т.е. в первой области мы имеем "зеркало" второй или третьей. Поэтому в момент ремапа программа должна исполняться из второй или третьей (она может вообще всегда исполняться из второй или третьей, а в нулевую попадать только по исключениям, чтобы считать вектор). Это в SAM7. В LPC несколько иначе - там "отражается" только область 0x40 байт на вектора. Поэтому ответ такой - из следующего адреса. А что окажется по этому адресу - зависит от адреса (если вторая область - флеш, если третья - ОЗУ) и ремапа(если первая)
Цитата(Kitsok @ Nov 21 2007, 14:22)

Еще одна непонятка - как нужно настроить компилятор, куда что линковать? Получается что для бутлоадера нужно прописывать файл линкеру, что мы "живем" по адресам 0x00100000? Тогда после ресета pc=0, первая инструкция - переход по реальному адресу. Ну а приложение нужно размещать по адресу 0x00, и в бутлоадере делать копирование флеша в память, ремап и передачу управления на 0x00. Правильно?
Почти. У меня так: загрузчик живет по адресам 0x00100000 - 0x00100FFF (нулевой сектор флеш), файл SAM7_boot.xcl. Приложение живет вслед за загрузчиком, начиная с 0x00101000 (первый сектор флеш и далее), файл SAM7S64_boot_app.xcl. При включении питания или сбросе флеш отражена на нулевые адреса, на месте векторов оказываются вектора загрузчика, из вектора ресета считывается переход на загрузчик в адреса 0x00100000 - 0x00100FFF. Загрузчик получает управление. Если надо передать управление приложению, то загрузчик берет вектора приложения из адресов 0x00101000-0x0010103F, копирует их в озу по адресам 0x00200000-0x0020003F (эта область зарезервирована и в загрузчике и в приложении, чтобы там не оказались какие-либо данные). Загрузчик (работая в адресах 0x00100000 - 0x00100FFF) запрещает прерывания и делает ремап. При этом ОЗУ отражается на нулевые адреса и в области векторов оказываются скопированные в 0x00200000-0x0020003F вектора приложения. Загрузчик передает управление на нулевой адрес, т.е. на вектор ресет приложения. Из вектора считывается команда перехода на cstartup приложения, в адреса 0x00101040....