|
|
  |
Несколько вопросов по lpc176x |
|
|
|
May 24 2010, 16:34
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(igorsk @ May 24 2010, 19:17)  Обычное сложение. Увы не получается. Обычное сложение не проходит. В стартапе от Кейла вообще ничего специального в восьмое слово не пишется, оно просто нулевое. Было подозрение, что линкер придает восьмому слову нужное значение. Но в загрузочном файле нули. Неужели загрузчик это делает? Ведь не может же это стартап делать, он по этим словам должен установить, есть во флеше пользовательская программа или нет а не перешивать флеш так, чтобы это условие выполнялось. Хотя стартап заносит в sp значение первого слова и делает переход по адресу во втором слове. Недавно вычитал - стартап еще кое что делает - заносит в один из регистров системного таймера значение, которое соответствует 10 миллисекундным тикам при тактовой в 100 мегагерц. Но как коряво написано описание таймеров в юзерманьюале... Вдохновляет только одно - их в данном чипе много и они все 100 мегагерцовые и прилично наворченные...
|
|
|
|
|
May 25 2010, 05:05
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(sonycman @ May 24 2010, 23:35)  Если контрольная сумма отсутствует в файле прошивки, значит, она вычисляется и подставляется в процессе записи во флеш. Или вообще не вычисляется, а в описании - лажа. Что намного более вероятно. Цитата(sonycman @ May 24 2010, 23:35)  Таймеры мне чем понравились, это тем, что они 32 битные, а не 16 как в STM. В том, что они работают на частоте ядра, нет ничего удивительного. Ага, для lpc17xx. Есть кортексы, в которых это не так.
|
|
|
|
|
May 25 2010, 18:50
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 22-03-10
Пользователь №: 56 131

|
Цитата(vallav @ May 25 2010, 06:05)  Или вообще не вычисляется, а в описании - лажа. Что намного более вероятно. Залей прошивку в чип, прочитай назад и сравни.
|
|
|
|
|
May 26 2010, 06:45
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(igorsk @ May 25 2010, 22:50)  Залей прошивку в чип, прочитай назад и сравни. Спасибо за очень ценный совет. Ну ни в жисть бы сам не догадался...
|
|
|
|
|
May 26 2010, 06:52
|
Местный
  
Группа: Свой
Сообщений: 283
Регистрация: 13-06-07
Из: Челябинск
Пользователь №: 28 391

|
Цитата(vallav @ May 26 2010, 12:45)  Спасибо за очень ценный совет. Ну ни в жисть бы сам не догадался... //off-top Свою манеру общения на форумах изменили бы на "помягче", а то глядишь скоро Вам вообще никто ничего отвечать не будет.
|
|
|
|
|
May 26 2010, 07:24
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(mrKirill @ May 26 2010, 10:52)  //off-top Свою манеру общения на форумах изменили бы на "помягче", а то глядишь скоро Вам вообще никто ничего отвечать не будет. А по мягче - это как? Вот на данный ответ Вы бы как прореагировали ( если помягче )?
|
|
|
|
|
May 28 2010, 04:48
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Скомпилил аппноуту AN10866 от NXP - secondary USB bootloader в Keil. При компиляции что то там исправлял. Загрузил в плату mbed - работает. Только, так как прога занимает 8K флеша, опции на пользовательскую прогу надо немного поменять. Штука очень удобная. Чип прикидывается флешкой на 500К. Компилишь прогу в .bin. Удаляешь старый .bin с этой флешки, копируюешь туда новый, нажимаешь сброс - новая прога работает. Добавить к mbed пришлось - кабель с разъемом от резанный от мышки и проводок, чтобы замыкать на землю p1.20. Кому интересно, файлы привожу. Там usbboot1 - сам загрузчик, а blinki2 - мигалка светодиодами mbed_а.
|
|
|
|
|
May 29 2010, 11:21
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Похоже рабочие исходники проги, которая после небольшой переделки позволит подключить lcp176x по USB к PCюку без промежуточных чипов и без драйверов на максимальной скорости - неинтересны. Неужели это уже не актуально? И еще, ну ладно загрузка проги через USB без наворотов неинтересна, а если ее дописать, чтобы она прикидывалась родным USB житагом для Кейла и позволяла вести загрузку и отладку, эмулируя житаг? Тоже не интересно? Что тогда будут делать многочисленные производители чипов переходников USB-UART и приставок житагов? Да и плата с lpc176x будет как то не серьезно выглядеть - ни проводов ни деталей... А если еще про USB обманывают и он будет работать на внутреннем RC генераторе - то вообще пипец. Особенно если NXP все это защьет в ROM по просьбе трудящихся.
Ладно, тогда вернусь к начальной загрузке. Слинковал я прогу для работы в ОЗУ целиком, вместе с таблицей прерываний. Первые 8 слов загрузчика такие: 10000300 10000065 10000069 1000006b 1000006d 1000006f 10000071 00000000
Проверено, после включения питания работает. И что будет, если после снятия сброса бутлоадер убедившись непонятно каким способом, что есть пользовательская прога, первое слово загруpузит в sp и произведет переход по значению второго слова из таблицы прерываний? А код переносить из флеши в ОЗУ и устанавливать битики в проце о том, что таблица прерываний не в нуле - кто будет? Загрузчик? Так что в описании по этому поводу - полная лажа. По моему мнению линкер по фиксированному адресу в начале флеша подключает свой кусок кода, который делает все начальные разборки. И переход после отработки бутлоадера идет на этот адрес.
|
|
|
|
|
May 29 2010, 11:57
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(vallav @ May 29 2010, 14:21)  Похоже рабочие исходники проги, которая.... представляет собой цельнотянутый и писанный "бангалорскими" программерами загрузчик от NXP, действительно все кому хотелось взяли на NXP обсудили очень давноооо.... Цитата И что будет, если после снятия сброса бутлоадер убедившись непонятно каким способом "Способ" описан в мануале по самое немогу. То, что Вы не можете воспринять написанное, это уже Ваши проблемы. Цитата Так что в описании по этому поводу - полная лажа. Это в голове  Цитата По моему мнению линкер по фиксированному адресу в начале флеша подключает свой кусок кода, который делает все начальные разборки.  . Скрипт исполняется при загрузке через JTAG, в нем все и устанавливается для работы в RAM и прямо передается управление. В остальных случаях этим занимается startup. Так уж в 'С' принято испокон веков.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 29 2010, 12:26
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Цитата(zltigo @ May 29 2010, 15:57)  представляет собой цельнотянутый и писанный "бангалорскими" программерами загрузчик от NXP, действительно все кому хотелось взяли на NXP обсудили очень давноооо.... И в результате что? Кстати у меня оригинал не компилился, пришлось ощибки исправлять. Цитата(zltigo @ May 29 2010, 15:57)  "Способ" описан в мануале по самое немогу. То, что Вы не можете воспринять написанное, это уже Ваши проблемы. Вы это описание читали? С приведенными мною 8 первыми словами во флешке согласовать смогете? Или Вы только - болтать? Цитата(zltigo @ May 29 2010, 15:57)   . Скрипт исполняется при загрузке через JTAG, в нем все и устанавливается для работы в RAM и прямо передается управление. В остальных случаях этим занимается startup. Так уж в 'С' принято испокон веков. Увы, в startup_е нет даже инициализации sp. Именно с этого - а где же sp то инициализируется, я и начал ковырять startup. И откуда startup_у знать, какую именно я раскладку памяти линкеру назначил? Тем боле и startup и таблица прерываний в данном случае - в ОЗУ. Что их туда из флеша при включении притания перемещает? Startup? А то, что в 'C' принято испокон веков, в кортексах похерено. Знаете, как в кортексном 'C' передача параметров в функцию происходит? Вы бы лучше занимались тем, что у Вас хорошо получается - выписывание баньки, и не лезли туда, где ничего не смыслите. Можно я на Ваши глупости больше отвечать не буду? Надеюсь это не против правил форума?
Сообщение отредактировал vallav - May 29 2010, 12:30
|
|
|
|
|
May 29 2010, 13:49
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(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' пустые слова. Цитата Вы бы лучше занимались тем, что у Вас хорошо получается - выписывание баньки Хорошо, и этому уделю внимание. Цитата Можно я на Ваши глупости больше отвечать не буду? Только я на глупости, в том числе и Ваши, на форуме буду по прежнему стараться указывать. Дабы не плодились оные.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 30 2010, 05:54
|
Частый гость
 
Группа: Участник
Сообщений: 197
Регистрация: 8-04-05
Пользователь №: 3 977

|
Ну вот видите, можете, когда захотите. Цитата(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 значения первого слова флеши и переход по адресу, равному значению второго слова флеши? И что перед этим переносит код в ОЗУ, если второе слово флеши указывает на ОЗУ. И главное, как узнает, что и куда из флеши надо переносить. Кстати, уменя получилось - когда и стартап и сама прога в ОЗУ - стандартный бутлоадер не справляется, а писанный "бангалорскими" - прогу запускает и она работает. Это наверно потому, что он кривой? Пока не получается таблицу прерываний в ОЗУ засунуть, но когда получится и "бангалорский" и такую запустит - значит он сильно кривой...
|
|
|
|
|
May 30 2010, 07:00
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(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 кейловский. Эти-же нехитрые операции выполняются ядром при старте запуская программу. Только адрес строго фиксирован.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|