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

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

Без понятия, что за цифры Вы привели, и уж тем более какой загрузчик у Вас этот образ грузит - только не первичный, ибо он по определению

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

Поясняю - это первые 8 слов флеша, начиная с нулевого адреса.

В случае, когда и стартап и прога слинкованы в ОЗУ.

Обратите внимание на второе слово - адрес перехода.

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

То есть - что конкретно он делает, какой конкретный алгоритм?

Или - знаете, что определяет, но как именно - не знаете?

 

 

Разумеется нужно, разумеется есть. Специально Вас тыкаю носом в то, что идет с Кейлом для 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?

 

 

Оставте,наконец, глупейшие фантазии. Линкер только линкует. Копированием занимается подобный код инициализирующий

сегменты перед тем, ка будет вызван 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 кейловский. Эти-же нехитрые операции выполняются ядром при старте запуская программу. Только адрес строго фиксирован.

 

Ну да, а вот родной ( из ПЗУ ) загрузчик прямой, но этого не умеет. Прога то им не запускается...

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

 

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

А когда в этом слове адрес ОЗУ?

 

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

 

Чем именно закончилась дискуссия по "цельнотянутый и писанный "бангалорскими" программерами загрузчик от NXP", который NXP

разместила у себя в качестве аппноты.

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

драйверов, причем на приличной скорости?

 

Вы не стесняйтесь - если ответа не знаете, так и ответьте - не знаю.

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


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

В случае, когда и стартап и прога слинкованы в ОЗУ.

Это видно.

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

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

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

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

Я не говорил, что такого кода нет во флеши.

Можете бредить и дальше, но подобный приведенному там есть :). Вызваеется из Кейловского __main() перед вызовом пользовательского main().

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

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

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

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

Да. И даже в отличие от Вас для кого "....не писан, если писан, то не читан, если читан, но не понят, если понят, то не так"

даже все правильно понял, чем линкеры занимаются.

Ну да, а вот родной ( из ПЗУ ) загрузчик прямой, но этого не умеет. Прога то им не запускается...

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

Вы лихо все расписали

И все совершенно правильно.

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

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

Чем именно закончилась дискуссия ...

Воспользуйтесь поиском.

Можно на его основе написать....

Лично Вам это не по зубам. Расслабьтесь.

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


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

Это видно.

 

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

 

Вы тупой?

Я уже четвертый раз у Вас спрашиваю - как?

Не знаете, так и скажите - не знаю.

Знаете, но согласны сказать за оплату, так и скажите - скажу за столько то.

 

 

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

 

Не, точно, не далекий.

Вы понимаете то, что Вам пишут?

Я писал - не удалось обнаружить, где в стартапе происходит инициализация sp.

Вы сначала выдаете кусок кода из стартапа, в котором по Вашему мнению это происходит, а затем заявляете - она и не должна нигде программно

делаться, так как делается аппаратно.

 

 

Можете бредить и дальше, но подобный приведенному там есть :). Вызваеется из Кейловского __main() перед вызовом пользовательского main().

 

знаю, что есть.

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

Но Вам похоже, объяснить это не удастся...

 

 

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

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

 

Оппа!

То есть Вы сейчас мне вставляете то, что отвергли категорически в одном из моих прежних сообщений?

То, что линкер помещает этот код по фиксированному адресу в начале флеша.

Вам ссылк на это и на Ваше категорическое нет - привести?

 

 

Да. И даже в отличие от Вас для кого "....не писан, если писан, то не читан, если читан, но не понят, если понят, то не так"

даже все правильно понял, чем линкеры занимаются.

 

И вычитали, что этим - расстановкой кода и данных по заданным адресам и их слинковкой - не занимаются?

Хотя с Вашими умственными способностями - только апломб демонстрировать...

 

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

 

Ну да? А чья? Ручками - это как?

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

Отстали Вы от жизни однако.

 

 

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

 

В том месте - забыли. У Вас там согласно описанию - после сброса - в sp первое слово, в ip второе и привет.

Теперь про нечто, до этого делающееся вспомнили. Тока вот пока никак до Вас не дойдет, что именно я спрашиваю - какой именно это адрес.

Его значение чему равно?

И правильно ( а не враки в описании ) - после сброса управление передается по такому то адресу.

 

 

Воспользуйтесь поиском.

 

Это нужно понимать - Вы ответа не знаете, и предлагаете поискать самому?

А как лихо Вы излагали - мол дискуссия уже была и все по местам расставила...

А что именно и куда расставила - это мимо Вас прошло.

 

 

Лично Вам это не по зубам. Расслабьтесь.

 

А вот это - не Вам судить.

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

надувать щеки.

 

Как однако не хорошо.

Судя по - http://electronix.ru/forum/index.php?showt...st&p=765231

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

Хотя, это вполне в духе...

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

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


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

Полный аут.

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

:) И как я до Вас жил и работал, писал стартапы и загрузчики в том числе и для Corteх, просто не понимаю. Все было-бы весело, если-бы не было так глупо.

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

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


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

Не, точно, не далекий.

Вы понимаете то, что Вам пишут?

Я писал - не удалось обнаружить, где в стартапе происходит инициализация sp.

Вы сначала выдаете кусок кода из стартапа, в котором по Вашему мнению это происходит, а затем заявляете - она и не должна нигде программно

делаться, так как делается аппаратно.

 

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

 

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

 

почитайте, наконец, офф доки... если сможете понять там что-то...

Cortex-M3 Technical Reference Manual, секция 5.9.1. Vector Table and Reset

 

также советую заглянуть в секцию Chapter 4. Memory Map, которая и расскажет, откуда появились магические цифры, точнее - на какие области они указывают

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


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

Полный аут.

 

:) И как я до Вас жил и работал, писал стартапы и загрузчики в том числе и для Corteх, просто не понимаю. Все было-бы весело, если-бы не было так глупо.

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

 

Так Вы когда добавляли lpc17xx к своей проге. просто забыли про это?

И сделали Go в конце загрузки? А когда просвещали меня о том, что инициализация sp в стартаре делается, вспомнили, что не делается и

внесли изменегия в свою прогу?

Вона она оказывается как!

 

 

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

 

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

 

почитайте, наконец, офф доки... если сможете понять там что-то...

Cortex-M3 Technical Reference Manual, секция 5.9.1. Vector Table and Reset

 

также советую заглянуть в секцию Chapter 4. Memory Map, которая и расскажет, откуда появились магические цифры, точнее - на какие области они указывают

 

Так Ваша версия какова?

Инициализация sp делается аппаратно - то есть добавлена соответствующая логика в железо, или все же делается программно?

То есть, путем перехода на кусок кода во флеше, в котором эта инициализация прописана?

 

 

В общем, с запуском чипа после ресета более меннее ясно.

Ответ таков - смотри исходники кривого "бангалорского" бутлоадера.

Он, в отличии от родного ( из РОМ ) прогу со стартапом в ОЗУ запускает правильно.

 

Следующий вопрос - озаботился я тут SPI.

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

регистра по указанному адресу.

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

Во втором случае через один такт ожидания мастер читает или байт-значение или 16бит-значение.

Оказывается, такой вариант SPI в кортексе не реализован.

Зато реализованы 5 других вариантов, среди которых есть похожий на вышеописанный, но первый вариант он исполнять не умеет,

умеет только чтение из слейва.

Или я чего то там не понял или где?

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


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

И сделали Go в конце загрузки?

Это штатное поведение AT200 с самого рождения.

Ответ таков - смотри исходники кривого "бангалорского" бутлоадера.

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

Зато реализованы 5 других вариантов....

У SPI по жизни 4 варианта (не считая вариантов с количеством передаваемых бит и порядком их следования ), а не шесть. Все поддерживаются в

периферии от NXP.

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


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

Это штатное поведение AT200 с самого рождения.

 

Ну да, а вчера чё прыгали то отменяя штатное поведение то снова его возвращая?

Просто скучно было?

 

 

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

 

В моей проге второе слово во флеше указывает на ОЗУ, в котором после включения питания - мусор.

Что то перед тем, как туда прыгать, должно переписать из флеша в ОЗУ данные и код.

Кривой бангладерский бутлоадер это делает - прога работает, прямой ( из ПЗУ чипа ) вроде нет - прога не работает.

 

 

У SPI по жизни 4 варианта (не считая вариантов с количеством передаваемых бит), а не шесть. Все поддерживаются в

периферии от NXP.

 

Тот вариант, что я описал, не по жизни?

Но он реализован в датчике давления SCP1000.

Им зачем то понадобилось не только, чтобы данные из датчика считывались, но чтобы и датчик можно было

программировать ( записывать вего регистры ).

 

Может и тут описание lcp17xx кривое?

 

Из описанных режимов частично подходит только микроканал, но для чтения из датчика.

А запись в датчик - увы...

Пропуск между последовательными записями - минимум 5 тактов.

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


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

Ну да, а вчера чё прыгали то отменяя штатное поведение то снова его возвращая?

Просто скучно было?

Если не поняли, что вчера было сделано, то это меня уже не удивляет. Штатное не отменялось. Было, есть и будет.

Тот вариант, что я описал, не по жизни?

В том и беда Ваша, что это Вы его описали. Описали кашу в своей голове и теперь собираетесь ее размазывать по форуму. Посмотрел. В документации все описано просто и понятно. На самом деле там, как и обещано, чистый как слеза SPI общающийся кратными 8битам (16/24)посылками. Нималейших проблем и непоняток c работой с ним быть не может.

В моей проге...

Значит надо переквалифицироваться в управдомы. И побыстрее.

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


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

Если не поняли, что вчера было сделано, то это меня уже не удивляет. Штатное не отменялось. Было, есть и будет.

 

В том и беда Ваша, что это Вы его описали. Описали кашу в своей голове и теперь собираетесь ее размазывать по форуму. Посмотрел. В документации все описано просто и понятно. На самом деле там, как и обещано, чистый как слеза SPI общающийся кратными 8битам (16/24)посылками. Нималейших проблем и непоняток c работой с ним быть не может.

Не уточните, сколько там тактов после выдачи команды на запись байта в регистр и началом выдачи этого байта?

И сколько тактов минимум получается в микроканальном режиме SPI у lpc176x...

Может попробуем разобраться на конкретном примере, у кого именно в голове каша?

Или Вы только воообщем, из высоких соображений могёте...

 

 

Значит надо переквалифицироваться в управдомы. И побыстрее.

 

Кому? Келу или NXP?

Компилер первого эту прогу слинковал с нулем замечаний,

Родной бутлоадер второго ее не запускает.

А вот кривой "бонгалорский", которого зачем то NXP в свои апноуты поместил - запускает.

Вы настолько эту штуку имеете длинной, что знаете, кому из них в управдомы?

Мне замечание на другом форуме сделали - мол на электрониксе ты осмелился челу с очень длинной этой самой штукой

возразить. А низзя...

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


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

Не уточните, сколько там тактов после выдачи команды на запись байта в регистр и началом выдачи этого байта?

На следующий такт после передачи байта (в байте 8bit) содержащего 6bit_адрес+флаг_бит_записи+space_bit, начинает передаваться байт данных. Cюрприз!

И сколько тактов минимум получается в микроканальном режиме SPI у lpc176x...

Речь до сих пор шла SPI режиме. Тоже на следующий такт. Такое удивительнейшее совпадение.

Хотите верьте, хотите нет.

Вы настолько эту штуку имеете длинной, что знаете, кому из них в управдомы?

Вам в управдомы, хотя начинаю сомневаться потяните-ли :(. В какую книгу ни посмотрите, везде без исключений видите фигу :(.

В общем стало совсем глупо продолжать общаться :(. Дальше без меня. Только на очередные глупости извлеченные из Вашей головы буду указывать, дабы, как уже писал, не плодились.

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


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

Стерли?

Тоже метод в борьбе за длину этой самой.

Вы всю ветку сострите, ведь позор Ваш на ней присутствует...

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

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


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

Стерли?

Тоже метод в борьбе за длину этой самой.

Вы всю ветку сострите, ведь позор Ваш на ней присутствует...

Admin:

Никто Ваш словесный понос за Вами не подтирал. Ибо дурь каждого видна должна быть. Посему еще и корчить из себя жертву модерирования совсем глупо.

А вот продолжение засорения форума подобными постами безнаказанным не останется. И отнюдь не символически - не первый раз. Лимит хамства исчерпан Вами полностью.

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


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

Предыдущий пост куда то пропал. Да и ладно, все равно там у меня была ошибка.

Про SPI.

Нашел, где я ошибся. Сбила меня с толку то, что команда на датчик требуется с нулевым байтом в конце.

То есть, после посылки комманды и записью/чтением паузы в один такт нет. так что режим мкропровода не годится.

Запись в регистр и чтение байта из регистра можно сделать по обычному SPI, заявив фрейм в 16 бит.

А вот как читать из жатчика 16 битные регистры? Фрейма в 24 бита ведь нет.

Или я что то не догоняю, или придется все таки писать программного мастера SPI?

Про USB.

Я уже про это здесь постил, но интузиазма не вызвало, напишу подробнее.

Есть аппноута AN10866 от NXP - secondary USB bootloader.

Что она делает.

Если при сбросе заземлен пин P1.20 она выставляет чип в виде USB диска, отраженного на флешь чипа размером в 500 килобайт.

То есть PC_юк может открывать файлы, читать флешь через файл, писать через файл во флешь.

Если пин не заземлен, то запускается прога по адресу 0x2000 во флеше, USB диск отключается.

 

Чего хотелось бы. Чтобы после запуска проги USB диск не отключался а становился диском размером в 64 килобайта, отображенным

на ОЗУ чипа. И PC_юк мог открывать на нем файлы и читать-писать ОЗУ чипа.

Это позволило бы связать чип с PC по USB без установки драйверов, добавления дополнительных чипов на довольно большой скорости и

по удобному файловому интерфейсу.

Никто с такой штукой не сталкивался?

Это штуку я запощу и в других конфах.

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


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

Нашел, где я ошибся. Сбила меня с толку то, что команда на датчик требуется с нулевым байтом в конце.

Бит. Один бит. Ибо байт содержит 8bit.

А вот как читать из жатчика 16 битные регистры? Фрейма в 24 бита ведь нет.

Согласно таблицы умножения 24 = 8 * 3, как уже было отмечено в посте №54.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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