asket 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба Я в этом деле новичок, недавно начал заниматься этой деятельностью, мне поручили написать Bootloader. Задача: имеется шина, будь это COM-порт или собственная шина, не важно какая, нужно по данной шине закачать с компьютера прошивку и залить его во флеш в целях ее обновления, вопрос: как это сделать это по умному? Кто и что посоветует? Может примерчик какой-нить.. К сожалению в отличии от других процев у MSP430 встроенных бутлоадеров я так понимаю нету. Компилятор IAR 3.42. Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба К сожалению в отличии от других процев у MSP430 встроенных бутлоадеров я так понимаю нету. Плохо понимаете. Есть Bootstrap Loader. Последний абзац п.п.21 FAQ http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/faq.htm#21 http://focus.ti.com/mcu/docs/mcusupporttec...ctName=slaa089d http://focus.ti.com/mcu/docs/mcusupporttec...ctName=slaa096d На русском, немного устарело.. http://www.gaw.ru/html.cgi/txt/app/micros/msp430/slaa089.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба Плохо понимаете. Есть Bootstrap Loader. Последний абзац п.п.21 FAQ http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/faq.htm#21 http://focus.ti.com/mcu/docs/mcusupporttec...ctName=slaa089d http://focus.ti.com/mcu/docs/mcusupporttec...ctName=slaa096d На русском, немного устарело.. http://www.gaw.ru/html.cgi/txt/app/micros/msp430/slaa089.htm Это то понятно, там целое шаманство производить надо и со схемкой, и с программкой, чтоб программить с командной строки, а у меня задача другая стоит: на объекте используется аппарат, который висит на собственной шине, чтоб не ездить за обновлением прошивки, пользователь скачивает из интернета hex, и с помошью нашей же программы закачивает удаленно прошивку по адресу этого устройства, далее я понимаю так, что эту прошивку надо собирать в отдельном файле, проверить контрольную сумму и запустить программный бутлоадер, чтоб он эту прошивку залил, но возможна ситуация, когда на шине пропадает питание, здесь на помошь приходит опять таки бутолоадер, который проверяет CRC прошивки и выдает код ошибки пользователю, то етсь таким образом устройство продолжает работу дальше.. Проблема здесь в том, что как это сделать правильно, у меня попытка очистить флеш по адресу 0x1100 и залить туда код с оперативки (традиционным способом) не увенчалось успехом, после перезагрузки проц вообще перестал работать, приходится перепрошивать чеез JTAG.. Прошивку из шины я пытаюсь сохранять во внешней EEPROM, ибо 64 Кб - маловато для этих целей.. Забыл про проц MSP430f149. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба asket, вы сначала разберитесь как внутрипрограммно программировать Flash MSP430 в принципе. Когда разберетесь с принципом (на INFO тренируйтесь), то тогда и приступайте к написанию своего BootLoader. Только предполагаю, что вы наверняка наступите на грабли НЕперемещаемых векторов прерываний. Поищите здесь тему про то как в MSP430 организуются перемещаемые вектора. Оно точно тут было год-полтора назад. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба asket, вы сначала разберитесь как внутрипрограммно программировать Flash MSP430 в принципе. Когда разберетесь с принципом (на INFO тренируйтесь), то тогда и приступайте к написанию своего BootLoader. Только предполагаю, что вы наверняка наступите на грабли НЕперемещаемых векторов прерываний. Поищите здесь тему про то как в MSP430 организуются перемещаемые вектора. Оно точно тут было год-полтора назад. Благодарю за совет!) Буду разбираться, правда, время поджимает, судя по ответам похоже этим либо занимались либо редко, либо никто.. А вот по поводу перемешаемых векторов я как то не подумал, спасибо, что обратили внимание на этот факт...) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба Нашел на http://tech.groups.yahoo.com/group/msp430/ Коментарий: "Code for an ISR jump table in RAM" может поможет. vectors.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба Нашел на http://tech.groups.yahoo.com/group/msp430/ Коментарий: "Code for an ISR jump table in RAM" может поможет. Огромное Вам спасибо за помощь! И еще вопрос: где бы найти описание формата пакета с прошивками например Intel Standart или Intel Extended? Там конечно разбираться то нечего, только вот хотелось бы понять по какому алгоритму считают CRC и что за байт кроется между адресом и данными? Вот первая строчка откомпилированного кода по стандарту hex-Extended: 101100003140000A3C401A023E407E05B012B4E76E, я понял так что 0x10 - длина данных, 0x1100 - адрес 0x00 - ? данные - сама прошивка 16 байт 0x6E - CRC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 15 октября, 2007 Опубликовано 15 октября, 2007 · Жалоба И еще вопрос: где бы найти описание формата пакета с прошивками например Intel Standart или Intel Extended? Там конечно разбираться то нечего, только вот хотелось бы понять по какому алгоритму считают CRC и что за байт кроется между адресом и данными? Дык как обычно Гугель рулит ;) http://pages.interlog.com/~speff/usefulinfo/Hexfrmt.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 19 октября, 2007 Опубликовано 19 октября, 2007 · Жалоба Дык как обычно Гугель рулит ;) http://pages.interlog.com/~speff/usefulinfo/Hexfrmt.pdf Окей, спасибо огромное! Кое что стало проясняться.. Еще один вопрос, извиняюсь, чисто ламерский: каким способом программно определить размер той или иной функции? Допустим знаем адрес раположения этой функции, и нужно будет определить размер этой функции, пробывал использовать sizeof(), ругается что операнд не может быть функцией, каким способом можно определить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 19 октября, 2007 Опубликовано 19 октября, 2007 (изменено) · Жалоба Неужели останусь без ответа и привета?;) Изменено 19 октября, 2007 пользователем asket Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 19 октября, 2007 Опубликовано 19 октября, 2007 · Жалоба Узнать размер именно функции нельзя. Но можно указать компилятору разместить интересующую функцию в отдельном сегменте #pragma location="MYSEGMENT" и потом вычислить размер сегмента. У IAR для этого есть встроенные псевдо-функции __segment_begin(segment) и __segment_end(segment) Кроме того потребуется объяснить линкеру в .xcl-файле что у него появился ещё один сегмент кода -Z(CODE)MYSEGMENT=.... Читайте EW430_CompilerReference.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 22 октября, 2007 Опубликовано 22 октября, 2007 (изменено) · Жалоба Окей, спасибо огромное! Кое что стало проясняться.. Еще один вопрос, извиняюсь, чисто ламерский: каким способом программно определить размер той или иной функции? Допустим знаем адрес раположения этой функции, и нужно будет определить размер этой функции, пробывал использовать sizeof(), ругается что операнд не может быть функцией, каким способом можно определить? Если программа написана на ассемблере, то размер можно узнать: поставить метки в начале и конце функции, а где необходимо -- вычислить разность меток, это и будет "размер" или точнее "размер кода" функции. Пример: mov #STOP,R7 sub #START,R7 START: ; просто любая функция push R4 push R5 mov R5,R4 pop R5 pop R4 STOP: ret В R7 -- результат Изменено 22 октября, 2007 пользователем gotty Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 23 октября, 2007 Опубликовано 23 октября, 2007 · Жалоба Еще такой вопрос по поводу сегментации флеш-памяти, компилер IAR по умолчанию ставит сегмент CODE и размещает туда все функции, если они явно пользователем не указаны в каком сегменте их расположить, но мне не понравилось тот факт, что IAR без ведома пихает стандартные функции, и если его стереть, то фактически программа без них не будет нормально работать. Как указать компилятору в какой сегмент нужно раположить эти функции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 23 октября, 2007 Опубликовано 23 октября, 2007 (изменено) · Жалоба Еще такой вопрос по поводу сегментации флеш-памяти, компилер IAR по умолчанию ставит сегмент CODE и размещает туда все функции, если они явно пользователем не указаны в каком сегменте их расположить, но мне не понравилось тот факт, что IAR без ведома пихает стандартные функции, и если его стереть, то фактически программа без них не будет нормально работать. Как указать компилятору в какой сегмент нужно раположить эти функции? Можно изменить сегмент CODE (начальный и конечный адреса), таким образом, что бы он отвечал Вашим требованиям. Это можно проделать при помощи параметра линкера: -Z(CODE)MYCODE=4000-5000 Изменено 23 октября, 2007 пользователем gotty Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
asket 0 23 октября, 2007 Опубликовано 23 октября, 2007 · Жалоба Можно изменить сегмент CODE (начальный и конечный адреса), таким образом, что бы он отвечал Вашим требованиям. Это можно проделать при помощи параметра линкера: -Z(CODE)MYCODE=4000-5000 Это мне понятно, дело здесь в другом, допустим у нас несколько сегментов: -Z(CODE)CODE=1100-1200 -Z(CODE)MYCODE=1200-1500 По умолчанию компилятор IAR помещает стандартные и служебные функции в сегмент CODE, то есть это означает, что если программист забыл указать сегмент, то компилятор автоматом поместит в сегмент --Z(CODE)CODE, то есть мне не хотелось сильно зависеть от данного сегмента, ибо большинство функции находятся в сегменте MYCODE, придется тогда над каждой функцией писать #pragma location="MYCODE". В старой версии IAR мне понравилось тем, что распределение по сегментам определяется один раз, достаточно наверху с помошью прагмы указать сегмент и тогда все функции данного модуля окажутся в этом сегменте, а новой версии этого почему-то не нашел, приходится объявлять сегмент каждой функции, что не есть хорошо.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться