arttab 0 7 июля, 2006 Опубликовано 7 июля, 2006 · Жалоба Спасибо всем. разбираюсь... А что значит: сделать два проекта в одном рабочем пространстве? Я понял что в одном проекте есть и bootloader и обновляемая прога. Или Вы имели ввиду адресное пространство мк? для линкера и экстра опций нужно указывать в байтах или в словах? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 7 июля, 2006 Опубликовано 7 июля, 2006 · Жалоба Спасибо всем. разбираюсь... А что значит: сделать два проекта в одном рабочем пространстве? Я понял что в одном проекте есть и bootloader и обновляемая прога. Или Вы имели ввиду адресное пространство мк? Под рабочим пространством имеется в виду именно сущность среды проектирования, называемая workspace, в которой создаются включаемые в неё подсущности, называемые project (меню Project/Add existing project... или Create new project...). Причём, все проекты одного рабочего пространства можно собирать групповым способом (Project/Batch build), что иногда весьма удобно. для линкера и экстра опций нужно указывать в байтах или в словах? В байтах, т. к. линкер универсальный на всю поддерживаемую IAR гамму МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 7 июля, 2006 Опубликовано 7 июля, 2006 · Жалоба Сергей Борщ, в указаном Вами файле RSEG LOADER:CODE:NOROOT(1) менять так: RSEG LOADER:CODE:NOROOT(1) ? Попробую сделать отдельный проект для загрузчика Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 7 июля, 2006 Опубликовано 7 июля, 2006 (изменено) · Жалоба Сергей Борщ, в указаном Вами файле RSEG LOADER:CODE:NOROOT(1) менять так: RSEG LOADER:CODE:NOROOT(1) ? Да, именно это. Попробую сделать отдельный проект для загрузчика Тогда оставьте 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 3. в опциях XLINK/Include в поле XCL file name укажите путь к Вашему файлу xcl. Причем лучше в форме $PROJ_DIR$\mynew.xcl Тогда при переносе проекта в другую папку не придется переписывать путь заново. Изменено 7 июля, 2006 пользователем Сергей Борщ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 9 июля, 2006 Опубликовано 9 июля, 2006 · Жалоба Начал делать отдельно 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. ???!!!! BOOTLOADER.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 10 июля, 2006 Опубликовано 10 июля, 2006 · Жалоба Начал делать отдельно 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 для инициализаторов и т. д. И я не знаю как эти сегменты по умолчанию, используемые неявно, переключить на новые имена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 10 июля, 2006 Опубликовано 10 июля, 2006 · Жалоба Спасибо за подсказку. В 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 :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 10 июля, 2006 Опубликовано 10 июля, 2006 (изменено) · Жалоба Код в начале остался только с 00 по 25. Обрати внимание на строчку .xcl: -H1895 -h(CODE)00-25 А как сделать 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 :-) Изменено 10 июля, 2006 пользователем Сергей Борщ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 11 июля, 2006 Опубликовано 11 июля, 2006 · Жалоба Обрати внимание на строчку .xcl: -H1895 -h(CODE)00-25 Увидел. Исправил -H1895 -h(CODE)1C0-1C25 Кстати, в примерах видел выражения типа FLASH_SIZE-BOOT_SIZE, но у меня так сделать не вышло. Нужно какуюто библиотеку прицепить? Не совсем понял о каком буфере идет речь, но если о команде SPM, то обрати внимание на функции и макросы из intrinsics.h: Оно. Я не ясно выразился, но Вы правильно поняли. Поразбараюсь с intrinsics.h Спасибо, буду дальше разбираться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 11 июля, 2006 Опубликовано 11 июля, 2006 · Жалоба Сергей Борщ? А где лежит файл intrinsics.h? не нашел в каталоге IAR. Или это в старшей версии есть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 11 июля, 2006 Опубликовано 11 июля, 2006 · Жалоба Сергей Борщ? А где лежит файл intrinsics.h? не нашел в каталоге IAR. Или это в старшей версии есть?Не знаю что считать старшей версией, у меня в 4.10B лежит в каталоге IAR\AVR\INC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 11 июля, 2006 Опубликовано 11 июля, 2006 · Жалоба Не знаю что считать старшей версией Имел в виду цифры версии. В 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 11 июля, 2006 Опубликовано 11 июля, 2006 · Жалоба Не знаю что считать старшей версией Имел в виду цифры версии. В 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 12 июля, 2006 Опубликовано 12 июля, 2006 · Жалоба Уф, переполз на 4.12А. с трудом. intrinsics.h нужно подключить к проекту или она автоматом как только сделаю вызов ее функций? выражения типа FLASH_SIZE-BOOT_SIZE работают в этой версии? Пока поразбираюсь SPM функциями intrinsics.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 13 июля, 2006 Опубликовано 13 июля, 2006 · Жалоба Сергей Борщ, не моглибы Вы прокоментировать мои изыскания: /* __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); Ошибка или это что то специфическое? //--------------------------------------- Что то не понял я с этой библиотекой И как Вы управляли самопрограммированием (какие функции использовали для стирания, записи, ожидания готовности...). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться