Перейти к содержанию
    

Несколько вопросов по lpc176x

Ответы на все вопросы, кроме первого и частично третьего, данные vallav не верные,

 

Вы забыли дать правильные ответы.

Или их не дали по причине - характер не позволяет давать глупые ответы, даже на глупейше-пустейшие вопросы...

Изменено пользователем rezident
Излишнее цитирование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. Какой из них инициализируется аппаратно?

 

Ни какой. Но один из них инициализируется в коде инициализации.

Щас гляну, как он называется - во - MSP.

Почему до Вас никак не дойдёт, что один из указателей SP инициализируется аппаратно?

post-19695-1275830036_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему до Вас никак не дойдёт, что один из указателей SP инициализируется аппаратно?

 

Так я разве спорю.

Конечно, core reads the start sp...

 

Только как?

Мое мнение, в NXP не идиоты делать это аппаратно, когда это можно с тем же успехом сделать программно в коде инициализации.

Что там и делается.

Полагаете - просто на всякий случай? Код инициализации игнорирует значение sp при входе в него и записывает в sp ( программно )

значение, равное __initial_sp.

Кстати, задумайтесь - после сброса начинает работать бутлоадер.

У него sp откуда берется? Аппаратно устанавливается на 0xffffffff, если чип не целованный?

А если прога уже загружалась, то на то, что в первом слове флеша. Так?

И что бутлоадер с этим делает? Выкидывает и ставит свое значение?

А перед запуском проги читает значение из первого слова флеша и заносит его в sp?

Иде в этом логика?

Кстати - кривой бангладорский при запуски проги про sp даже не вспоминает. Что у него было, то и оставляет.

Как с этим у родного бутлоадера - пока не знаю.

Не надо свято верить тому, что напечатоно. И в печатных текстах бывают ошибки и казусы...

 

Кстати надо попробовать. Засунуть в первое слово флеша что нибудь отличное от __initial_sp и посмотреть, с какмим

sp прога в main вывалится. Если со значением __initial_sp - что делать будем?

 

И про ip. Полагаете, после сброса он загружается значением из второго слова флеша и бутлоадер стартует с этого адреса?

Или бутлоадер умеет игнорировать значение ip и стартует со своего адреса?

Попробуйте над этим задуматься.

Изменено пользователем rezident
Излишнее цитирование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В связи с предыдущим постом продолжаю вопросник:

1. Как называется фирма-разработчик ядра Corteх-M3 используемого фирмой NXP в контроллерах LPC17xx?

2. Какой блок памяти отображается на адрес 0x00000000 в LPC17xx после аппаратного ресета?

3. Что находится в этом блоке памяти?

4. Может-ли в качестве вектора Reset указан адрес функции написанный на языке высокого уровня, например, 'C'?

5. Использует-ли функция написанная на языке 'C' стек и для чего?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В связи с предыдущим постом продолжаю вопросник:

 

Я сейчас другим занят - жду от Вас правильных ответов на первый опросник.

Увы, пока их не будет...

Изменено пользователем rezident
Излишнее цитирование.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увы, пока их не будет...

"Студент"! Вы не поняли - семестр кончился - началась сессия. :). Но вопросы пока доброжелательно-наводящие, а не на засыпку.

Я сейчас другим занят

Пока не страшно. Сдача и пересдача экзаменов до осени. Потом отчисление :) :(.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"Студент"! Вы не поняли - семестр кончился - началась сессия. :).

 

Пока не страшно. Сдача и пересдача экзаменов до осени. Потом отчисление.

 

Кстати, Вы наверно будите удивлены, но в качестве адреса ресета может быть указана функция, написанная на C.

Если модуль с ней слинкован в флешь.

Не верите - а попробуйте.

Хотя - Вы же fabless...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, Вы наверно будите удивлены, но в качестве адреса ресета может быть указана функция, написанная на C.

Ответ правильный. Угадали? Но процент угадывания много ниже статистических 50% :(. Не везет :).

Теперь ответ на вопрос номер 5. И после подробнее насчет "идиотов":

Мое мнение, в NXP не идиоты делать это аппаратно, когда это можно с тем же успехом сделать программно в коде инициализации.

Что там и делается.

Не надо свято верить тому, что напечатоно. И в печатных текстах бывают ошибки и казусы...

и соответственно того, когда и кем указатель стека иницализируется до момента вызова этой самой первой функции.

Кстати, на вопросы надо отвечать на все - Вы слишком много вопросов пропускаете. Незачет будет!

Хотя - Вы же fabless...

С чего это Вы так тешите себя этой иллюзией :). Придется и с этой иллюзией Вас обломать. В На фото в приложении Cortex-M3 в двух экземпярах. Есть и третий.

post-1244-1275836712_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ответ правильный. Угадали?

Теперь ответ на вопрос номер 5. И после подробнее насчет "идиотов":

Неужели проверить успели?

Вот это скорость...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неужели проверить успели?

Проверять, получать результаты и не мочь их осмыслить и понять, что удел ламеров и недоучек. Нормальные люди действуют предварительно все продумав и наверняка - знают, что делают и все задуманное получается. Посему, давайте на заданные вопросы ищите ответы. Может поможет. Но я на этом вообще-то совершенно не настаиваю - вопросы задумывались прежде всего для других форумчан.

Вот это скорость...

Офигительная. Настоящая машина времени - на майские праздники пришли борды и тогда-же я портировал операционку, консольку, Ethernet, загрузчик и прочее. До этого, урывками почитывал первоисточники - ну думаю в сумме не менее 40 часов. Месяц тому назад еще сутки усиленного чтения и за 3 дня вышеупомянутое было поднято. Сейчас занимаюсь другим. Дней через 10 дней продолжу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините что вторгаюсь :) . Но у меня попкорн уже кончился :lol:

Так я разве спорю.

Конечно, core reads the start sp...

Только как?

Мое мнение, в NXP не идиоты делать это аппаратно, когда это можно с тем же успехом сделать программно в коде инициализации.

Что там и делается.

Я тоже думал, что бутлоадер переписывает из 0x0 константу в SP, а затем использует 0x4 как адрес перехода на пользовательскую программу. Правильно? Если не прав - поправьте меня.

Полагаете - просто на всякий случай? Код инициализации игнорирует значение 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 (правдя я не понял как вычисляется адрес :))

    Далее в документе "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 после сброса содержит не нули, а значение (какое - не знаю :)), благодаря которому таблицей веторов для ЦПУ 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, тут даже мне понятно :).

В конечном счете - NXP нигде никак не допиливают ЦПУ Cortex-M3. Они просто покупают его, возможно с какими-то опциями (которые все в доке от ARM описаны), и вставляют (грубо :)) в свой микроконтроллер (в книгах 20-30 летней давности был термин однокристальная микроЭВМ - может этот термин понятнее, прото ощущение, что вы не очень понимаете, где заканчивается творчество инженеров ARM и начинается творчество инженеров NXP). Возможно что и "опция" - это притяни вот эту ногу у себя в кристалле к нулю - будет это, а притяни к единице - будет то-то... Ну и прошивают в BOOTROM свою программу-загрузчик.

По-моему простая аналогия между производителем материнской платы и процессором от Intel, который в эту плату вставляется - получается ЭВМ :). Хочешь знать как работает процессор - читай доки от Intel. Хочешь знать, что есть на материнской плате и как с эим работать процессору - читай доки от производителя материнской платы.

Без обид :)

Изменено пользователем Student Pupkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Каюсь :) . Оказывается регистр VTOR к переотображению таблицы векторов (по умолчанию с 0х0) на область BOOTROM отношения не имеет :). Имеет отношение регистр MEMMAP. Но суть не меняется :)

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

програмно (переписывая константу из 0x0 в SP и выполняя переход по адресу, лежащему в 0х4)...

Не вижу нималейших причин делать иначе - отмапирована только таблица векторов сам bootloader исполняется всегда на своем месте, посему просто убирает свою таблицу векторов, считывает, устанавливает и запускает. Никаких ограничений на софтовую инициализацию MSP нет. У меня точно также мой загрузчик отрабатывает, только,естественно сам целиком находясь на нулевых адресах он еще и положение таблицы векторов основной программы устанавливает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще вопросик :) - MEMMAP делает переотображение на таблицу в BOOTROM. Т.е. в том числе и чтение первых 256 байт начиная с адреса 0х0000 на самом деле будет являться чтением первых 256 байт области BOOTROM? Значит загрузчику, прежде чем начать проверку пользовательской таблицы векторов (первых 6 слов) на "валидность", необходимо сначала установить MEMMAP в 1 (User Mode)? Ведь в ином случае она недоступна?

Правильно? (вопрос, чтобы просто кое-что себе в голове устаканить :))

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще вопросик :) - MEMMAP делает переотображение на таблицу в BOOTROM. Т.е. в том числе и чтение первых 256 байт начиная с адреса 0х0000 на самом деле будет являться чтением первых 256 байт области BOOTROM? Значит загрузчику, прежде чем начать проверку пользовательской таблицы векторов (первых 6 слов) на "валидность", необходимо сначала установить MEMMAP в 1 (User Mode)? Ведь в ином случае она недоступна?

Правильно? (вопрос, чтобы просто кое-что себе в голове устаканить :))

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

 

 

Проверено на железе - плата mbed c lpc1768.

Значение нулевого слова в флеше 0x0, 0xffff, 0xffffffff.

Два бутлоадера - родной и кривой бангалорский.

Прога - мигалка светодиодами грузится иработает.

То есть, чему равно нулевое слово в флеше - глубоко фиолетово.

Можно использовать в своих целях.

Первое слово в флеше - используется бутлоадером для запуска пользовательской проги.

При сбросе - ip вероятней всего имеет значение 0x1fff1ff1 - адрес начала последней строки ПЗУ ( ассоциации с x86 навевает ).

Есть такая IAP комманада - выход в ISP. Именно она после сброса и выполняется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...