Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Несколько вопросов по lpc176x
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Страницы: 1, 2, 3
vallav
1. Почему у него такая странная распиновка выводов?
На 100 ногах нашли место только для 70 gpio, причем ни одного целого 32х битного регистра, всего один целый 16 битный а разбросаны
и перемешаны они - мама не горюй! Наследие тяжелого прошлого?
Как красиво с этим у ST32 - 5 16 битных регистров и почти все ножки в ряд.

2. 12 тактов входа в прерывание и 12 тактов выхода из него ( обязательных ) преподносится как достижение.
Вроде достижением было у ADSP 218x - полтора такта до первой команды в прерывании и 1 такт на выход.

3. Меня интересует, в lpc176x ПДП такое же тормозное....
Правда, по слухам, до кортексов у АРМа с этим было еще хуже.
zltigo
Цитата(vallav @ Apr 12 2010, 18:44) *
1. Почему у него такая странная распиновка выводов?

Вопрос риторический? Или как? Если или как, то видимо Вас забыли спросить, как и по каким критериям им проектировать чипы. Думаю, что Вам следует немедленно связаться и направить на путь истинный.
Цитата
2. 12 тактов входа в прерывание и 12 тактов выхода из него ( обязательных ) преподносится как достижение.
Вроде достижением было у ADSP 218x - полтора такта до первой команды в прерывании и 1 такт на выход.

Отличный результат. А как ADSP за полтакта, например, в стек регистры запихивал? Нет? Тогда может стоит для начала банально зайти не на gaw.ru а на arm.com и так сказать приникнуть к первоисточнику. Там все по тактам расписано.
Цитата
по слухам, до кортексов у АРМа с этим было еще хуже.

Реализация DMA контроллера и M3 ядро, равно и как ARM7 ядро вещи разные. Слухи в другом месте, пожалуйста, обсуждайте.
Аматер
Зато NXP сохранил совместимость по ногам с ARM7. По этому надеюсь проблем перейти с LPC236x на LPC176x не будет.
Кроме того по цене-производительности эти процессоры лучшии и наверное в основном из за этого самые распространенные.
sonycman
Можно под шумок спросить знатоков - сколько тактов уходит у LPC17xx на обращение к регистрам периферии?
К примеру, к регистрам таймеров?

Уважаемый Zltigo даже старается заменить такие обращения работой с простой ОЗУ...
vallav
Цитата(sonycman @ Apr 12 2010, 22:24) *
Можно под шумок спросить знатоков - сколько тактов уходит у LPC17xx на обращение к регистрам периферии?
К примеру, к регистрам таймеров?

Уважаемый Zltigo даже старается заменить такие обращения работой с простой ОЗУ...


Встречал, что, если код написан на ассемблере, внешней ногой можно дрыгать с тактовой частотой.


Цитата(zltigo @ Apr 12 2010, 21:25) *
Вопрос риторический? Или как? Если или как, то видимо Вас забыли спросить, как и по каким критериям им проектировать чипы. Думаю, что Вам следует немедленно связаться и направить на путь истинный.


Вы не поняли. Меня интересовало - зачем такая разводка сделана.
И еще одно - почему нет сигнала о том, что с ног значения прочитались или значения на ногах изменились?
Или gpio в данном проце просто так, для красоты?


Цитата(zltigo @ Apr 12 2010, 21:25) *
Отличный результат. А как ADSP за полтакта, например, в стек регистры запихивал? Нет? Тогда может стоит для начала банально зайти не на gaw.ru а на arm.com и так сказать приникнуть к первоисточнику. Там все по тактам расписано.


Вот так и запихивал. Но не за полтакта, а за такт.
Правда я ошибся - от асинхронного сигнала первая команда прерывания начинает исполняться через 2.5 такта.
Метостабильность давить надо.
От внутреннего ( таймера ) через 1 такт.

Вы банально на arm.com заходили?
Ссылочку на файл, аналогичный приведенному мной, но про lpc176x не приведете?
Про общие описания ядра cortex-M3 ссылки приводить не надо.
Интересует конкретная реализация lpc176x у NXP и ее отличия ( в тактах ) от других компаний.
Странно конечно, что искать это Вы на АРМе предлагаете, но Вам виднее...

Цитата(zltigo @ Apr 12 2010, 21:25) *
Реализация DMA контроллера и M3 ядро, равно и как ARM7 ядро вещи разные. Слухи в другом месте, пожалуйста, обсуждайте.


Я в курсе.
По заданному вопросу что либо ответить сможите?
Сколько тактов занимает передача по ПДП от gpio в ОЗУ?
sonycman
Цитата(vallav @ Apr 13 2010, 09:21) *
Встречал, что, если код написан на ассемблере, внешней ногой можно дрыгать с тактовой частотой.

С тактовой частотой - это, к примеру, с частотой 100 МГц?
Сильно в этом сомневаюсь smile.gif

Аппаратно ещё может быть достигнута частота в районе 50 МГц, но программно реальная цифра - около 10 МГц.
Имхо.

Цитата(vallav @ Apr 13 2010, 09:21) *
Вот так и запихивал. Но не за полтакта, а за такт.

Cortex-M3 при входе в прерывание аппаратно сохраняет на стёке 8 32 битных регистров.
Соответственно, при выходе - их восстанавливает.
Отсюда такая задержка.

Опять же сомнительно, что указанный вами проц за такт успевает сделать что-то подобное.
zltigo
Цитата(vallav @ Apr 13 2010, 07:21) *
Встречал, что, если код написан на ассемблере, внешней ногой можно дрыгать с тактовой частотой.

Ха!
Цитата
Вот так и запихивал. Но не за полтакта, а за такт.

Даже смеяться не буду. Документация, однако:
Код
Interrupt Latency
For the timer, IRQx, and SPORT interrupts, latency is at least three full
cycles from the time when an interrupt occurs to the time when the first
instruction of the service routine is executed. This latency is shown in
Figure3-2. Two cycles are required to synchronize the interrupt inter-
nally, assuming that setup and hold times are met (for the IRQx input
pins).

Итого не менее 3x, до 4x тактов, но там дальше и дополнение есть:
Код
Since interrupts are only serviced on instruction boundaries, before execu-
tion continues, the instruction(s) executed during these two cycles must
be fully completed, including any extra cycles inserted due to Bus
Request/Bus Grant or memory wait states.

Посему и более 4x тактов. Финиш.

Цитата
Вы банально на arm.com заходили?

И Вам советую. Контроллер прерывания у Cortex-M3, отличие от напимер ARM7, в ядре и про "12 тактов" можете смело читать.
Цитата
Я в курсе.

Да? К чему тогда был опус с тем, что "до кортексов у АРМа с этим было еще хуже", если Вы были "в курсе", что от ядра и соответственно от компании ARM это не зависит?
Student Pupkin
Цитата(vallav @ Apr 13 2010, 09:21) *
Про общие описания ядра cortex-M3 ссылки приводить не надо.
Интересует конкретная реализация lpc176x у NXP и ее отличия ( в тактах ) от других компаний.

А что, у NXP есть чиста конкретная cool.gif реализация ядра Cortex-M3? Я всегда думал, что NXP и другие компании просто купили и "вставили" в свои МК "готовое" IP-ядро - процессор Cortex-M3, в состав которого входит и NVIC... И поэтому тут пофиг чей микроконтроллер - NXP, ST, Luminary... "Миландр" smile.gif . А временные характеристики относительно обработки прерываний и у них будут одинаковыми.
Или вы хотите сказать, что каждая компания, купившая у фирмы "ARM" IP-ядро процессора Cortex-M3, потом его напильником дорабатывает?
Цитата(vallav @ Apr 13 2010, 09:21) *
Вы банально на arm.com заходили?
Ссылочку на файл, аналогичный приведенному мной, но про lpc176x не приведете?
Странно конечно, что искать это Вы на АРМе предлагаете, но Вам виднее...

Вот... Все, что касается CPU Cortex-M3 - искать на arm.com, как на первоисточнике. Все остальное, что не относится к CPU Cortex-M3 - для каждого производителя микроконтроллеров это специфичные вещи.
Или я не прав? smile.gif

P.S. Как-то слишком резво вы на NXP набросились. smile.gif
vallav
Цитата(sonycman @ Apr 13 2010, 12:31) *
С тактовой частотой - это, к примеру, с частотой 100 МГц?
Сильно в этом сомневаюсь smile.gif

Аппаратно ещё может быть достигнута частота в районе 50 МГц, но программно реальная цифра - около 10 МГц.
Имхо.


Частота естественно не 100 а 50 мгц ( при 100 - тактовой ).
Сам я не пробовал, читал в конфе - на С++ не получается ( много мусора вставляется ) а на АСМ
импульсы длительностью 10 нсек на ноге - вполне.


Цитата(sonycman @ Apr 13 2010, 12:31) *
Cortex-M3 при входе в прерывание аппаратно сохраняет на стёке 8 32 битных регистров.
Соответственно, при выходе - их восстанавливает.
Отсюда такая задержка.

Опять же сомнительно, что указанный вами проц за такт успевает сделать что-то подобное.


Дык он этого и не делает.
Далеко не во всех прерываниях нужно столько регистров.
Он сохраняет в стеке только самое необходимое - адрес возврата и состояние ядра на момент прерывания.
А какие именно регистры обработчик будет портить - те пусть сам и сохраняет/восстанавливает.
Вроде для контроллера откликнуться на воздействие через 3 такта важнее, чем несколько лишних комманд в сложном
обработчике.


Цитата(zltigo @ Apr 13 2010, 13:25) *
Ха!

Даже смеяться не буду.

И Вам советую. Контроллер прерывания у Cortex-M3, отличие от напимер ARM7, в ядре и про "12 тактов" можете смело читать.

Да? К чему тогда был опус с тем, что "до кортексов у АРМа с этим было еще хуже", если Вы были "в курсе", что от ядра и соответственно от компании ARM это не зависит?


Вы когда насмеетесь, попробуйте все же хоть что либо осмысленное написать.
Или Вы только острить и хихикать умеете?


Цитата(Student Pupkin @ Apr 13 2010, 14:46) *
А что, у NXP есть чиста конкретная cool.gif реализация ядра Cortex-M3? Я всегда думал, что NXP и другие компании просто купили и "вставили" в свои МК "готовое" IP-ядро - процессор Cortex-M3, в состав которого входит и NVIC... И поэтому тут пофиг чей микроконтроллер - NXP, ST, Luminary... "Миландр" smile.gif . А временные характеристики относительно обработки прерываний и у них будут одинаковыми.
Или вы хотите сказать, что каждая компания, купившая у фирмы "ARM" IP-ядро процессора Cortex-M3, потом его напильником дорабатывает?

Вот... Все, что касается CPU Cortex-M3 - искать на arm.com, как на первоисточнике. Все остальное, что не относится к CPU Cortex-M3 - для каждого производителя микроконтроллеров это специфичные вещи.
Или я не прав? smile.gif

P.S. Как-то слишком резво вы на NXP набросились. smile.gif


В том то и дело, что дорабатывают и довольно нехило.
Не само ядро, а то, что ядро окружает.
Такты на операцию при этом получаются другими.
Да и сами операции по другому проводятся.
Например, в каналах ПДП у lpc176x есть буфера FIFO, а у ST32 - их нет.
И при закрытии канала ПДП нужно следить за очисткой этих буферов.
Есть надежда, что ПДП у lpc176x из за их наличия пошустрее работает по сравнению
с ST32.
Все, что касается ядра Cortex-M3 - можно искать на arm.com, а вот про конкретные особенности реализации
конкретного контроллера на этом ядре - полагаю там искать бесполезно.

В чем именно Вы увидали резвость?
В том, что удивился их распиновке gpio?
Полагаете, она у lpc176x - вполне обычная?
Или в том, что поинтересовался тем, за сколько тактов операции в нем свершаются?
Полагаете, этим интересоваться не очень этично?
Student Pupkin
Цитата(vallav @ Apr 13 2010, 14:55) *
Дык он этого и не делает.
Далеко не во всех прерываниях нужно столько регистров.
Он сохраняет в стеке только самое необходимое - адрес возврата и состояние ядра на момент прерывания...

Вот что пишут в "ARMv7-M Architecture Reference Manual"
Цитата
B1.5.6 Exception entry behavior
.
.
.
Eight 32-bit words are saved in descending order, with respect to their address in
memory, as listed:
xPSR, ReturnAddress(), LR (R14), R12, R3, R2, R1, and R0

То же самое на gaw.ru, только по-русски smile.gif .

Цитата(vallav @ Apr 13 2010, 15:06) *
В том то и дело, что дорабатывают и довольно нехило.
Не само ядро, а то, что ядро окружает.
Такты на операцию при этом получаются другими.
Да и сами операции по другому проводятся.
Например, в каналах ПДП...

Да, именно про это я и говорил. ПДП, например, не относится к ЦПУ, также как и ускорители выборки из flash-памяти и т.д. Поэтому все эти вещи производитель описывает в совем даташите/референс-мануале
Цитата(vallav @ Apr 13 2010, 15:06) *
Все, что касается ядра Cortex-M3 - можно искать на arm.com, а вот про конкретные особенности реализации
конкретного контроллера на этом ядре - полагаю там искать бесполезно.

Описание конкретного МК искать ясен пень бесполезно. С другой стороны - какие-то периферийные узлы какие-то производители не делают сами, а также покупают в виде IP-модулей у той же ARM. Например, у LPC24xx - Vectored Interrupt Controller (VIC). Поэтому в общем случае и поиск на arm.com может помочь, если:
1- вы знаете, что конкретно этот кусок периферии разработала ARM (производитель в документации об этом сказал);
2 - информации по конкретному периферийному узлу, которую предоставил производитель, вам по тем или иным причинам недостаточно.
Цитата(vallav @ Apr 13 2010, 15:06) *
В чем именно Вы увидали резвость?
В том, что удивился их распиновке gpio?

Да smile.gif . Разумного ответа дать никто не сможет. Но появится повод еще раз устроить батл NXPvsST или что-то в этом роде. Но я вообщем-то тут нет никто и звать никак. Так что спрашивайте, не стесняйтесь smile.gif .
zltigo
Цитата(vallav @ Apr 13 2010, 13:06) *
Вы когда насмеетесь, попробуйте все же хоть что либо осмысленное написать.
Или Вы только острить и хихикать умеете?

Простите, но в отличие от Вас, транслирующего сюда, байки, я хоть немного, но осмысленного уже написал. Теперь могу и похихикать в ответ на очередную байку.
Ответа мой вопрос, естественно нет, но судя по всему Вы стремительно прогрессируете в изучении архитектуры. Это радует!
vallav
Цитата(Student Pupkin @ Apr 13 2010, 15:31) *
Вот что пишут в "ARMv7-M Architecture Reference Manual"

То же самое на gaw.ru, только по-русски smile.gif .


Извините, Вы о чем?
Разве я отрицал то, что lpc176x сохраняет и восстанавливает кучу регистров?
Я вроде интересовался - а зачем?
Чтобы сэкономить несколько комманд в сложных обработчиках ценой задержки реакции на
прерывание в простых?

Цитата(Student Pupkin @ Apr 13 2010, 15:31) *
Да, именно про это я и говорил. ПДП, например, не относится к ЦПУ, также как и ускорители выборки из flash-памяти и т.д. Поэтому все эти вещи производитель описывает в совем даташите/референс-мануале

Описание конкретного МК искать ясен пень бесполезно. С другой стороны - какие-то периферийные узлы какие-то производители не делают сами, а также покупают в виде IP-модулей у той же ARM. Например, у LPC24xx - Vectored Interrupt Controller (VIC). Поэтому в общем случае и поиск на arm.com может помочь, если:
1- вы знаете, что конкретно этот кусок периферии разработала ARM (производитель в документации об этом сказал);
2 - информации по конкретному периферийному узлу, которую предоставил производитель, вам по тем или иным причинам недостаточно.

Да smile.gif . Разумного ответа дать никто не сможет. Но появится повод еще раз устроить батл NXPvsST или что-то в этом роде. Но я вообщем-то тут нет никто и звать никак. Так что спрашивайте, не стесняйтесь smile.gif .


То есть, Вы предлагаете странности реализации не обсуждать?
А просто ждать и надеятся - а вдруг...


Цитата(zltigo @ Apr 13 2010, 15:33) *
Простите, но в отличие от Вас, транслирующего сюда, байки, я хоть немного, но осмысленного уже написал. Теперь могу и похихикать в ответ на очередную байку.
Ответа мой вопрос, естественно нет, но судя по всему Вы стремительно прогрессируете в изучении архитектуры. Это радует!


А понял!
У Вас эта штука ( ну которыми крутые меряются ) уже отросла настолько длинной,
что Вы способны только острить и хихикать...
Тады продолжайте, не буду Вам мешать. ( я же не знал, что Вы такой крутой ... )
Student Pupkin
Цитата(vallav @ Apr 13 2010, 15:56) *
Извините, Вы о чем?
Разве я отрицал то, что lpc176x сохраняет и восстанавливает кучу регистров?

Виноват smile.gif .
Цитата(vallav @ Apr 13 2010, 15:56) *
Я вроде интересовался - а зачем?
Чтобы сэкономить несколько комманд в сложных обработчиках ценой задержки реакции на
прерывание в простых?

Чего-нибудь приплести в оправдание необходимости сохранения 6-ти регистров (xPSR и PC - это не обсуждается smile.gif ) наверное можно.
Цитата(vallav @ Apr 13 2010, 15:56) *
То есть, Вы предлагаете странности реализации не обсуждать?
А просто ждать и надеятся - а вдруг...

Нет smile.gif . Обсуждать надо. С целью smile.gif .
vallav
По gpio ответ вроде такой - оно в lpc176x не предназначено для паралельного ввода/вывода, поэтому не важно, сколько битов регистра
выведено и как они расположены.
Хотя задел для чипа, в котором ввод/вывод будет - неплохой. Проц может выводить за такт и похоже читать за такт.
Вот сколько тактов идет обмен словом gpio - ОЗУ не понятно. Но вряд ли за один.

Еще вопрос -
Из:
http://ics.nxp.com/support/faq/microcontrollers/lpc17xx/

Q Which debug and trace functions are integrated within the LPC17xx?
A The LPC17xx supports standard JTAG (5 pin), ARM Serial Wire Debug and Trace functions (Serial Wire Output), and parallel trace functions (ETM trace data—4 bits).

Q Is Boundary Scan available on the LPC1700 series?
A No. Boundary Scan is not currently available on the LPC1700 series.

То есть, по JTAG есть только дебагер и больше ничего?
Или дебагер по JTAG тоже не работает?
vallav
Может кто либо все же в курсе - сколько тактов занимает пересылка слова из gpio в ОЗУ по ПДП
в lpc176x ( если пересылается длинный блок )?
igorsk
Цитата(vallav @ Apr 13 2010, 06:21) *
И еще одно - почему нет сигнала о том, что с ног значения прочитались или значения на ногах изменились?
Или gpio в данном проце просто так, для красоты?

Есть GPIO interrupt на портах 0 и 2, можно конфигурировать срабатывание по edge (rising/falling/both) или level (high/low). Про "прочитались" не очень понял.

Цитата(vallav @ Apr 15 2010, 06:40) *
По gpio ответ вроде такой - оно в lpc176x не предназначено для паралельного ввода/вывода, поэтому не важно, сколько битов регистра
выведено и как они расположены.

Есть и параллельный вывод. Можно одной инструкцией выставить значения 8/16/32 ножек любого порта, с маскировкой при необходимости (FIOxPIN/FIOxMASK).

Цитата(vallav @ Apr 15 2010, 06:40) *
Q Which debug and trace functions are integrated within the LPC17xx?
A The LPC17xx supports standard JTAG (5 pin), ARM Serial Wire Debug and Trace functions (Serial Wire Output), and parallel trace functions (ETM trace data—4 bits).

Q Is Boundary Scan available on the LPC1700 series?
A No. Boundary Scan is not currently available on the LPC1700 series.

То есть, по JTAG есть только дебагер и больше ничего?
Или дебагер по JTAG тоже не работает?

Отладчик по JTAG и работает. А что ещё нужно?

Цитата(vallav @ Apr 20 2010, 17:04) *
Может кто либо все же в курсе - сколько тактов занимает пересылка слова из gpio в ОЗУ по ПДП
в lpc176x ( если пересылается длинный блок )?

Так одного слова или длинного блока? Конкретной информации не нашел, но думаю, что без учета расходов на начало/конец передачи скорость должна быть как раз 1 слово/такт.
vallav
Цитата(igorsk @ Apr 24 2010, 06:05) *
Есть GPIO interrupt на портах 0 и 2, можно конфигурировать срабатывание по edge (rising/falling/both) или level (high/low). Про "прочитались" не очень понял.


Не понял, что Вы предлагаете.
Так конечно можно процессору просигналить, что новое слово на ножках установлено и он его может прочитать.
Но это требует затрат минимум 26 тактов.
Это слишком медленно.
Интересует другой вариант, когда внешнее устройство достаточно быстрое и по сигналу от контроллера - данные приняты достаточно быстро
выставляет следущие данные.
А по сигналу от контроллера - данные выставлены достаточно быстро их считывает.
То есть. быстродействие ограничено только процессором.
Про "прочиталось" -это сигнал для внешнего устройства, что данные прочитаны и можно выставлять следующие.


Цитата(igorsk @ Apr 24 2010, 06:05) *
Есть и параллельный вывод. Можно одной инструкцией выставить значения 8/16/32 ножек любого порта, с маскировкой при необходимости (FIOxPIN/FIOxMASK).

Можно. Но во первых нет ни одного сплошного 32х битного и есть всего один сплошной 16х битный в старших разрядах и разбросанный по кусочкам.
Ну Выставили Вы данные ( процессор вроде способен сделать это за 10 нсек ) и что дальше?
Как внешнему устройству узнать, что данные можно читать?



Цитата(igorsk @ Apr 24 2010, 06:05) *
Отладчик по JTAG и работает. А что ещё нужно?

То, для чего JTAG изначально предназначался - проверка целостности платы.
Это называется - Boundary Scan.
Вот я и засомневался, может в нем JTAG просто для красоты...


Цитата(igorsk @ Apr 24 2010, 06:05) *
Так одного слова или длинного блока? Конкретной информации не нашел, но думаю, что без учета расходов на начало/конец передачи скорость должна быть как раз 1 слово/такт.


Одного слова в блоке.
И запись в циклический буфер в ОЗУ.
Одно слово на такт - это было бы замечательно, а если и чтение и установка начала и длины следующего блока делается в фоне
( без перерыва в пересылке ) было бы просто великолепно.
Хотя при отсутствии сигнала - "прочитано" и достаточно бессмысленно.

Но описание ST32, в котором такты на ПДП расписаны ( там по описанию 6 тактов на слово а в приведенном примере пересылки 22 такта на
слово ) - вносит некие сомнения.
evgen2
Цитата(vallav @ Apr 12 2010, 20:29) *
Вроде достижением было у ADSP 218x - полтора такта до первой команды в прерывании и 1 такт на выход.


Что толку от этих тактов, если на сях прерывание съедало до сотни (не помню уже точно) тактов ?
vallav
Цитата(evgen2 @ Apr 29 2010, 02:14) *
Что толку от этих тактов, если на сях прерывание съедало до сотни (не помню уже точно) тактов ?


Дык кто же на сях пишет критичиские по времени реакции обработчики прерываний?

Да и основной код на этот проц писать на сях - это извращение - из конфетки делать г..но.
sonycman
Цитата(vallav @ Apr 29 2010, 08:41) *
Да и основной код на этот проц писать на сях - это извращение - из конфетки делать г..но.

Да ну? biggrin.gif
Понимаю, ещё какая нибудь тинька была с 256 байтами флеш и простейшая прошивка, но "дура" кортекс с кучей ресурсов и огромной скоростью, способная тянуть массивные и сложные программы и ОС.

Всё на асме? Не смешите мои тапки laughing.gif
vallav
Цитата(sonycman @ Apr 29 2010, 13:21) *
Да ну? biggrin.gif
Понимаю, ещё какая нибудь тинька была с 256 байтами флеш и простейшая прошивка, но "дура" кортекс с кучей ресурсов и огромной скоростью, способная тянуть массивные и сложные программы и ОС.

Всё на асме? Не смешите мои тапки laughing.gif


Вы не поняли. Как раз под кортекс писать на асме - извращение.
Даже критические по времени обработчики прерывания.
Так как получится практически то же самое, что на сях.
Если конечно на полную задействовать на сях все специальные опции для кортекса.
Какая разница, 15 тактов будет до первой реакции или 18...

Речь же шла про ADSP-21xx - чип от ADI.
Там есть разница, на четвертом или на 7 такте будет реакция.
Да и вся остальная его кухня на сях просто не готовится.
sonycman
Цитата(vallav @ Apr 29 2010, 15:41) *
Вы не поняли. Как раз под кортекс писать на асме - извращение.

Тогда прошу прощения beer.gif
vallav
Пока парился, появилось еще несколько вопросов.
1. Во многих местах написано - после сброса процессор начинает выполнять программу с адреса 0x00000000.
Но встретил и такое - после сброса процессор загружает sp значением по адресу 0x00000000, ip значением по адресу 0x00000004.
И - после сброса процессор начинает выполнято программу из ROM...
И при выполнении неких условий переходит к выполнению программы из флеши.
Одно из условий - во флеш загружена пользовательская программа.
Это что за условие? Встречал такое - битовый XOR по первым семи словам флеши равен нулю.
И в каком именно виде проц вываливается во флешь?

Я не ошибаюсь, для кортекса инлайн ассемблер в принципе недоступен или это всего навсего заморочки Кейла?
И остается только интринсик...

Это только у меня инлайн хелп в Кейле недоделанный?
И приходится лезть в соответствующее описание, делать в нем поиск по данному слову и искать среди кучи найденного.
igorsk
У вас все перемешано - ARM, Cortex-M и особенности процессоров NXP.
Выполнение с адреса 0 начинается в "больших" армах - ARM7/9/11 и Cortex-A/R. В Cortex-M используется таблица векторов. Первый указатель в ней - значение SP, второй - вектор Reset_Handler.
У процессоров NXP действительно имеется бутлоадер, который выполняется при сбросе, и только после проверки передаёт управление пользовательской программе. Подробности - LPC17xx User Manual, глава 32, раздел 3.1.1 - Criterion for Valid User Code.
vallav
Цитата(igorsk @ May 24 2010, 03:36) *
У вас все перемешано - ARM, Cortex-M и особенности процессоров NXP.
Выполнение с адреса 0 начинается в "больших" армах - ARM7/9/11 и Cortex-A/R. В Cortex-M используется таблица векторов. Первый указатель в ней - значение SP, второй - вектор Reset_Handler.
У процессоров NXP действительно имеется бутлоадер, который выполняется при сбросе, и только после проверки передаёт управление пользовательской программе. Подробности - LPC17xx User Manual, глава 32, раздел 3.1.1 - Criterion for Valid User Code.


Вы прочли?
И что - это побитовое исключающее или первых 8 слов флешки?
Или - check-sum of table entries 0 through 6 - это что то другое? Тогда что?

И Вы уверены, что в ARM7/9/11 и Cortex-A/R после сброса выполняется команда - B 0x00000000?

Вы уверены, что после сброса в кортексе выполняется - в sp - значение слова по адресу 0x00000000 и переход по адресу во втором
слове, или это иммитирует бутлоадер?
goodwin
Цитата(vallav @ May 24 2010, 09:01) *
Вы прочли?
И что - это побитовое исключающее или первых 8 слов флешки?
Или - check-sum of table entries 0 through 6 - это что то другое? Тогда что?

И Вы уверены, что в ARM7/9/11 и Cortex-A/R после сброса выполняется команда - B 0x00000000?

Вы уверены, что после сброса в кортексе выполняется - в sp - значение слова по адресу 0x00000000 и переход по адресу во втором
слове, или это иммитирует бутлоадер?


А вы кто - следователь прокуратуры?
RTFM!
А то вишь-ли ноги ему не нДравятся...
vallav
Цитата(goodwin @ May 24 2010, 09:14) *
А вы кто - следователь прокуратуры?
RTFM!
А то вишь-ли ноги ему не нДравятся...


Ну да. Жуй, что дают и не задавай вопросов...
Правильно?
sonycman
Цитата(vallav @ May 24 2010, 09:01) *
И что - это побитовое исключающее или первых 8 слов флешки?
Или - check-sum of table entries 0 through 6 - это что то другое? Тогда что?

А Вы проверьте - скомпилируйте прошивку для кортекса от NXP и сравните контрольное слово - простая это сумма или ксорка?
vallav
Цитата(sonycman @ May 24 2010, 12:57) *
А Вы проверьте - скомпилируйте прошивку для кортекса от NXP и сравните контрольное слово - простая это сумма или ксорка?


Другой вариант - прежде чем задать вопрос - найди сам на него ответ...
Чуть лучше предыдущего...
Я в курсе, что можно залезть во флеш и посмотреть - что именно записано в ее начале.
В фале на заливку в начале слова такие:
10008000
00000211
00000219
0000021b
0000021d
0000021f
00000221
00000000
Жду Вашей версии.
igorsk
Цитата(vallav @ May 24 2010, 06:01) *
Вы прочли?
И что - это побитовое исключающее или первых 8 слов флешки?
Или - check-sum of table entries 0 through 6 - это что то другое? Тогда что?

Обычное сложение.
vallav
Цитата(igorsk @ May 24 2010, 19:17) *
Обычное сложение.


Увы не получается. Обычное сложение не проходит.
В стартапе от Кейла вообще ничего специального в восьмое слово не пишется, оно просто нулевое.
Было подозрение, что линкер придает восьмому слову нужное значение.
Но в загрузочном файле нули. Неужели загрузчик это делает?

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

Хотя стартап заносит в sp значение первого слова и делает переход по адресу во втором слове.
Недавно вычитал - стартап еще кое что делает - заносит в один из регистров системного таймера значение, которое соответствует 10 миллисекундным тикам при тактовой в 100 мегагерц.

Но как коряво написано описание таймеров в юзерманьюале...
Вдохновляет только одно - их в данном чипе много и они все 100 мегагерцовые и прилично наворченные...
sonycman
Если контрольная сумма отсутствует в файле прошивки, значит, она вычисляется и подставляется в процессе записи во флеш.

Таймеры мне чем понравились, это тем, что они 32 битные, а не 16 как в STM.
В том, что они работают на частоте ядра, нет ничего удивительного.
vallav
Цитата(sonycman @ May 24 2010, 23:35) *
Если контрольная сумма отсутствует в файле прошивки, значит, она вычисляется и подставляется в процессе записи во флеш.


Или вообще не вычисляется, а в описании - лажа.
Что намного более вероятно.


Цитата(sonycman @ May 24 2010, 23:35) *
Таймеры мне чем понравились, это тем, что они 32 битные, а не 16 как в STM.
В том, что они работают на частоте ядра, нет ничего удивительного.


Ага, для lpc17xx.
Есть кортексы, в которых это не так.
igorsk
Цитата(vallav @ May 25 2010, 06:05) *
Или вообще не вычисляется, а в описании - лажа.
Что намного более вероятно.

Залей прошивку в чип, прочитай назад и сравни.
vallav
Цитата(igorsk @ May 25 2010, 22:50) *
Залей прошивку в чип, прочитай назад и сравни.


Спасибо за очень ценный совет.

Ну ни в жисть бы сам не догадался...
mrKirill
Цитата(vallav @ May 26 2010, 12:45) *
Спасибо за очень ценный совет.
Ну ни в жисть бы сам не догадался...

//off-top
Свою манеру общения на форумах изменили бы на "помягче", а то глядишь скоро Вам вообще никто ничего отвечать не будет.
vallav
Цитата(mrKirill @ May 26 2010, 10:52) *
//off-top
Свою манеру общения на форумах изменили бы на "помягче", а то глядишь скоро Вам вообще никто ничего отвечать не будет.


А по мягче - это как?
Вот на данный ответ Вы бы как прореагировали ( если помягче )?
vallav
Вопрос по таймерам в lpc176x.
Есть ли внешний вход, который идет на счет не тактируясь клоком переферии?
А то получается, что частота внешнего клока должна быть не выше половины от тактовой...
Да и длительность любого из уровней больше длительности такта.
В пиках такой вход есть.
vallav
Скомпилил аппноуту AN10866 от NXP - secondary USB bootloader в Keil.
При компиляции что то там исправлял.
Загрузил в плату mbed - работает.
Только, так как прога занимает 8K флеша, опции на пользовательскую прогу надо немного поменять.
Штука очень удобная. Чип прикидывается флешкой на 500К.
Компилишь прогу в .bin. Удаляешь старый .bin с этой флешки, копируюешь туда новый, нажимаешь сброс - новая прога работает.
Добавить к mbed пришлось - кабель с разъемом от резанный от мышки и проводок, чтобы замыкать на землю p1.20.
Кому интересно, файлы привожу. Там usbboot1 - сам загрузчик, а blinki2 - мигалка светодиодами mbed_а.
vallav
Похоже рабочие исходники проги, которая после небольшой переделки позволит подключить lcp176x по USB к PCюку без промежуточных
чипов и без драйверов на максимальной скорости - неинтересны. Неужели это уже не актуально?
И еще, ну ладно загрузка проги через USB без наворотов неинтересна, а если ее дописать, чтобы она прикидывалась родным USB житагом
для Кейла и позволяла вести загрузку и отладку, эмулируя житаг?
Тоже не интересно? Что тогда будут делать многочисленные производители чипов переходников USB-UART и приставок житагов?
Да и плата с lpc176x будет как то не серьезно выглядеть - ни проводов ни деталей...
А если еще про USB обманывают и он будет работать на внутреннем RC генераторе - то вообще пипец.
Особенно если NXP все это защьет в ROM по просьбе трудящихся.

Ладно, тогда вернусь к начальной загрузке.
Слинковал я прогу для работы в ОЗУ целиком, вместе с таблицей прерываний.
Первые 8 слов загрузчика такие:
10000300 10000065 10000069 1000006b
1000006d 1000006f 10000071 00000000

Проверено, после включения питания работает.
И что будет, если после снятия сброса бутлоадер убедившись непонятно каким способом, что есть пользовательская прога,
первое слово загруpузит в sp и произведет переход по значению второго слова из таблицы прерываний?
А код переносить из флеши в ОЗУ и устанавливать битики в проце о том, что таблица прерываний не в нуле - кто будет? Загрузчик?
Так что в описании по этому поводу - полная лажа.
По моему мнению линкер по фиксированному адресу в начале флеша подключает свой кусок кода, который делает все начальные разборки.
И переход после отработки бутлоадера идет на этот адрес.
zltigo
Цитата(vallav @ May 29 2010, 14:21) *
Похоже рабочие исходники проги, которая....

представляет собой цельнотянутый и писанный "бангалорскими" программерами загрузчик от NXP, действительно все кому хотелось взяли на NXP обсудили очень давноооо....
Цитата
И что будет, если после снятия сброса бутлоадер убедившись непонятно каким способом

"Способ" описан в мануале по самое немогу. То, что Вы не можете воспринять написанное, это уже Ваши проблемы.
Цитата
Так что в описании по этому поводу - полная лажа.

Это в голове sad.gif
Цитата
По моему мнению линкер по фиксированному адресу в начале флеша подключает свой кусок кода, который делает все начальные разборки.

smile.gif. Скрипт исполняется при загрузке через JTAG, в нем все и устанавливается для работы в RAM и прямо передается управление. В остальных случаях этим занимается startup. Так уж в 'С' принято испокон веков.
vallav
Цитата(zltigo @ May 29 2010, 15:57) *
представляет собой цельнотянутый и писанный "бангалорскими" программерами загрузчик от NXP, действительно все кому хотелось взяли на NXP обсудили очень давноооо....

И в результате что?
Кстати у меня оригинал не компилился, пришлось ощибки исправлять.

Цитата(zltigo @ May 29 2010, 15:57) *
"Способ" описан в мануале по самое немогу. То, что Вы не можете воспринять написанное, это уже Ваши проблемы.

Вы это описание читали?
С приведенными мною 8 первыми словами во флешке согласовать смогете?
Или Вы только - болтать?

Цитата(zltigo @ May 29 2010, 15:57) *
smile.gif. Скрипт исполняется при загрузке через JTAG, в нем все и устанавливается для работы в RAM и прямо передается управление. В остальных случаях этим занимается startup. Так уж в 'С' принято испокон веков.


Увы, в startup_е нет даже инициализации sp. Именно с этого - а где же sp то инициализируется, я и начал ковырять startup.
И откуда startup_у знать, какую именно я раскладку памяти линкеру назначил?
Тем боле и startup и таблица прерываний в данном случае - в ОЗУ.
Что их туда из флеша при включении притания перемещает? Startup?

А то, что в 'C' принято испокон веков, в кортексах похерено.
Знаете, как в кортексном 'C' передача параметров в функцию происходит?

Вы бы лучше занимались тем, что у Вас хорошо получается - выписывание баньки, и не лезли туда,
где ничего не смыслите.
Можно я на Ваши глупости больше отвечать не буду?
Надеюсь это не против правил форума?
zltigo
Цитата(vallav @ May 29 2010, 15:26) *
Вы это описание читали?

Да. И даже понял. И вот это совершено спокойно написал: http://electronix.ru/forum/index.php?showt...60&start=60 оно этими самыми суммами и занимается в том числе.
Цитата
Увы, в startup_е нет даже инициализации sp.

Есть. Вот, например, у меня так:
Код
static unsigned long system_stack[STACK_SIZE] @ ".noinit";

__root const Vector_entry_u __vector_table[] @ ".intvec" =
{
    {                        // The initial stack pointer
    .stack_ptr = (unsigned long)system_stack + sizeof(system_stack)
                                                        },
    __iar_program_start,    // The RESET handler
    nmi_isr,                // The NMI handler
........


Цитата
Что их туда из флеша при включении притания перемещает? Startup?

Ага, ведь если-бы этим занимался Александр Сергеевич, это было-бы очень странно. А посему, при необходимости, как в startup инициализируются переменные в RAM, так и преносятся при необходимости и секции содержащие исполняемый код.
Цитата
А то, что в 'C' принято испокон веков, в кортексах похерено.
Знаете, как в кортексном 'C' передача параметров в функцию происходит?

Так-же, как в AVR, так-же, как в ARM, так-же, как в x86 с примерно 90x годов, когда, например у Watcom, появились первые соглашения о передаче параметров через регистры. Стандарт языка это вообще не нормирует, посему слова про 'C' пустые слова.
Цитата
Вы бы лучше занимались тем, что у Вас хорошо получается - выписывание баньки

Хорошо, и этому уделю внимание.
Цитата
Можно я на Ваши глупости больше отвечать не буду?

Только я на глупости, в том числе и Ваши, на форуме буду по прежнему стараться указывать. Дабы не плодились оные.
vallav
Ну вот видите, можете, когда захотите.

Цитата(zltigo @ May 29 2010, 17:49) *
Да. И даже понял. И вот это совершено спокойно написал: http://electronix.ru/forum/index.php?showt...60&start=60 оно этими самыми суммами и занимается в том числе.

И что, приведенные мной 8 первых слов во флеше у Вас дают нулевую контрольную сумму?
Что эта за контрольная сумма - "check-sum of table entries 0 through 6"?


Цитата(zltigo @ May 29 2010, 17:49) *
Есть. Вот, например, у меня так:
Код
static unsigned long system_stack[STACK_SIZE] @ ".noinit";

__root const Vector_entry_u __vector_table[] @ ".intvec" =
{
    {                        // The initial stack pointer
    .stack_ptr = (unsigned long)system_stack + sizeof(system_stack)
                                                        },
    __iar_program_start,    // The RESET handler
    nmi_isr,                // The NMI handler
........

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


Цитата(zltigo @ May 29 2010, 17:49) *
Ага, ведь если-бы этим занимался Александр Сергеевич, это было-бы очень странно. А посему, при необходимости, как в startup инициализируются переменные в RAM, так и преносятся при необходимости и секции содержащие исполняемый код.

А если прога на АСМе? И я хочу, чтобы она в ОЗУ работала?
То надо перенос кода в ОЗУ при включении притания самому писать и самому делать линковку неперемещаемых кусков?
Можно конечно. Но есть надежда, что это умеет делать стандартный линкер.


Цитата(zltigo @ May 29 2010, 17:49) *
Так-же, как в AVR, так-же, как в ARM, так-же, как в x86 с примерно 90x годов, когда, например у Watcom, появились первые соглашения о передаче параметров через регистры. Стандарт языка это вообще не нормирует, посему слова про 'C' пустые слова.

Стандарт языка так же игнорирует перенос кода из флеши в ОЗУ.
Значит Ваши слова про стартап - это пустые слова?



Вы упустили два вопроса.
1. Чем именно закончилась дискуссия по "цельнотянутый и писанный "бангалорскими" программерами загрузчик от NXP", который NXP
разместила у себя в качестве аппноты.
Можно на его основе написать общение между чипом и прогой в PC_юке по USB без использования дополнительных чипов и специально устанавливаемых
драйверов, причем на приличной скорости?
2. Правильно ли, что после сброса происходит загрузка в sp значения первого слова флеши и переход по адресу, равному значению второго слова флеши?
И что перед этим переносит код в ОЗУ, если второе слово флеши указывает на ОЗУ.
И главное, как узнает, что и куда из флеши надо переносить.

Кстати, уменя получилось - когда и стартап и сама прога в ОЗУ - стандартный бутлоадер не справляется, а писанный "бангалорскими" - прогу
запускает и она работает. Это наверно потому, что он кривой?
Пока не получается таблицу прерываний в ОЗУ засунуть, но когда получится и "бангалорский" и такую запустит - значит он сильно кривой...
zltigo
Цитата(vallav @ May 30 2010, 07:54) *
И что, приведенные мной 8....

Без понятия, что за цифры Вы привели, и уж тем более какой загрузчик у Вас этот образ грузит - только не первичный, ибо он по определению
не занимается ничем, что не расположено с нулевого адреса. Его работа определить наличие исполняемой программы на нулевых адресах и если нашел, то запустить ее на иcполнение.
Цитата
Я говорил, что в стандартном стартапе от Кейла нет.
И как оказалось - и не нужно.
А ежели не лень или подстраховаться хочется, можно в своем написать.

Разумеется нужно, разумеется есть. Специально Вас тыкаю носом в то, что идет с Кейлом для LPC17xx:
Код
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x00000200

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

.......


; Vector Table Mapped to Address 0 at Reset

                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors

__Vectors       DCD     __initial_sp; Top of Stack
                DCD     Reset_Handler; Reset Handler
                DCD     NMI_Handler    ; NMI Handler

Цитата
Можно конечно. Но есть надежда, что это умеет делать стандартный линкер.

Оставте,наконец, глупейшие фантазии. Линкер только линкует. Копированием занимается подобный код инициализирующий
сегменты перед тем, ка будет вызван main().
Код
  char const * p = __section_begin("Region$$Table");
  uint32_t const * pe = __section_end("Region$$Table");
  uint32_t const * pi = (uint32_t const *)(p);
  while (pi != pe)
  {
    init_fun_t * fun = (init_fun_t *)((char *)pi + *(int32_t *)pi);
    pi++;
    pi = fun(pi);
  }


Цитата
"бангалорский" и такую запустит - значит он сильно кривой...

Он кривой, но устанавливать указатели на стек и таблицу векторов он должен уметь. Всего-то и делов занести адрес куда он образ загрузил в качестве адреса таблицы векторов, считать слово по нулевому смещению из образа и проинициализировать им указатель стека, ну и передать управление по адресу содержащимуся в первом слове образа. И все. Это по определению делает любой загрузчик, как первичный имеющийся у NXP, так и любой, в том числе вторичный USB кейловский. Эти-же нехитрые операции выполняются ядром при старте запуская программу. Только адрес строго фиксирован.
vallav
Цитата(zltigo @ May 30 2010, 11:00) *
Без понятия, что за цифры Вы привели, и уж тем более какой загрузчик у Вас этот образ грузит - только не первичный, ибо он по определению
не занимается ничем, что не расположено с нулевого адреса. Его работа определить наличие исполняемой программы на нулевых адресах и если нашел, то запустить ее на иcполнение.

Поясняю - это первые 8 слов флеша, начиная с нулевого адреса.
В случае, когда и стартап и прога слинкованы в ОЗУ.
Обратите внимание на второе слово - адрес перехода.
Как именно Ваш первичный загрузчик определяет наличие исполняемой программы на нулевых адресах?
То есть - что конкретно он делает, какой конкретный алгоритм?
Или - знаете, что определяет, но как именно - не знаете?


Цитата(zltigo @ May 30 2010, 11:00) *
Разумеется нужно, разумеется есть. Специально Вас тыкаю носом в то, что идет с Кейлом для LPC17xx:
Код
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x00000200

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

.......


; Vector Table Mapped to Address 0 at Reset

                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors

__Vectors       DCD     __initial_sp; Top of Stack
                DCD     Reset_Handler; Reset Handler
                DCD     NMI_Handler; NMI Handler


И где Вы тут обнаружили присвоение регистру sp значения __initial_sp?


Цитата(zltigo @ May 30 2010, 11:00) *
Оставте,наконец, глупейшие фантазии. Линкер только линкует. Копированием занимается подобный код инициализирующий
сегменты перед тем, ка будет вызван main().
Код
  char const * p = __section_begin("Region$$Table");
  uint32_t const * pe = __section_end("Region$$Table");
  uint32_t const * pi = (uint32_t const *)(p);
  while (pi != pe)
  {
    init_fun_t * fun = (init_fun_t *)((char *)pi + *(int32_t *)pi);
    pi++;
    pi = fun(pi);
  }

Ну вот опять.
Я не говорил, что такой код написать нельзя.
Я не говорил, что такого кода нет во флеши.
Я спрашиваю - как нечто, переписывющее код из флеши в ОЗУ до того, как сделать туда переход по адресу, равному значеню второго слова из флеша
узнает - где именно этот код?

А про линкер Вы оказывается совсем мало знаете.
Не пробовали - прежде чем здесь постить с таким апломбом - описание линкера почитать?


Цитата(zltigo @ May 30 2010, 11:00) *
Он кривой, но устанавливать указатели на стек и таблицу векторов он должен уметь. Всего-то и делов занести адрес куда он образ загрузил в качестве адреса таблицы векторов, считать слово по нулевому смещению из образа и проинициализировать им указатель стека, ну и передать управление по адресу содержащимуся в первом слове образа. И все. Это по определению делает любой загрузчик, как первичный имеющийся у NXP, так и любой, в том числе вторичный USB кейловский. Эти-же нехитрые операции выполняются ядром при старте запуская программу. Только адрес строго фиксирован.


Ну да, а вот родной ( из ПЗУ ) загрузчик прямой, но этого не умеет. Прога то им не запускается...
Вы лихо все расписали, но забыли - а что переносит код из флеша в ОЗУ перед "и передать управление по адресу содержащимуся в первом слове образа" и по какому адресу в флеше это находится.

В случае, когда стартап и программа в флеше, это адрес как раз равен значению второго ( в Ваших терминах первого ) слова в флеше.
А когда в этом слове адрес ОЗУ?

И по прежнему нет ответа на наиболее интересующий меня вопрос:

Чем именно закончилась дискуссия по "цельнотянутый и писанный "бангалорскими" программерами загрузчик от NXP", который NXP
разместила у себя в качестве аппноты.
Можно на его основе написать общение между чипом и прогой в PC_юке по USB без использования дополнительных чипов и специально устанавливаемых
драйверов, причем на приличной скорости?

Вы не стесняйтесь - если ответа не знаете, так и ответьте - не знаю.
zltigo
Цитата(vallav @ May 30 2010, 09:33) *
В случае, когда и стартап и прога слинкованы в ОЗУ.

Это видно.
Цитата
Как именно Ваш первичный загрузчик определяет наличие исполняемой программы на нулевых адресах?

В полном соответствии с алгоритмом описанном в мануале. Проверено электроникой начиная с LPC2114 и до нынешних времен.
Цитата
И где Вы тут обнаружили присвоение регистру sp значения __initial_sp?

Опять не читаем документацию и сосем из пальца фантазии? И ответы не читаем. Повторяю последний раз для особо одаренных - ядро Corteх делает загрузку двух регистров самостоятельно с фиксированных адресов один из них SP а второй, как всегда, PC
Цитата
Я не говорил, что такого кода нет во флеши.

Можете бредить и дальше, но подобный приведенному там есть smile.gif. Вызваеется из Кейловского __main() перед вызовом пользовательского main().
Цитата
Я спрашиваю - как нечто, переписывющее код из флеши в ОЗУ до того, как сделать туда переход по адресу, равному значеню второго слова из флеша узнает - где именно этот код?

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

Да. И даже в отличие от Вас для кого "....не писан, если писан, то не читан, если читан, но не понят, если понят, то не так"
даже все правильно понял, чем линкеры занимаются.
Цитата
Ну да, а вот родной ( из ПЗУ ) загрузчик прямой, но этого не умеет. Прога то им не запускается...

Повторяю, это не его работа запускать на автомате что либо находящееся не на нулевых адресах. Ручками - ручками через него - грузите, хоть во Flash, хоть в RAM и передавайте управление загруженному.
Цитата
Вы лихо все расписали

И все совершенно правильно.
Цитата
, но забыли - а что переносит код из флеша в ОЗУ перед "и передать управление по адресу содержащимуся в первом слове образа" и по какому адресу в флеше это находится.

Ничего не забыл. Этим занимается тот, кому это дело поручили - специализированный загрузчик, находящийся на нулевых адресах и которому в случае LPC передает управление первичный загрузчик.
Цитата
Чем именно закончилась дискуссия ...

Воспользуйтесь поиском.
Цитата
Можно на его основе написать....

Лично Вам это не по зубам. Расслабьтесь.
vallav
Цитата(zltigo @ May 30 2010, 12:44) *
Это видно.

В полном соответствии с алгоритмом описанном в мануале. Проверено электроникой начиная с LPC2114 и до нынешних времен.


Вы тупой?
Я уже четвертый раз у Вас спрашиваю - как?
Не знаете, так и скажите - не знаю.
Знаете, но согласны сказать за оплату, так и скажите - скажу за столько то.


Цитата(zltigo @ May 30 2010, 12:44) *
Опять не читаем документацию и сосем из пальца фантазии? И ответы не читаем. Повторяю последний раз для особо одаренных - ядро Corteх делает загрузку двух регистров самостоятельно с фиксированных адресов один из них SP а второй, как всегда, PC


Не, точно, не далекий.
Вы понимаете то, что Вам пишут?
Я писал - не удалось обнаружить, где в стартапе происходит инициализация sp.
Вы сначала выдаете кусок кода из стартапа, в котором по Вашему мнению это происходит, а затем заявляете - она и не должна нигде программно
делаться, так как делается аппаратно.


Цитата(zltigo @ May 30 2010, 12:44) *
Можете бредить и дальше, но подобный приведенному там есть smile.gif. Вызваеется из Кейловского __main() перед вызовом пользовательского main().


знаю, что есть.
Я не знаю, как он запускается. То есть как то, что инициализирует чип после сброса, его находит.
Но Вам похоже, объяснить это не удастся...


Цитата(zltigo @ May 30 2010, 12:44) *
Я же аж кусок исходника привел, но если уж, открытый текст не воспринимаете, то куда уж там исходники читать sad.gif. Код размещен в отбельной секции. Секция имеет имя согласно соглашению. Кусок кода, который копирует тоже знает это имя. Имя это адрес. Все.
В случае отдельного загрузчика в большинстве случаев это тупое соглашение о фиксированном адресе и размере. Но никто не запрещает, вполть до файловой системы городить, хоть внутри, хоть на внешнем носителе.


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


Цитата(zltigo @ May 30 2010, 12:44) *
Да. И даже в отличие от Вас для кого "....не писан, если писан, то не читан, если читан, но не понят, если понят, то не так"
даже все правильно понял, чем линкеры занимаются.


И вычитали, что этим - расстановкой кода и данных по заданным адресам и их слинковкой - не занимаются?
Хотя с Вашими умственными способностями - только апломб демонстрировать...

Цитата(zltigo @ May 30 2010, 12:44) *
Повторяю, это не его работа запускать на автомате что либо находящееся не на нулевых адресах. Ручками - ручками через него - грузите, хоть во Flash, хоть в RAM и передавайте управление загруженному.


Ну да? А чья? Ручками - это как?
После сброса выходить на связь с чипом через житаг и с клавиатуры размещать всю эту кухню ?
Отстали Вы от жизни однако.


Цитата(zltigo @ May 30 2010, 12:44) *
Ничего не забыл. Этим занимается тот, кому это дело поручили - специализированный загрузчик, находящийся на нулевых адресах и которому в случае LPC передает управление первичный загрузчик.


В том месте - забыли. У Вас там согласно описанию - после сброса - в sp первое слово, в ip второе и привет.
Теперь про нечто, до этого делающееся вспомнили. Тока вот пока никак до Вас не дойдет, что именно я спрашиваю - какой именно это адрес.
Его значение чему равно?
И правильно ( а не враки в описании ) - после сброса управление передается по такому то адресу.


Цитата(zltigo @ May 30 2010, 12:44) *
Воспользуйтесь поиском.


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


Цитата(zltigo @ May 30 2010, 12:44) *
Лично Вам это не по зубам. Расслабьтесь.


А вот это - не Вам судить.
Что Вы умеете, я примерно представляю - цельноутянуть нечто сделанное другими и выдав это за свое,
надувать щеки.

Как однако не хорошо.
Судя по - http://electronix.ru/forum/index.php?showt...st&p=765231
узнали от меня, что в стартапе нет загрузки регистра sp, но вместо того, чтобы поблагодарить - продолжаете меня хаять...
Хотя, это вполне в духе...
zltigo
Полный аут.
Цитата(vallav @ May 30 2010, 14:58) *
узнали от меня, что в стартапе нет загрузки регистра sp, но вместо того, чтобы поблагодарить...

smile.gif И как я до Вас жил и работал, писал стартапы и загрузчики в том числе и для Corteх, просто не понимаю. Все было-бы весело, если-бы не было так глупо.
В обеих примерах стартапа мною показаны моменты инициализации содержимого нулевого адреса, указателем на стек, ввиду абсолютной очевидности, того факта, что именно этим значением и инициализируется SP при старте, и этим-же значением уже программно инициализирует стек промежуточный загрузчик, если он есть. Непонимание Вами сего банального факта из жизни Cortex оказалось для меня уж слишком неожиданным.
toweroff
Цитата(vallav @ May 30 2010, 16:58) *
Не, точно, не далекий.
Вы понимаете то, что Вам пишут?
Я писал - не удалось обнаружить, где в стартапе происходит инициализация sp.
Вы сначала выдаете кусок кода из стартапа, в котором по Вашему мнению это происходит, а затем заявляете - она и не должна нигде программно
делаться, так как делается аппаратно.


вы точно в своем уме? все разжевали уже.

в этой цитате и вопрос, и ответ.

почитайте, наконец, офф доки... если сможете понять там что-то...
Cortex-M3 Technical Reference Manual, секция 5.9.1. Vector Table and Reset

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