|
|
  |
bootloader в IARe 3,10, Помогите разобраться как сделать |
|
|
|
Jul 7 2006, 08:00
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Спасибо всем. разбираюсь... А что значит: Цитата сделать два проекта в одном рабочем пространстве ? Я понял что в одном проекте есть и bootloader и обновляемая прога. Или Вы имели ввиду адресное пространство мк? для линкера и экстра опций нужно указывать в байтах или в словах?
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 7 2006, 08:16
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(arttab @ Jul 7 2006, 11:00)  Спасибо всем. разбираюсь... А что значит: Цитата сделать два проекта в одном рабочем пространстве ? Я понял что в одном проекте есть и bootloader и обновляемая прога. Или Вы имели ввиду адресное пространство мк? Под рабочим пространством имеется в виду именно сущность среды проектирования, называемая workspace, в которой создаются включаемые в неё подсущности, называемые project (меню Project/Add existing project... или Create new project...). Причём, все проекты одного рабочего пространства можно собирать групповым способом (Project/Batch build), что иногда весьма удобно. Цитата(arttab @ Jul 7 2006, 11:00)  для линкера и экстра опций нужно указывать в байтах или в словах? В байтах, т. к. линкер универсальный на всю поддерживаемую IAR гамму МК.
|
|
|
|
|
Jul 7 2006, 09:37
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(arttab @ Jul 7 2006, 11:27)  Сергей Борщ, в указаном Вами файле RSEG LOADER:CODE:NOROOT(1) менять так: RSEG LOADER:CODE:NOROOT(1) ? Да, именно это. Цитата(arttab @ Jul 7 2006, 11:27)  Попробую сделать отдельный проект для загрузчика Тогда оставьте c_startup как есть (точнее отключите от проекта чтобы брался библиотечный) и просто в .xcl измените: Код -Z(CODE)INTVEC=1800-1825 /* 19 Interrupt vectors * 2 bytes each */
/* Fill unused interrupt vector's with RETI */ -H1895 -h(CODE)1800-1825
-Z(CODE)TINY_F=1826-18FF -Z(CODE)NEAR_F,SWITCH,INITTAB,DIFUNCT=1826-1FFF -Z(CODE)CODE=1826-1FFF -Z(CODE)TINY_ID,NEAR_ID=1826-1FFF -Z(CODE)CHECKSUM#1FFF Цитата(IgorKossak @ Jul 7 2006, 10:32)  3. в опциях XLINK/Include в поле XCL file name укажите путь к Вашему файлу xcl. Причем лучше в форме Код $PROJ_DIR$\mynew.xcl Тогда при переносе проекта в другую папку не придется переписывать путь заново.
Сообщение отредактировал Сергей Борщ - Jul 7 2006, 09:38
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 9 2006, 05:46
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Начал делать отдельно Bootloader. В проекте определил сегмент и внес в неё фу-ии: #pragma segment = "LOADER" void main(void) @ "LOADER"; void Init_USART(void) @ "LOADER"; В main переместил таб. векторов: MCUCR = (1<<IVCE); MCUCR = (1<<IVSEL); //move interruptvectors to the Boot sector в XLINK/Extra Options/ прописал -Z(CODE)LOADER=1C26-1FFF в Genetal использовать XCL не по умолчанию в XLINK/Include прописал какой файл использовать $PROJ_DIR$\my_lnkm8s.xcl в файле my_lnkm8s.xcl сделал так: /*-Z(CODE)INTVEC=0-25 19 Interrupt vectors * 2 bytes each */ -Z(CODE)INTVEC=1C00-1C25 При компиляции появляется код с адресов 1С00 (вектора и прога) и 0000-009E. ???!!!!
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 10 2006, 06:53
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(arttab @ Jul 9 2006, 08:46)  Начал делать отдельно Bootloader. В проекте определил сегмент и внес в неё фу-ии: #pragma segment = "LOADER" void main(void) @ "LOADER"; void Init_USART(void) @ "LOADER";
В main переместил таб. векторов: MCUCR = (1<<IVCE); MCUCR = (1<<IVSEL); //move interruptvectors to the Boot sector
в XLINK/Extra Options/ прописал -Z(CODE)LOADER=1C26-1FFF в Genetal использовать XCL не по умолчанию в XLINK/Include прописал какой файл использовать $PROJ_DIR$\my_lnkm8s.xcl в файле my_lnkm8s.xcl сделал так: /*-Z(CODE)INTVEC=0-25 19 Interrupt vectors * 2 bytes each */ -Z(CODE)INTVEC=1C00-1C25
При компиляции появляется код с адресов 1С00 (вектора и прога) и 0000-009E. ???!!!! Если проект отдельный, нет нужды создавать сегмент LOADER. Достаточно переопределить диапазоны адресов у существующих сегментов. Кроме того, компилятор (а не линкер) по умолчанию использует зарезервированные имена сегментов, в частности INTVEC для векторов прерываний, NEAR_ID для инициализаторов и т. д. И я не знаю как эти сегменты по умолчанию, используемые неявно, переключить на новые имена.
|
|
|
|
|
Jul 10 2006, 14:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Спасибо за подсказку. В my_lnkm8s.xcl переправил так: /* -Z(CODE)NEAR_F,SWITCH,INITTAB,DIFUNCT=26-1FFF */ -Z(CODE)NEAR_F,SWITCH,INITTAB,DIFUNCT=1C26-1FFF /* -Z(CODE)CODE=26-1FFF */ -Z(CODE)CODE=1C26-1FFF /* -Z(CODE)TINY_ID,NEAR_ID,CHECKSUM=26-1FFF */ -Z(CODE)TINY_ID,NEAR_ID,CHECKSUM=1C26-1FFF Код в начале остался только с 00 по 25. А как сделать 2 проекта в одном пространстве? Что получиться на выходе? 2 Hex файла? И что это дает? И еще вопрос по операциям стирания и записи в буфер.... Это все делается через регистры РОН. К ним можно получить доступ из Си? no_init unsigned char @ 0x00 RR0 Или нужно делать асм. вставки? Не будет ли конфликта с компилятором? Ы.З. Похоже из моих попыток получиться пособие для других как сделать bootloader
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 10 2006, 17:59
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(arttab @ Jul 10 2006, 17:15)  Код в начале остался только с 00 по 25. Обрати внимание на строчку .xcl: -H1895 -h(CODE)00-25 Цитата(arttab @ Jul 10 2006, 17:15)  А как сделать 2 проекта в одном пространстве? Что получиться на выходе? 2 Hex файла? И что это дает? общие исходные файлы? Цитата И еще вопрос по операциям стирания и записи в буфер.... Это все делается через регистры РОН. К ним можно получить доступ из Си? Не совсем понял о каком буфере идет речь, но если о команде SPM, то обрати внимание на функции и макросы из intrinsics.h: Код #define _SPM_FILLTEMP(Addr,Data) \ __AddrToZWordToR1R0ByteToSPMCR_SPM((void __flash*)(Addr), (Data), 0x01)
#define _SPM_PAGEWRITE(Addr) \ __AddrToZByteToSPMCR_SPM((void __flash*)(Addr), (0x05)) Цитата Ы.З. Похоже из моих попыток получиться пособие для других как сделать bootloader  Ну если описать толково, то beer_warrior не должен отказаться включить в FAQ :-)
Сообщение отредактировал Сергей Борщ - Jul 10 2006, 18:00
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 11 2006, 02:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Цитата Обрати внимание на строчку .xcl: -H1895 -h(CODE)00-25 Увидел. Исправил -H1895 -h(CODE)1C0-1C25 Кстати, в примерах видел выражения типа FLASH_SIZE-BOOT_SIZE, но у меня так сделать не вышло. Нужно какуюто библиотеку прицепить? Цитата Не совсем понял о каком буфере идет речь, но если о команде SPM, то обрати внимание на функции и макросы из intrinsics.h: Оно. Я не ясно выразился, но Вы правильно поняли. Поразбараюсь с intrinsics.h Спасибо, буду дальше разбираться
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 11 2006, 09:36
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Цитата Не знаю что считать старшей версией Имел в виду цифры версии. В 4.10 есть, а в моей 3.10 нет. файл взял у др. человека. Как я понял, в этом файле описываются функции. Если я подключю к своему проекту, не будет ли конфликта версий? Или взять из файла только нужное: __intrinsic void __DataToR0ByteToSPMCR_SPM(unsigned char data, unsigned char byte); __DataToR0ByteToSPMCR_SPM { MOV R0,data OUT SPMCR,byte SPM } Или надо переходить на версию 4.10 и старше (>4.10)
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
Jul 11 2006, 14:15
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(arttab @ Jul 11 2006, 12:36)  Цитата Не знаю что считать старшей версией Имел в виду цифры версии. В 4.10 есть, а в моей 3.10 нет. Да, извиняюсь. Я поискал упоминание версии в постах а в тему и не посмотрел :-) Цитата файл взял у др. человека. Как я понял, в этом файле описываются функции. Если я подключю к своему проекту, не будет ли конфликта версий? В нем описываются прототипы функций. Сами тела __intrinsic- функций знает компилятор. Это позволяет ему встраивать тела функций в код очень эффективно. Цитата Или взять из файла только нужное: __intrinsic void __DataToR0ByteToSPMCR_SPM(unsigned char data, unsigned char byte); __DataToR0ByteToSPMCR_SPM { MOV R0,data OUT SPMCR,byte SPM } Боюсь такой вариант не пройдет. Особенно последняя смесь асма и С. Если нет возможности перейти на более свежую версию - то имеет смысл эти функции написать самому на асме (как в приложенных файлах от апликашки AES loader). Однако такой вариант будет менее эффективным ибо компилятор не сможет встроить такие функции. Цитата Или надо переходить на версию 4.10 и старше (>4.10) Это наиболее здравое решение. Снизу вверх проекты конвертятся легко.
Прикрепленные файлы
spm.ZIP ( 1.49 килобайт )
Кол-во скачиваний: 135
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 13 2006, 07:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371

|
Сергей Борщ, не моглибы Вы прокоментировать мои изыскания: /* __DataToR0ByteToSPMCR_SPM, pseudo code. MOV R0,data OUT SPMCR,byte SPM */ __intrinsic void __DataToR0ByteToSPMCR_SPM(unsigned char data, unsigned char byte); Какой смысл этой команды? Нужно по 2 байта в буфер отправлять, а по одному R0 не используется. //------------------------------------------- /* __AddrToZByteToSPMCR_SPM, pseudo code. MOVW R31:R30,addr OUT SPMCR,byte SPM */ __intrinsic void __AddrToZByteToSPMCR_SPM(void __flash* addr, unsigned char byte);
Передается адрес и выполняется возможная команда ( команда - byte): стирание страници, запись страници //------------------------------------------------ /* __AddrToZWordToR1R0ByteToSPMCR_SPM, pseudo code. MOVW R31:R30,addr MOVW R1:R0,word OUT SPMCR,byte SPM */ __intrinsic void __AddrToZWordToR1R0ByteToSPMCR_SPM(void __flash* addr, unsigned short word, unsigned char byte); запись данных word (2 Б) в буфер по адресу addr. значение byte фиксировано (1<<PGWRT)&(1<<SPMEN) //---------------------------------------------- /* __AddrToZByteToSPMCR_LPM, pseudo code. MOVW R31:R30,addr OUT SPMCR,byte LPM */ __intrinsic unsigned char __AddrToZByteToSPMCR_LPM(void __flash* addr, unsigned char byte); Ошибка или это что то специфическое? //--------------------------------------- Что то не понял я с этой библиотекой И как Вы управляли самопрограммированием (какие функции использовали для стирания, записи, ожидания готовности...).
--------------------
OrCAD, Altium,IAR, AVR....
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|