vallav попросил тут, меня терроризирует

Цитата(vallav)
Надеюсь Вы прочли, что меня забанили на месяц.
Если прочтете это, то опубликуйте в той ветке, где вопрос задали.
Ответы:
Цитата(vallav)
Цитата(student pupkin)
1) Регистр MEMMAP вы ни разу не упомянули. Эксперименты с учетом него проводили? Вообще про него в "LPC17xx User Manual" читали? И про сопутствующие вещи?
А зачем он мне нужен? Мельком в UM на него глянул. Что им делается такого, что может понадобиться в проге?
Затем, что, по-моему, вы плохо понимаете как происходит старт штатного загрузчика.
Цитата(vallav)
Цитата(student pupkin)
2) Вы листали документ "ARMv7-M Architecture Reference Manual"? Он хотя бы у вас имеется, в дополнение к "LPC17xx User Manual"?
Не, нету. Но есть DDI0337G_cortex_m3_r2p0_trm.pdf
Вообще я говорил о названии
документа (пишется на первой странице), а не о названии
файла.

. У вас "Cortex-M3 Technical Reference Manual". Наверное и этого достаточно. Самое главное - вы достаточно хорошо пробежались по нему, регулярно тудя заглядываете?
Цитата(vallav)
Цитата(student pupkin)
3) У вас есть JTAG-эмулятор? Потому как Keil вряд ли будет вам иммитировать запуск штатного загрузчика...
Нету. Но JTAG тоже не может отследить запуск загрузчика, так как после сброса отключен и именно бутлоадер решает - включать
JTAG или не включать.
Bootloader включает JTAG первым делом (есесно после проверки на отсутствие CRP1/2/3).
Далее вот вам забавная приписка из мануала на LPC17xx (стр.15):
Following a hardware reset, the Boot ROM is temporarily mapped to address 0. This is
normally transparent to the user. However, if execution is halted immediately after reset by
a debugger, it should correct the mapping for the user.Цитата(vallav)
Цитата(student pupkin)
4) Пробовали, скажем, делать дамп памяти при MEMMAP.MAP=0 и при MEMMAP.MAP=1?
Не, не пробовал.
Ну и пес с ним, с этим дампом

JTAG-ом все же обзаведитесь. Сейчас это не дорого

. Пригодится.
Цитата(vallav)
Теперь к Вам несколько вопросов.
Можно выделить три характерные точки после сброса - вход в бутлоадер, выход из бутлоадера, вход в main.
Уточняйте, о каком бутлоадере идет речь - о штатном или о вторичном (USB)?
Скорее две - выход из бутлоадера есть одновременно переход на пользовательскую программу. Не пишите main - хотя я понял, что вы имели ввиду пользовательскую программу (например ваш blink-led), такая функция есть и у вторичного бутлоадера.
Цитата(vallav)
Чему равны sp и ip в точке входа в бутлоадер, как и откуда они взялись?
Смотря о каком бутлоадере вы говорите.
1) После снятия сигнала RESET
в соответсвии с моделью обработки исключений, заложенной в архитектуре Cortex-M3, ЦПУ считывает с адреса 0х00 константу и помещает ее в main_SP, затем считывает константу с адреса 0x04 и помещает ее в IP, что является просто безусловным переходм по адресу. Однако
за счет внешнего ремапа, управляемого регистром MEMMAP, который после RESET-а содержит 1 (Boot Mode), первые 256 байт адресного пространства, начиная с 0х0, переотображаются на область BOOTROM. Поэтому ЦПУ, считывая первые два слова с адреса 0х0, на самом деле считывает слова с адреса 0х1FFF 0000.
2) Для проверки наличия пользовательского ПО (в данном случае это будет вторичный USB-бутлоадер) штатный бутлоадер устанавливает MEMMAP в 0 (User Mode) и проверяет вычисляет сумму первых 8 слов начиная с адреса 0х0 (если оставить MEMMAP в 1, то бутлоадер будет считывать слова с адреса 0х1FFF 0000).
The reserved Cortex-M3 exception vector location 7 (offset 0x 001C in the vector table) should contain the 2’s complement of the check-sum of table entries 0 through 6. This causes the checksum of the first 8 table entries to be 0.3) Запуск вторичного бутлоадера - как уже говорилось много постов выше, наиболее логичный способ такой:
- считать с адреса 0х00 константу (по логике вещей там должно лежать значение SP для пользовательской программы) в main_SP (программно - командой LDR);
- считать с адреса 0х04 константу (по логике вещей там должен лежать адрес начала пользовательской программы) в IP (тоже программно - честно говоря не знаю, это LDR в PC или сначала LDR в РОН а потом установить младший бит и BX через этот РОН

).
Чтобы быть абсолютно в этом уверенным, необходимо раздобыть исходник первичного бутлоадера.
Цитата(vallav)
Чему равны sp и ip в точке выхода из бутлоадера, как и откуда они взялись?
Не понял вопроса

. Особенно про IP...
Цитата(vallav)
Чему равны sp и ip в точке входа в main, как и откуда они взялись?
Вопрос именно о входе в main, или о входе в пользовательскую программу? В общем случае до main еще выполняется _main - инициализация глобальных и локальных статических переменных нулем/инициализаторами...

Честно скажу - не знаю где и как инициалицируется SP перед переходом на пользовательськую программу. Заметьте, что это ни в коей мере не "допиливание ЦПУ инженерами NXP" и архитектуре COrtex-M3 никак не противоречит. Смотрите исходники. Найдите JTAG и запустите вторичный бутлоадер под ним. Флаг в руки

Насчет значения IP - посмотрите исходники вторичного бутлоадера:
1) в функции
main() (memory.c) есть вызов ф-ции
execute_user_code() (sbl_iap.c)
Код
void execute_user_code(void)
{
void (*user_code_entry)(void);
/* Change the Vector Table to the USER_FLASH_START
in case the user application uses interrupts */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_START);
user_code_entry = (void (*)(void))((USER_FLASH_START)+1);
user_code_entry();
}
Дабы вы не потерялись, вот еще скопипастил из заголовочных файлов:
Код
/* из sbl_config.h*/
#define USER_FLASH_START (sector_start_map[USER_START_SECTOR])
/* в конечном счете вместо USER_FLASH_START получиться вот это: */
#define SECTOR_2_START 0x00002000
Итого:
1) SP и IP инициализируются аппаратно после сброса процессора - старт штатного загрузчика.
2) В дальнейшем SP изменяется программно, IP тоже (команды перехода)
3) Естественно за исключением случаев обработки прерываний или иных (аварийных) исключений - там тоже все аппаратно (надеюсь тут сомнения вас не гложут

)
Что касается остального - каюсь, на все вопросы ответить не смогу. Покопайтесь в исходниках, поразбирайтесь.