Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Несколько вопросов по lpc176x
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Страницы: 1, 2, 3
Student Pupkin
Извините что вторгаюсь smile.gif . Но у меня попкорн уже кончился lol.gif
Цитата(vallav @ Jun 6 2010, 17:43) *
Так я разве спорю.
Конечно, core reads the start sp...
Только как?
Мое мнение, в NXP не идиоты делать это аппаратно, когда это можно с тем же успехом сделать программно в коде инициализации.
Что там и делается.

Я тоже думал, что бутлоадер переписывает из 0x0 константу в SP, а затем использует 0x4 как адрес перехода на пользовательскую программу. Правильно? Если не прав - поправьте меня.
Цитата(vallav @ Jun 6 2010, 17:43) *
Полагаете - просто на всякий случай? Код инициализации игнорирует значение sp при входе в него и записывает в sp ( программно )
значение, равное __initial_sp.
Кстати, задумайтесь - после сброса начинает работать бутлоадер.
У него sp откуда берется? Аппаратно устанавливается на 0xffffffff, если чип не целованный?

  1. Область памяти BOOTROM - 0x1FFF 0000 - 0x1FFF 1FFF 8 kB Boot ROM with flash services
  2. В общем случае положение таблицы векторов для ЦПУ Cortex-M3 (разработчик - ОАО "Advanced RISC Machine") определяется в том числе регистром VTOR (Vector Table Offset Register - принадлежность ЦПУ Cortex-M3). Этот регистр включает:
    - бит TLBBASE (0: Table base is in CODE, base address 0x00000000; 1: Table base is in RAM, base address 0x20000000)
    - поле TBLOFF[28:7] - смещение, которое прибавляется к base address (правдя я не понял как вычисляется адрес smile.gif)
    Далее в документе "ARMv7-M Architecture Reference Manual" есть приписка "An implementation can include configuration input signals that determine the reset value of the TBLOFF bit field". Просто опция при покупке ЦПУ Cortex-M3. В случае LPC17xx - TLBOFF после сброса содержит не нули, а значение (какое - не знаю smile.gif), благодаря которому таблицей веторов для ЦПУ Cortex-M3 будет являться начало области памяти BOOTROM.
  3. В дополнение - приписка из "LPC17xx User manual" (стр.745):
    Цитата
    Privileged software can write to the VTOR to relocate the vector table start address to a different memory location,
    in the range 0x00000080 to 0x3FFFFF80

    Таким образом - запуск программы бутлоадера выполняется согласно тому, как это заложено в архитектуре ЦПУ Cortex-M3 - SP и IP загружаются аппаратно. Константы для загрузки беруться из BOOTROM (полагаю, что таблица векторов размещена в ее начале).

vallav, тут даже мне понятно smile.gif.
В конечном счете - NXP нигде никак не допиливают ЦПУ Cortex-M3. Они просто покупают его, возможно с какими-то опциями (которые все в доке от ARM описаны), и вставляют (грубо smile.gif) в свой микроконтроллер (в книгах 20-30 летней давности был термин однокристальная микроЭВМ - может этот термин понятнее, прото ощущение, что вы не очень понимаете, где заканчивается творчество инженеров ARM и начинается творчество инженеров NXP). Возможно что и "опция" - это притяни вот эту ногу у себя в кристалле к нулю - будет это, а притяни к единице - будет то-то... Ну и прошивают в BOOTROM свою программу-загрузчик.
По-моему простая аналогия между производителем материнской платы и процессором от Intel, который в эту плату вставляется - получается ЭВМ smile.gif. Хочешь знать как работает процессор - читай доки от Intel. Хочешь знать, что есть на материнской плате и как с эим работать процессору - читай доки от производителя материнской платы.
Без обид smile.gif
Student Pupkin
Каюсь smile.gif . Оказывается регистр VTOR к переотображению таблицы векторов (по умолчанию с 0х0) на область BOOTROM отношения не имеет smile.gif. Имеет отношение регистр MEMMAP. Но суть не меняется smile.gif
Following a hardware reset, the Boot ROM is temporarily mapped to address 0. (LPC17xx User Manual, стр.15)
Интересно теперь, как bootloader запускает пользовательскую программу после того, как устанавливает MEMMAP в 1 - програмно (переписывая константу из 0x0 в SP и выполняя переход по адресу, лежащему в 0х4) или есть возможность сформировать reset только для ядра (т.е. чтобы MEMMAP остался с установленным в 1 битом MAP)? laughing.gif
zltigo
Цитата(Student Pupkin @ Jun 6 2010, 23:28) *
програмно (переписывая константу из 0x0 в SP и выполняя переход по адресу, лежащему в 0х4)...

Не вижу нималейших причин делать иначе - отмапирована только таблица векторов сам bootloader исполняется всегда на своем месте, посему просто убирает свою таблицу векторов, считывает, устанавливает и запускает. Никаких ограничений на софтовую инициализацию MSP нет. У меня точно также мой загрузчик отрабатывает, только,естественно сам целиком находясь на нулевых адресах он еще и положение таблицы векторов основной программы устанавливает.
Student Pupkin
А еще вопросик smile.gif - MEMMAP делает переотображение на таблицу в BOOTROM. Т.е. в том числе и чтение первых 256 байт начиная с адреса 0х0000 на самом деле будет являться чтением первых 256 байт области BOOTROM? Значит загрузчику, прежде чем начать проверку пользовательской таблицы векторов (первых 6 слов) на "валидность", необходимо сначала установить MEMMAP в 1 (User Mode)? Ведь в ином случае она недоступна?
Правильно? (вопрос, чтобы просто кое-что себе в голове устаканить smile.gif)
А остальные производители микроконтроллеров на ядре Cortex-M3 тоже вместо Vector Table Offset Register используют "внешний" (по отношению к Cortex-M3) ремап?
vallav
Цитата(Student Pupkin @ Jun 7 2010, 01:22) *
А еще вопросик smile.gif - MEMMAP делает переотображение на таблицу в BOOTROM. Т.е. в том числе и чтение первых 256 байт начиная с адреса 0х0000 на самом деле будет являться чтением первых 256 байт области BOOTROM? Значит загрузчику, прежде чем начать проверку пользовательской таблицы векторов (первых 6 слов) на "валидность", необходимо сначала установить MEMMAP в 1 (User Mode)? Ведь в ином случае она недоступна?
Правильно? (вопрос, чтобы просто кое-что себе в голове устаканить smile.gif)
А остальные производители микроконтроллеров на ядре Cortex-M3 тоже вместо Vector Table Offset Register используют "внешний" (по отношению к Cortex-M3) ремап?



Проверено на железе - плата mbed c lpc1768.
Значение нулевого слова в флеше 0x0, 0xffff, 0xffffffff.
Два бутлоадера - родной и кривой бангалорский.
Прога - мигалка светодиодами грузится иработает.
То есть, чему равно нулевое слово в флеше - глубоко фиолетово.
Можно использовать в своих целях.
Первое слово в флеше - используется бутлоадером для запуска пользовательской проги.
При сбросе - ip вероятней всего имеет значение 0x1fff1ff1 - адрес начала последней строки ПЗУ ( ассоциации с x86 навевает ).
Есть такая IAP комманада - выход в ISP. Именно она после сброса и выполняется.
zltigo
Цитата(Student Pupkin @ Jun 7 2010, 00:22) *
Правильно? (вопрос, чтобы просто кое-что себе в голове устаканить smile.gif)

Да, самое логичое использование механизма.
Цитата
А остальные производители микроконтроллеров на ядре Cortex-M3 тоже вместо Vector Table Offset Register используют "внешний" (по отношению к Cortex-M3) ремап?

Не знаю, не разбирался. Но тот-же Luminary вообще не иммет "ROM" загрузчика. На заводе записывается загрузчик на нулевые адреса, котрый при запуске копирует себя в RAM и ждет прошивки, которую, естественно, на нулевые-же и помещает. Вот такой однократный загрузчик.
Цитата(vallav @ Jun 7 2010, 07:31) *
Проверено на железе - плата mbed c lpc1768.
Значение нулевого слова в флеше 0x0, 0xffff, 0xffffffff.
Два бутлоадера - родной и кривой бангалорский.

Смотря и в железо, и в книги всегда видите фигу sad.gif. На один вопрос ответ угадали, только ни ответить на следующий вопрос, ни тем более сделать выводы не смогли, даже просто посмотреть на нулевое слово в полученной Вами прошивке "бангалорского" загрузчика (реальное значение видимое map файле да и просто в самом бинарнике 0x10000B40 - указатель на стек в RAM) и то не смогли - "садитесь два".
vallav
Цитата(zltigo @ Jun 7 2010, 09:11) *
Смотря и в железо, и в книги всегда видите фигу sad.gif. На один вопрос ответ угадали, только ни ответить на следующий вопрос, ни тем более сделать выводы не смогли - "садитесь два".


Во!
Да Вы не просто крутой перец с горячими ушами, Вы еше и туповаты.
Повторяю - на железе проверено. Не понятно?

Вы же вроде хвастались, что аж целых три штуки поимели.
Вкллючать научились?
Умеете в сетапе слова менять?
Так проверте и не несите здесь хню...
zltigo
Просто так, сохраняю цитату на память:
Цитата(vallav @ Jun 7 2010, 08:18) *
Во!
Да Вы не просто крутой перец с горячими ушами, Вы еше и туповаты.
Повторяю - на железе проверено. Не понятно?

Вы же вроде хвастались, что аж целых три штуки поимели.
Вкллючать научились?
Умеете в сетапе слова менять?
Так проверте и не несите здесь хню...
mrKirill
bb-offtopic.gif
Цитата(Student Pupkin @ Jun 6 2010, 21:29) *
Извините что вторгаюсь smile.gif . Но у меня попкорн уже кончился lol.gif

Аналогично smile.gif
Просто восхищаюсь терпением и выдержкой уважаемого zltigo.
Может давно пора "Read only" выдать vallav, непроходимая упертость...или тупость, и уверенность в своей "особой исключительности".
Нарушил все мыслимые нормы поведения на данном форуме...чего только стоит переход на личности...Даже в реальной жизни за такое по роже прошлись бы не раз.
vallav
Цитата(mrKirill @ Jun 7 2010, 10:01) *
bb-offtopic.gif

Аналогично smile.gif
Просто восхищаюсь терпением и выдержкой уважаемого zltigo.
Может давно пора "Read only" выдать vallav, непроходимая упертость...или тупость, и уверенность в своей "особой исключительности".
Нарушил все мыслимые нормы поведения на данном форуме...чего только стоит переход на личности...Даже в реальной жизни за такое по роже прошлись бы не раз.


Извините, Вы проверили то, что я запостил?
В железе, а не теоретически...
Или Вы - исходя из общих соображений - я крутой, а ты хто...
А вот по поводу перехода на личности - Вам дать ссылку, где он меня в кучу испражнений сажает?
Или Сами найдете?
Или пройдитесь по данной ветке и выпишите все эпитеты, которыми он меня награждает и которыми я его?
mrKirill
Цитата(vallav @ Jun 7 2010, 12:27) *
Извините, Вы проверили то, что я запостил?
В железе, а не теоретически...

А мне больше заняться нечем, только Ваши каждодневные наборы маразма проверять? smile3046.gif
Вы никого и ничего не видите, все что Вам пишут - пропускаете мимо ушей, глаз и всего остального.
Уже не раз Вам указывал на соблюдение чувства такта, на нескольких форумах, но для Вас это пустые слова...
И то что Вы кичитесь фразой "в железе, а не теоретически" - пустая болтовня, Вы с МК по-моему вообще первый раз столкнулись.

Цитата
Или Вы - исходя из общих соображений - я крутой, а ты хто...
А вот по поводу перехода на личности - Вам дать ссылку, где он меня в кучу испражнений сажает?
Или Сами найдете?
Или пройдитесь по данной ветке и выпишите все эпитеты, которыми он меня награждает и которыми я его?

"Детский сад - штаны на лямках" ©
"Это не я"©
"Это он первый начал"©

Ничего не напоминает?
Детский лепет из песочницы.
vallav
Цитата(mrKirill @ Jun 7 2010, 10:49) *
А мне больше заняться нечем, только Ваши каждодневные наборы маразма проверять? smile3046.gif
Вы никого и ничего не видите, все что Вам пишут - пропускаете мимо ушей, глаз и всего остального.
Уже не раз Вам указывал на соблюдение чувства такта, на нескольких форумах, но для Вас это пустые слова...
И то что Вы кичитесь фразой "в железе, а не теоретически" - пустая болтовня, Вы с МК по-моему вообще первый раз столкнулись.


Значит не проверяли.
Значит - исходя из общих соображений?
Может Вы тогда помолчите и подождете кого нибудь, кто имеет возможности
и способности такую проверку сделать?
А потом будите выводы делать?
zltigo
Цитата(vallav @ Jun 7 2010, 09:27) *
Извините, Вы проверили то, что я запостил?
В железе, а не теоретически...

Переходим к практическим занятиям. Задание на лето:
1. Скачивайте свой-же архив usbboot1.rar
2. Распаковывайте.
3. Находите директорию BIN.
4. Находите в ней созданный Вами-же, путем нажатия кнопки в IDE, файл прошивки "бангалорского" загрузчика.
5. Смотрите в нем первые четыре байта, которые являются инициализатором указателя MSP.
6. Осенью рассказываете как Вы раньше там чего-то там "в железе" проверяли, что допроверялись до 0xFFFFFFFF вместо
0x10000B40.
vallav
Цитата(zltigo @ Jun 7 2010, 11:10) *
Переходим к практическим занятиям. Задание на лето:
1. Скачивайте свой-же архив usbboot1.rar
2. Распаковывайте.
3. Находите директорию BIN.
4. Находите в ней созданный Вами-же, путем нажатия кнопки в IDE, файл прошивки "бангалорского" загрузчика.
5. Смотрите в нем первые четыре байта, которые являются инициализатором указателя MSP.
6. Рассказываете как Вы раньше там чего-то там "в железе" проверяли, что допроверялись до 0xFFFFFFFF вместо
0x10000B40.


Так Вы настолько круты, что не знаете, как менять значения в начале .bin файла?
Вам наверно это будет удивительно слышать, но я просто создал последовательно несколько .bin файлов,
в которых это значение было 0, 0xffff, 0xffffffff и запускал их. Во всех случаях программа заработала.
Смотрел так же в симуляторе Кейла. Независимо от значения этого слова - при вываливании в main - в sp значение
__initial_sp.
mrKirill
Цитата(vallav @ Jun 7 2010, 13:01) *
А потом будите выводы делать?

Пустая болтовня с Вашей стороны...уже в который раз.
igorsk
Цитата(vallav @ Jun 7 2010, 08:21) *
Так Вы настолько круты, что не знаете, как менять значения в начале .bin файла?
Вам наверно это будет удивительно слышать, но я просто создал последовательно несколько .bin файлов,
в которых это значение было 0, 0xffff, 0xffffffff и запускал их. Во всех случаях программа заработала.
Смотрел так же в симуляторе Кейла. Независимо от значения этого слова - при вываливании в main - в sp значение
__initial_sp.

Тебе просто повезло, что кейловский стартап устанавливает SP вручную.
CODE
ROM:00001648 __user_setup_stackheap ; CODE XREF: ROM:loc_14Cp
ROM:00001648 MOV R5, LR
ROM:0000164A BL __user_perproc_libspace
ROM:0000164E MOV LR, R5
ROM:00001650 MOVS R5, R0
ROM:00001652 MOV R1, SP
ROM:00001654 MOV R3, R10
ROM:00001656 BIC.W R0, R0, #7
ROM:0000165A MOV SP, R0
ROM:0000165C ADD SP, SP, #0x60
ROM:0000165E PUSH {R5,LR}


Проверяльщик, блин.
zltigo
Цитата(vallav @ Jun 7 2010, 09:21) *
Смотрел так же в симуляторе Кейла.

Если за лето ответите на все ранее заданные вопросы, то узнаете, и как получить из elf "ASM" (это если исходники KEIL-овского startup читать не хочется, или недоступны) текст. В приложении
текстик из "Вашего" blink2
GAS
Цитата(mrKirill @ Jun 7 2010, 10:01) *
Может давно пора "Read only" выдать vallav
Не это уже как "Дом 2"с бесплатным попкорном. Кроме того заставляет кое что проверить кое что почитать если конечно подходить творчески.
zltigo
Цитата(GAS @ Jun 7 2010, 12:37) *
Кроме того заставляет кое что проверить кое что почитать если конечно подходить творчески.

Ну по этой причине я и начал продолжать тему в виде "вопросника" с простыми наводящими вопросами.
Student Pupkin
Цитата(vallav @ Jun 7 2010, 08:31) *
Проверено на железе - плата mbed c lpc1768.
Значение нулевого слова в флеше 0x0, 0xffff, 0xffffffff.

1) Регистр MEMMAP вы ни разу не упомянули. Эксперименты с учетом него проводили? Вообще про него в "LPC17xx User Manual" читали? И про сопутствующие вещи?
2) Вы листали документ "ARMv7-M Architecture Reference Manual"? Он хотя бы у вас имеется, в дополнение к "LPC17xx User Manual"?
3) У вас есть JTAG-эмулятор? Потому как Keil вряд ли будет вам иммитировать запуск штатного загрузчика...
4) Пробовали, скажем, делать дамп памяти при MEMMAP.MAP=0 и при MEMMAP.MAP=1?
Заранее спасибо за спокойные и продуманные ответы. smile.gif
mrKirill
Цитата(zltigo @ Jun 7 2010, 16:47) *
Ну по этой причине я и начал продолжать тему в виде "вопросника" с простыми наводящими вопросами.


Жаль только "виновник торжества" как всегда игнорирует всех и вся...

Upd: Получил от него сообщение в личку, он просил передать, что его забанили (Read Only).
zltigo
Цитата(mrKirill @ Jun 7 2010, 15:09) *
Жаль только "виновник торжества"....

На "виновника" все посты последних дней особо уже и не рассчитывалась. Теперь беседу про Cortex-M3 можно некоторое время продолжать и в конструктивном русле. Штука ведь явно mainstream на сегодняшний день.
mrKirill
Цитата(zltigo @ Jun 7 2010, 21:09) *
Штука ведь явно mainstream на сегодняшний день.

Это точно.

Жду свою starterkit'овскую SK-MLPC1768 чтобы приступить к освоению. А пока "чукча читатель" smile.gif И впитыватель полезного smile.gif
zltigo
Цитата(mrKirill @ Jun 7 2010, 18:52) *
Жду свою starterkit'овскую SK-MLPC1768 чтобы приступить к освоению. А пока "чукча читатель" smile.gif И впитыватель полезного smile.gif

Работаю сейчас с Сortex-M3 от Luminary/TI. Первый из Corteх был STM32. Из Cortex-M0 через дней десять заберу в Питере железку на LPC1114.
mrKirill
Насчет LPC11xx думал-думал брать или нет.
Думал на замену ATmega в изделия запланировать, но что-то насчет объемов памяти не очень как-то, линейка до 32кБ всего. А нужно менять ATmega128...которые сейчас уже дороже LPC1114.
zltigo
Цитата(mrKirill @ Jun 7 2010, 20:32) *
Насчет LPC11xx думал-думал брать или нет.

Нормальные малыши, главное для меня 2 SPI. Хороший мелкий периферийный контроллер. LPC17xx уже не интересны - в текущих просто менять массовые LPC2138/48 не особо смысл имеет. А замены чего либо класса LPC23xx/24xx вообще пока ничего нет.
Цитата
менять ATmega128...которые сейчас уже дороже LPC1114.

Ну 128 настолько дороги, что менять их можно хоть LPC13XX, LPC17XX, LPC21XX, LPC23XX.....
mrKirill
Цитата(zltigo @ Jun 8 2010, 00:14) *
Ну 128 настолько дороги, что менять их можно хоть LPC13XX, LPC17XX, LPC21XX, LPC23XX.....

Пока прикидываю LPC17xx ставить на замену. Жду железку...
Student Pupkin
vallav попросил тут, меня терроризирует smile.gif
Цитата(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

Вообще я говорил о названии документа (пишется на первой странице), а не о названии файла. smile.gif. У вас "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?

Не, не пробовал.

Ну и пес с ним, с этим дампом smile.gif
JTAG-ом все же обзаведитесь. Сейчас это не дорого smile.gif. Пригодится.


Цитата(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 через этот РОН smile.gif).
Чтобы быть абсолютно в этом уверенным, необходимо раздобыть исходник первичного бутлоадера.
Цитата(vallav)
Чему равны sp и ip в точке выхода из бутлоадера, как и откуда они взялись?

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

Вопрос именно о входе в main, или о входе в пользовательскую программу? В общем случае до main еще выполняется _main - инициализация глобальных и локальных статических переменных нулем/инициализаторами... smile.gif
Честно скажу - не знаю где и как инициалицируется SP перед переходом на пользовательськую программу. Заметьте, что это ни в коей мере не "допиливание ЦПУ инженерами NXP" и архитектуре COrtex-M3 никак не противоречит. Смотрите исходники. Найдите JTAG и запустите вторичный бутлоадер под ним. Флаг в руки smile.gif
Насчет значения 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) Естественно за исключением случаев обработки прерываний или иных (аварийных) исключений - там тоже все аппаратно (надеюсь тут сомнения вас не гложут smile.gif)
Что касается остального - каюсь, на все вопросы ответить не смогу. Покопайтесь в исходниках, поразбирайтесь.
ViKo
Цитата(Student Pupkin @ Jun 8 2010, 16:15) *
1) SP и IP инициализируются аппаратно после сброса процессора - старт штатного загрузчика.

Цитирую мануал:
Цитата
P2[10]/EINT0/NMI 53[6] I/O P2[10] — General purpose digital input/output pin.
Note: LOW on this pin while RESET is LOW forces on-chip bootloader to take
over control of the part after a reset.

Т.е. загрузчик - это если указанную ножку держать в нуле при сбросе. Без этого - обычный старт - startup, main...
Student Pupkin
Во-первых пардон - я там выше кажется перепутал значение бита в MEMMAP - 0 это BootMode (по сбросу), а 1 - это UserMode
ViKo, тоже процитирую мануал:
1) Following a hardware reset, the Boot ROM is temporarily mapped to address 0. - стр.15
2) The flash boot loader code is executed every time the part is powered on or reset. The loader can execute the ISP command handler or the user application code.
A LOW level after reset at pin P2.10 is considered an external hardware request to start the ISP command handler.
- стр.612 (3.Description)
3) См. Boot Process Flowсhart (стр.616)
Цитата(ViKo @ Jun 8 2010, 18:40) *
Цитирую мануал:
Т.е. загрузчик - это если указанную ножку держать в нуле при сбросе. Без этого - обычный старт - startup, main...

Из доки выходит, что если указанная ножка в нуле - загрузчик может перейти в к выполнению ISP, разумеется с учетом дополнительных условий - наличие/отсутсвие User Code (точнее соответсвия Criterion for Valid User Code) и наличие specific pattern in flash location at 0x000002FC (CRP1/CRP2/CRP3) smile.gif
Другое дело, что, как я понял, в случае рассматриваемого вторичного USB-бутлоадера при его прошивке устанавливается CRP3 - чип становиться "нечувствительным" к состоянию Р2.10 smile.gif
Student Pupkin
Наш Ленин в ссылке передал мне привет smile.gif
Цитата(vallav)
Что же Вы сразу не сказали, что у Вас были не вопросы, на которые Вас интересует ответ, а экзаменационные вопросы ко мне.
Я бы не пыхтел на них отвечать, тем более в лычку.
А Ваше - после реset_а производится аппаратная загрузка sp значением с адреса 0x1fff0000 и ip с адреса 0x1fff0004 - сильно...
Хотя правильно написали - все последующие загрузки sp и ip - программные...
Долго думали? И главное, зачем это делать - если проще сбросить ip на заранее заданное значение а в ПЗУ по этому адресу занести
нужный код? Очень хочется строчкам из UM придать хоть какой то смысл?
Этот ответ можете ( и желательно ) не публиковать на форуме.

Особенно фраза про поиск смысла в строчках UserManual-а - lol.gif


Извините - вы говорили, что это желательно на форуме не публиковать, но я посчитал нужным еще раз показать всем ваше неумение вести разговор нормально.
mrKirill
Student Pupkin, оставьте цитирование слов vallav. Он получил наказание заслуженно. Пусть подумает и сделает выводы (что вряд ли, но надежда есть). Или Вам заняться нечем?
Смотрите...и Вас прикроют за пособничество smile.gif
zltigo
Цитата(ViKo @ Jun 8 2010, 17:40) *
Цитирую мануал:

Не правильное токование sad.gif. Загрузчик у LPC запускается всегда - занимается разборками с защитой, и считыванием той самой ножки.
Это все софтовые действия. Процесс запуска этого загрузчика ядром Corteх ничем не отличается от запуска любого другого кода, в том числе и в контроллерах не имеющих загрузчиков.

Цитата(Student Pupkin @ Jun 8 2010, 21:36) *
Наш Ленин...

Admin:
Заканчиваем с приветами. У него "до осени" самостоятельная работа над ошибками.
Цитата
но я посчитал нужным еще раз показать всем ваше неумение вести разговор нормально.

Вот если считаете, что для Вас это "все нормально", то можете продолжать с ним личную переписку.
ViKo
Т.е., загрузчик по данной ножке определяет, что ему делать - работать самому или перейти на пользовательскую программу?
zltigo
Цитата(ViKo @ Jun 9 2010, 11:08) *
Т.е., загрузчик по данной ножке определяет, что ему делать - работать самому или перейти на пользовательскую программу?

Да, именно так.
ViKo
Творческие люди работают в NXP - и GPIO на отдельную шину посадили, и с загрузчиком "извратились" smile.gif Наверное, и еще найдется особенностей.
Я работаю с STM32, так как-то более "классически" все сделано.
Но в будущем подумываю переметнуться на NXP.
sonycman
В STM32 что хорошо - ОЗУ представляет из себя единый непрерывный блок памяти, к примеру - 64 кб.

В LPC1768 же ОЗУ разделено на два банка.
То есть захочу я получить непрерывный блок размером в 40 килобайт - облом?

Неудобно получается sad.gif

И менеджер кучи ведь будет работать только с 32 килобайтами одного из банков.
А с "периферийным" 32-ух килобайтным куском как работать? Ручками?
aaarrr
Цитата(sonycman @ Jun 9 2010, 14:43) *
То есть захочу я получить непрерывный блок размером в 40 килобайт - облом?

А оно часто бывает необходимо и неизбежно - отдавать почти всю память единым куском подо что-то?

Цитата(sonycman @ Jun 9 2010, 14:43) *
И менеджер кучи ведь будет работать только с 32 килобайтами одного из банков.

Нормальные менеджеры могут работать с несколькими пулами.
zltigo
Цитата(sonycman @ Jun 9 2010, 13:43) *
И менеджер кучи ведь будет работать только с 32 килобайтами одного из банков.

На этом форуме можете найти мой простенький менеджер, который, тем не менее, банков поддерживает любое количество.



Цитата(ViKo @ Jun 9 2010, 12:24) *
и GPIO на отдельную шину посадили

и за счет этого добились определенных результатов, не правда-ли?
Цитата
, и с загрузчиком "извратились" smile.gif

Да, да и загрузчик не поленились предоставить в распоряжение пользователя.
Цитата
Наверное, и еще найдется особенностей.

Конечно, найдутся, тот-же 128 Flаsh они первые сделали.
ViKo
Цитата(zltigo @ Jun 9 2010, 16:11) *
и за счет этого добились определенных результатов, не правда-ли?

Так я что, я не против smile.gif Я и сам присматриваюсь к ним.
Цитата
Да, да и загрузчик не поленились предоставить в распоряжение пользователя.

У STM32 тоже есть, только перемычки BOOT переставить... И не стираемый, наверное.
Цитата
Конечно, найдутся, тот-же 128 Flаsh они первые сделали.

128-битовый? И за счет этого могут работать на частоте до 120 MHz? Это хорошо. Но, наверное, если не скакать по коду.
zltigo
Цитата(ViKo @ Jun 9 2010, 16:40) *
Но, наверное, если не скакать по коду.

Ну не каждую-же команду скакать. А эффективность на LPC17xx уже не сможете оценить sad.gif - официальный способ отключения, в отличии от их LPC2xxx не описан. А так FLASH у NXP самый обыденный - 50ns.
sonycman
Цитата(zltigo @ Jun 9 2010, 17:11) *
На этом форуме можете найти мой простенький менеджер, который, тем не менее, банков поддерживает любое количество.

А в нём можно при запросе указать, из какого пула требуется выделить память?

Или это не требуется?
zltigo
Цитата(sonycman @ Jun 9 2010, 17:56) *
Или это не требуется?

Ума не приложу, зачем-бы это было надо, но можете допилить, а на самом деле пользоваться и каждым пулом отдельно. Я иногда, в борьбе с фрагментацией выделяю этим менеджером блок памяти, а затем отдаю указатель на него еще одному такому-же менеджеру.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.