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

Спасибо всем. разбираюсь...

А что значит:

сделать два проекта в одном рабочем пространстве
? Я понял что в одном проекте есть и bootloader и обновляемая прога. Или Вы имели ввиду адресное пространство мк?

для линкера и экстра опций нужно указывать в байтах или в словах?

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


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

Спасибо всем. разбираюсь...

А что значит:

сделать два проекта в одном рабочем пространстве
? Я понял что в одном проекте есть и bootloader и обновляемая прога. Или Вы имели ввиду адресное пространство мк?

Под рабочим пространством имеется в виду именно сущность среды проектирования, называемая workspace, в которой создаются включаемые в неё подсущности, называемые project (меню Project/Add existing project... или Create new project...).

Причём, все проекты одного рабочего пространства можно собирать групповым способом (Project/Batch build), что иногда весьма удобно.

для линкера и экстра опций нужно указывать в байтах или в словах?

В байтах, т. к. линкер универсальный на всю поддерживаемую IAR гамму МК.

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


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

Сергей Борщ,

в указаном Вами файле

RSEG LOADER:CODE:NOROOT(1)

менять так:

RSEG LOADER:CODE:NOROOT(1) ?

 

Попробую сделать отдельный проект для загрузчика

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


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

Сергей Борщ,

в указаном Вами файле

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

Тогда при переносе проекта в другую папку не придется переписывать путь заново.

Изменено пользователем Сергей Борщ

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


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

Начал делать отдельно 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

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


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

Начал делать отдельно 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 для инициализаторов и т. д.

И я не знаю как эти сегменты по умолчанию, используемые неявно, переключить на новые имена.

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


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

Спасибо за подсказку. В 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 :)

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


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

Код в начале остался только с 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 :-)

Изменено пользователем Сергей Борщ

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


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

Обрати внимание на строчку .xcl:

-H1895 -h(CODE)00-25

Увидел. Исправил -H1895 -h(CODE)1C0-1C25

Кстати, в примерах видел выражения типа FLASH_SIZE-BOOT_SIZE, но у меня так сделать не вышло. Нужно какуюто библиотеку прицепить?

Не совсем понял о каком буфере идет речь, но если о команде SPM, то обрати внимание на функции и макросы из intrinsics.h:

Оно. Я не ясно выразился, но Вы правильно поняли. Поразбараюсь с intrinsics.h

Спасибо, буду дальше разбираться

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


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

Сергей Борщ? А где лежит файл intrinsics.h? не нашел в каталоге IAR. Или это в старшей версии есть?

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


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

Сергей Борщ? А где лежит файл intrinsics.h? не нашел в каталоге IAR. Или это в старшей версии есть?
Не знаю что считать старшей версией, у меня в 4.10B лежит в каталоге IAR\AVR\INC

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


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

Не знаю что считать старшей версией

Имел в виду цифры версии. В 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)

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


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

Не знаю что считать старшей версией

Имел в виду цифры версии. В 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

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


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

Уф, переполз на 4.12А. с трудом.

intrinsics.h нужно подключить к проекту или она автоматом как только сделаю вызов ее функций?

выражения типа FLASH_SIZE-BOOT_SIZE работают в этой версии?

Пока поразбираюсь SPM функциями intrinsics.h

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


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

Сергей Борщ, не моглибы Вы прокоментировать мои изыскания:

/*

__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);

Ошибка или это что то специфическое?

//---------------------------------------

Что то не понял я с этой библиотекой

И как Вы управляли самопрограммированием (какие функции использовали для стирания, записи, ожидания готовности...).

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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