Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: bootloader в IARe 3,10
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Страницы: 1, 2, 3
osnwt
Цитата(arttab @ Jul 19 2006, 05:30) *
Вопрос остался. Видимо предется методом научного тыка

Лучший метод - отключить всю оптимизацию и изучить код, генерируемый указанными функциями.
arttab
уже сделал. оптимизация не мешает - функции специфические. В примере 309 наворочили с адресами и заносом данных в буфер. в сделаное ими не въехал и засомневался. Но уже разобрался
arttab
Получается менять код. Есть тонкости:
по аплекейшену 2 Б адреса разделяются так: биты 0-4 это адрес слова в буфере, а с 5 по 11 - номер страници. Реально диапазон в буфере 0-63, т.е 0-5 биты. и адреса страниц с 6 - 12 биты. Это способ адресации в IAR, как я понял.
Прогу еще не закончил - интерфейс доделываю и алгоритм записи. Но уже вижу проблемы с размером загрузщика - в 1 КБ не уложусь, а место свободного мало.
Вот думаю, - А что если из основной программы убрать функции связи дублированные в загрузщике? Вот объявил я в main функцию и указать ее размещение? Или надо в одном проекте делать? Или еще есть варианты?
Я понимаю что Си не даст компактный код всравнении с asm, но хочется доделать все в Си.

Про обещеныю апликуху "как в IAR на Си сделать загрузчик в виде отдельного проекта" я помню. постараюсь в ближайшее время доделать pfuhepobr и написать апликуху
arttab
вот моя апликуха по написанию загрузчика по итогом этой ветки. Высказывайте критеку.
Сергей Борщ
Цитата(arttab @ Aug 2 2006, 11:47) *
вот моя апликуха по написанию загрузчика по итогом этой ветки. Высказывайте критеку.
Молодец! Первая ласточка в FAQ.

"необходимо отредактировать файл lnkm8s.xcl" - лучше все же скопировать его в папку проекта и редактировать копию - а то потом остальные проекты (которые использовали lnkm8s.xcl) перестанут работать. Еще можно добавить в какой папке искать этот файл (\avr\config).

-H1895 -h(CODE)1C00-1C25 /*Fill unused interrupt vector's with RETI */
Не нужно. Правильно написанная программа не должна влетать в ненужные вектора, а эту память можно использовать под код (загрузчик обычно стремится занять всю отведенную память и еще чуть-чуть:-)

"Тогда файл будет браться из Workspace проекта" - из папки проекта (гдe лежит .ewp). В Workspace обычно куча проектов из разных папок.

#include "inavr.h"
#include "iom8.h"
#include "stdio.h"
#include "flash.h"
1) первые три файла надо указать в угловых скобках.
2) вместо #include "iom8.h" #include <ioavr.h> - тогда нужный ioxxx.h будет подставлятся автоматически исходя из настроек проекта и исчезнет warning35 при линковке многофайловых пректов.
3) flash.h - файл явно не из комплекта компилятора, поэтому надо упомянуть где его брать.
цикл я бы сделал иначе:
Код
#include <intrinsics.h>
#define    PAGE_SIZE    64
void update_Page(uint8_t *str) {
    uint8_t Buf_Address = PAGE_SIZE;
    uint8_t *ptr = str + 3 + PAGE_SIZE;
    do {
        uint16_t data = (uint16_t)*--ptr << 8;
        data |= *--ptr;
        _SPM_FILLTEMP(Buf_Address, data);
    } while (Buf_Address-=2);
}


И по ошибкам: "критЕку", "возможностями среда IAR", "что адре байта"
Buf_Adres -> Buf_Address, NumbePageWrite -> NumberPageWrite
P.S. с pgmspace.h так и не разобрались?
У меня получилось такое: (для AVR231):
Код
#include    <intrinsics.h>

static void spmWriteWord(unsigned char APPFLASH *addr, unsigned int data) {_SPM_FILLTEMP(addr, data);}
static int  spmReadWord(unsigned char APPFLASH *addr) { return *addr; }
static void spmErasePage(unsigned char APPFLASH *addr) { _SPM_ERASE(addr); while(SPMCR & (1<<0)); }
static void spmProgramPage(unsigned char APPFLASH *addr) { _SPM_PAGEWRITE(addr); while(SPMCR & (1<<0)); }

static void spmEEWriteByte(unsigned int addr, unsigned char data) { __EEPUT(addr, data); }
static void spmWriteLockBits(unsigned char data) { _SPM_LOCKBITS(data); while(SPMCR & (1<<0)); }
arttab
спасибо! коечто поправлю, что то добавлю.
По поводу основного цикла: выглядит изящней, но после оптимизации выгрышь от применения указателя и декремента быть не должно. Эксперементировал с кодом и оптимизацией и заметил такую вещь. Мой вариант легче читается для новичков. приведу 2 варианта. Кстати, unsigned int в разных компиляторах имеет разный размер, а unsigned short везде 2 байта.
Цитата
P.S. с pgmspace.h так и не разобрались?

Упустил из вида. Можете кратко сказать с чем его едят?
поткоректирую - будет скоро готов.
Сергей Борщ
Цитата(arttab @ Aug 3 2006, 05:43) *
спасибо! коечто поправлю, что то добавлю.
По поводу основного цикла: выглядит изящней, но после оптимизации выгрыша от применения указателя и декремента быть не должно.
Проверил. При оптимизации по размеру разница есть - 32/44 байта: вы твоем str+Buf_Adres вычисляется дважды внутри цикла, хотя +3 встроено в команду LDD: LDD Z+3. При оптимизации по скорости разница больше - 32 / 46 байт, хотя суммирование вынесено за цикл. И все равно остается сравнение с 64 в конце цикла. А если str передавать как параметр, да еще перед функцией __x поставить - мой вариант получается еще лучше - 26 байт, а твой так и остается в районе 40. (я делал только цикл).
Выигрыш получился имеено за счет указателя и того, что в результате вычисления Buf_Address-=2 сам собой получается флаг Z который тут же можно использовать для проверки окончания.
Цитата(arttab @ Aug 3 2006, 05:43) *
Эксперементировал с кодом и оптимизацией и заметил такую вещь. Мой вариант легче читается для новичков. приведу 2 варианта.

Тогда для улучшения наглядности рекомендую такой вариант:
Код
    str += 3;
    do {
        data = str[Buf_Adres+1];
        data <<= 8;
        data |= str[Buf_Adres];
или
    str += 3;
    do {
        data = str[Buf_Adres++];
        data |= (uint16_t)str[Buf_Adres++] << 8;
а еще лучше
    str += 3;
    do {
        data = *str++;
        data |= (uint16_t)*str++ << 8;
Новичков надо сразу приучать писать оптимально. Раз str больше не нужен, нет смысла его хранить неизменным. Пусть указывает на текущий байт. Тогда одной командой LD Rn, X+ сразу делаем и загрузку и передвигаем указатель. Кстати, в последнем варианте цикл получился 30 байт независимо от оптимизации.
Цитата(arttab @ Aug 3 2006, 05:43) *
Кстати, unsigned int в разных компиляторах имеет разный размер, а unsigned short везде 2 байта.
На эту тему много копий поломали с dxp в личной переписке (каждый остался при своем). Я не нашел в имеюмщемся у меня стандарте (ISO/IEC 9899) описания размеров данных. На всех известных мне компиляторах unsigned short действительно 2 байта. Но мне больше нравится подход с использованием заголовочного файла stdint.h. Объявленые в нем типы uint8_t, uint16_t, int8_t и т.д. имеют один и тот же размер всегда и везде.
Цитата(arttab @ Aug 3 2006, 05:43) *
Цитата
P.S. с pgmspace.h так и не разобрались?

Упустил из виду. Можете кратко сказать с чем его едят?
подкоректирую - будет скоро готов.
"Говорю одно, делаю третье, думаю второе". Имел в виду intrinsics.h. Можно указать, что функции работы с флешкой описаны в файле intrinsics.h, тогда код будет самодостаточен - не нужны левые flash.h. Пришли (в почту) файл flash.h, я посмотрю как его макросы заменить на функции из intrinsics.h.
arttab
над циклом подумаю. файл прикладываю здесь - не смог приатачить к письму.
с intrinsics.h не ковырялся т.к. был дан flash файл и на нем зациклился и эксперементировал.
arttab
Выкладываю подправленую версию. Сергей Борщ, если с intrinsics.h что то получилось - сообщите
arttab
Модератор или кто статьями занимается - может в статьи поместить. Глядишь часть вопросов отпадет у людей.
IgorKossak
Если люди умеют пользоваться поиском по форуму и внимательно читают темы, то у них и так вопросы не возникнут.
Да и что, собственно, плохого в вопросах.
По поводу статьи - почему бы и нет. Но это наверное к админам.
_Alfred_
Хочу все же вернуться к вопросу о "принудительном размещении" фукций в определенных областях RWWS и NRWWS.
Еще больше интересует - возможно ли разместить функцию по определенному адресу?
Это необходимо для обеспечения возможности МК самостоятельно генерировать код для построения сигнала. Сигнал двоичный, но зависит от поведения пользователя, и достачточно высокой частоты - вариант с if не подходит по скорости.

Основная идея - разместить по определенному адресу "заглушку", которую МК будет сам перепрограммировать и передавать ей управление.

Так вот вопрос: Как разместить функцию по четко заданному адресу в RWWS?
arttab
Если не хотите искать на форуме и посмотреть пример в текущем топике, то читайте хелп на IAR (он встроен в программу). Там и как значение и как функцию и группу функций (для группы задается область) разместить по адресу есть.
_Alfred_
Цитата(arttab @ Aug 13 2007, 05:16) *
посмотреть пример в текущем топике

В примере весь код размещается в NRWWS. Там нет функциций размещенных в RWWS.

Цитата(arttab @ Aug 13 2007, 05:16) *
читайте хелп на IAR (он встроен в программу). Там и как значение и как функцию и группу функций (для группы задается область) разместить по адресу есть.

Со значением все ясно, я говорю о функциях.

В EWAVR_CompilerReference.pdf ниписано:
Цитата
Function placement into named segments
It is possible to place functions into named segments using either the @ operator or the
#pragma location directive. When placing functions into segments, the segment is
specified as a string literal.
Example
void f(void) @ "MYSEGMENT";
void g(void) @ "MYSEGMENT"
{
}
#pragma location="MYSEGMENT"
void h(void);

Добавил в файл lnkm16s.xcl (у меня mega16, memory - small) строки:
Код
-Z(CODE}MY_SOURCE=100-200
-Z(CODE}MY_MAIN=201-1BFF
-Z(CODE}MY_LOADER=1C00-1FFF

Пишу:
Код
...
void test(void) @ "MY_LOADER";
...

В результате:
Fatal Error[e72]: Segment MY_LOADER must be defined in a segment definition option (-Z, -b or -P)

Пишу:
Код
...
#pragma segment = "MY_LOADER"
void test(void) @ "MY_LOADER";
...

результат тот же.

Пишу в Options->Linker->Extra Options:
Код
-Z(CODE}MY_SOURCE=100-200
-Z(CODE}MY_MAIN=201-1BFF
-Z(CODE}MY_LOADER=1C00-1FFF

В результате:
Error[e102]: No such segment type: -Z(CODE}MY_SOURCE=100-200

Где-то какая-то мелочь, а какая - не пойму.
_Alfred_
Все, разобрался. Дело было как обычно в мельницах.

Если в Options->Linker->Extra Options поставить правильные скобки то все работает без проблем.
Len_OK
тут столько всего написано...Про функции самопрограммирования мне понятно(ну или может почти)...
Никак не могу понять как и что нужно настроить в ИАРе, чтобы все заработало.Мне нужно работать с 4 страницами во флеше меги 8.Читать могу, а вот записать не получается
_Alfred_
Цитата(Len_OK @ Dec 6 2007, 15:40) *
тут столько всего написано...Про функции самопрограммирования мне понятно(ну или может почти)...
Никак не могу понять как и что нужно настроить в ИАРе, чтобы все заработало.Мне нужно работать с 4 страницами во флеше меги 8.Читать могу, а вот записать не получается

Ничего особенного вроде как в настройках писать не пришлось - тип процессора, модель памяти (Small), фрмат генерируемого файла.
Еще я прописывал Options->Linker->Extra Options:
Код
-Z(CODE)MY_MAIN=200-4FFF
-Z(CODE)MY_SOURCE=5000-6F7F
-Z(CODE)MY_DELAYS=6F80-6FFF
-Z(CODE)MY_LOADER=7000-7FFF
но это что б размещать код по определенным адресам.

Для записи использовал пример из AVR109, файл fаlash.h и брал за основу функцию Update_Page(), написанную arttabом в bootloader_IAR.pdf.

Использовал IAR 4.11A, МК ATmega32.
Len_OK
Я уже могу писать, но почему-то только в конце загрузчика.Как сделать, так, чтобы выделить под запись 2 страницы перед областью загрузчика?
sergik_vrn
Цитата(Len_OK @ Dec 7 2007, 10:36) *
Я уже могу писать, но почему-то только в конце загрузчика.Как сделать, так, чтобы выделить под запись 2 страницы перед областью загрузчика?

что имеется в виду под "концом загрузчика" и "перед областью загрузчика"?
_Alfred_
sergik_vrn
Наверное под "концом загрузчика" имеется ввиду конец NRWW section, а под "перед областью загрузчика" - RWW section.

Len_OK
В NRWW section писать не было необходимости - поэтому сказать ничего не могу, а вот с записью в RWW section проблемм не возникало - несколько раз менял расположение модифицируемой части и все было в порядке. Разве что в начале производилась запись не совсем туда, куда нужно, из-за того, что напутал где адрес в байтах, а где в словах. Может Вы тоже наступили на эта грабли?
Len_OK
всё никак не получается
пишу Options->Linker->Extra Options:
-Z(CODE)main = 01C0-1B00
-Z(CODE)loader = 1C26-1FFF

а мне в ответ:

Error[e12]: Unable to open file '= 01C0-1B00'
IgorKossak
Цитата(Len_OK @ Dec 10 2007, 12:52) *
всё никак не получается
пишу Options->Linker->Extra Options:
-Z(CODE)main = 01C0-1B00
-Z(CODE)loader = 1C26-1FFF

а мне в ответ:

Error[e12]: Unable to open file '= 01C0-1B00'

Пробелы лишние (а лучше все) поубирайте.
Len_OK
извините конечно!!! Но что это за ошибка?Подскажите,PLZ!!!! unsure.gif

Error[e16]: Segment CODE (size: 0x40c align: 0x1) is too long for segment definition. At least 0x32 more
bytes needed. The problem occurred while processing the segment placement command
"-Z(CODE)CODE=1C26-1FFF", where at the moment of placement the available memory ranges were
"CODE:1c26-1fff"
Reserved ranges relevant to this placement:
CODE:1c26-1fff CODE
Сергей Борщ
Цитата(Len_OK @ Dec 10 2007, 15:26) *
извините конечно!!! Но что это за ошибка?Подскажите,PLZ!!!!
Вроде ясно написано - получившийся сегмент CODE не влезает в отведенное для него место. Не хватает 0x32 байт
Len_OK
спасибо, я уже разобралась.Невнимательна немного!
alux
Пытаюсь использовать функции записи во флеш из апнота avr106 для своего проекта (Mega324P). Хочу сохранять параметры в неиспользованной части бутлодера (от начала сектора NRWW до начала собственно бутлодера). В верхней NRWW области прошит бутлодер размером 1кб. Область NRWW для данного мк занимает 4кБ. Бутлодер создан отдельным проектом. Сделал так как указано в апноте:
Код
//Alternatively it is possible to place only selected functions into defined segments of
//the Flash memory. In fact it is only the functions for writing that need to be located
//inside the Boot section.
//1. Make a new define for Boot size.
-D_..X_BOOTSEC_SIZE=1000 /* 2048 words */
//2. Define a new segment for the entire Boot section based on the definition in step 1.
-Z(FARCODE)BOOT_SEGMENT=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+1)-_..X_FLASH_END
//Placing a C function into the defined segment:
void ExampleFunction() @ BOOT_SEGMENT {
------
}

...т.е. в описании и объявлении функции записи во флеш добавил @"BOOT_SEGMENT"
unsigned char WriteFlashByte(MyAddressType flashAddr, unsigned char data)@"BOOT_SEGMENT";

При вызове этой функции возникает ошибка:
Код
Error[e133]: The output format intel-extended cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is  wanted

Что я сделал не так? Вообще-то, мне необходимо разместить функции так, чтобы не они не "попали" в самый верхний килобайт памяти (загрузчик).
Сергей Борщ
Я думаю, ему не понравилось FARCODE. Поаробуйте просто CODE, у вашего кристалла всего 32К флеша, там никакой FAR не нужен.
alux
Цитата(Сергей Борщ @ Jan 17 2008, 01:15) *
Я думаю, ему не понравилось FARCODE. Поаробуйте просто CODE, у вашего кристалла всего 32К флеша, там никакой FAR не нужен.

Прошу прощения. Ошибка вышла. Скопировал с апнота... У меня было -Z(CODE)... Так в чем же дело?
Сергей Борщ
Цитата(alux @ Jan 17 2008, 08:14) *
Прошу прощения. Ошибка вышла. Скопировал с апнота... У меня было -Z(CODE)... Так в чем же дело?
EEPROM не используется? Точнее, не так: Если используется eeprom, то задаются ли ей в программе начальные значения? Если да, то оставьте на вкладке выбора формата отладочный формат для C-SPY, а на вкладке extra options допишите
Код
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep
Baser
Сразу возник вопрос: вы это пытаетесь добавлять в проект с бутлоадером или в проект с прикладной программой?
Я попробовал на проекте на мега128 с бутлоадером. При добавлении в прикладную программу след. строк все линкуется без ошибок.
Код
*.xcl файл:
-D_..X_APPFLASH_END=1DFFF    /* End of Applications flash memory */
-D_..X_BOOTLOADER_BASE=1F000 /* Start of BootLoader flash memory */
-Z(CODE)BOOTCODE=_..X_BOOTLOADER_BASE-_..X_FLASH_END
-Z(CODE)BOOT_SEGMENT=1E000-(_..X_BOOTLOADER_BASE-1)
*.c файл:
__root unsigned char WriteFlashByte(unsigned int flashAddr, unsigned char data)@"BOOT_SEGMENT";

Правда, обратите внимание, что я разделил сегменты, куда прилинковывается бутлоадер из другого проекта и сегмент с вашей функцией.

А такую ошибку я тоже уже видел:
Цитата(alux @ Jan 16 2008, 22:08) *
Error[e133]: The output format intel-extended cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is wanted

Но возникает она, если пытаться вывести в hex файл одновременно и CODE и DATA (или EEPROM).
alux
Цитата(Сергей Борщ @ Jan 17 2008, 13:27) *
Код
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

Цитата(Baser @ Jan 17 2008, 13:41) *
Сразу возник вопрос: вы это пытаетесь добавлять в проект с бутлоадером или в проект с прикладной программой?Я попробовал на проекте на мега128 с бутлоадером. При добавлении в прикладную программу след. строк все линкуется без ошибок.

Еще раз повторюсь. Есть многофайловый проект на Мега324 (без бутлодера). Бутлодер создан отдельным проектом. В контроллер уже прошит загрузчик в последний килобайт флеша. Хочу использовать функции из avr106 для записи во флеш. В частности в неиспользованную область NRWW (до начала загрузчика). В области NRWW необходимо разместить только функции записи во флеш. Я в курсе, что такое сообщение возникает при попытке скомпилить с данными в ЕЕПРОМе. И эти опции тоже использую, если надо. Но в тот момент ЕЕПРОМ не использовал. Это сообщение возникает при ВЫЗОВЕ WriteFlashByte(); Если не вызывать данную функцию, линкуется без ошибок.
Сергей Борщ
Цитата(alux @ Jan 17 2008, 15:51) *
Если не вызывать данную функцию, линкуется без ошибок.
Тогда приведите кусок вашего .xcl. Вы показываете какой-то другой .xcl, и хотите телепатии. В вашем .xcl в определнии сегмента BOOT_SEGMENT используется _..X_FLASH_END? Если да, чему оно у вас равно?
alux
Код
/*                      - lnkm324s.xcl -
*   XLINK command file for the ICCAVR C-compiler using the --cpu=m324, -ms  options.
*   Usage: xlink your_file(s) -f lnkm324s
*   File version: $Revision: 1.1 $
*/

/*=================== CONSTANTS =============================*/
/* Constants used in the ranges down below,  Do not change these lines,  if it is not stated otherwise
*/

/* Code (flash) segments */
-D_..X_INTVEC_SIZE=7C   /* 31 Interrupt vectors * 4 bytes each */
-D_..X_FLASH_TEND=FF    /* End of tiny flash memory */
-D_..X_FLASH_NEND=7FFF  /* End of near flash memory */
-D_..X_FLASH_END=7FFF   /* End of flash memory */

///////////////////////////////////////////////////////////////////////// <- КОД МЕЖДУ СЛЕШАМИ Я ДОБАВИЛ
/* Boot Sector Size */
//-D_..X_BOOTSEC_SIZE=2000  /* 4096 words  */
-D_..X_BOOTSEC_SIZE=1000  /* 2048 words */
//-D_..X_BOOTSEC_SIZE=800  /* 1024 words */
//-D_..X_BOOTSEC_SIZE=400  /*  512 words */
//-D_..X_BOOTSEC_SIZE=200  /*  256 words */
//-D_..X_BOOTSEC_SIZE=100  /*  128 words */

-Z(CODE)BOOT_SEGMENT=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+1)-_..X_FLASH_END
/////////////////////////////////////////////////////////////////////////
Сергей Борщ
Цитата(alux @ Jan 17 2008, 16:37) *
Не вижу криминала... Линкеру точно этот файл подсовывается? А поставьте формат выходного файла "Отладочный для C-SPY" и включите генерацию .map. В его шапке увидите командную строку линкера и в самом конце будет таблица распределения по сегментам - возможно, что-то прояснится.
alux
Откровенно говоря у меня нет острой необходимости использование именно флеш в качестве ЕЕПРОМ. Да и времени нет для экспериментов. Решил просто использовать внутренний ЕЕПРОМ для данной разработки. По старинке smile.gif Просто хотел освоить новый (для меня) способ записи. С первого раза не пошло... Если есть еще предположения, пишите.
Baser
Цитата(alux @ Jan 17 2008, 15:51) *
Еще раз повторюсь. Есть многофайловый проект на Мега324 (без бутлодера). Бутлодер создан отдельным проектом. В контроллер уже прошит загрузчик в последний килобайт флеша. Хочу использовать функции из avr106 для записи во флеш. В частности в неиспользованную область NRWW (до начала загрузчика). В области NRWW необходимо разместить только функции записи во флеш.

Еще раз проверьте все, что вы делаете. Если именно так как написано, то это линкуется без ошибок. Проверил smile.gif Если есть сомнения, посмотрите прикрепленные файлы.

Цитата
Я в курсе, что такое сообщение возникает при попытке скомпилить с данными в ЕЕПРОМе. И эти опции тоже использую, если надо. Но в тот момент ЕЕПРОМ не использовал. Это сообщение возникает при ВЫЗОВЕ WriteFlashByte(); Если не вызывать данную функцию, линкуется без ошибок.

Это просто наложение ошибок. На вызов функции такое сообщение выдаваться не может.
arttab
я поимел большие проблемы в установлении причины почему не получается самопрограммирование из-за неверных фузов размера загрузчика. проверьте на всякий случай
alux
Цитата(arttab @ Jan 18 2008, 06:02) *
я поимел большие проблемы в установлении причины почему не получается самопрограммирование из-за неверных фузов размера загрузчика. проверьте на всякий случай

При чем в данном случае фузы? Речь идет об ошибке на этапе линковки программы.

To Baser
Не совсем понимаю для чего необходимо создавать хексы для DATA и EEPROM?
Код
-y(CODE)
-Ointel-extended,(DATA)=_data.hex
-Ointel-extended,(XDATA)=_eeprom.hex

Обязательно ли все функции размещать в "BOOT_SEGMENT" ? По-моему, достаточно разместить только те функции, которые непосредственно работают с SPM инструкцией. Так? Или также и функции, в которые входят эти функции (SPM) ? И зачем объявлять их как extern? Без модификатора extern все компилится без ошибок. И последнее, для чего root?
Baser
Цитата(alux @ Jan 18 2008, 13:16) *
To Baser
Не совсем понимаю для чего необходимо создавать хексы для DATA и EEPROM?

Про это вам, вообщем-то, Сергей Борщ говорил smile.gif и относилось это к возникающей у вас ошибке линкера, которая могла быть следствием попытки вывести в Intel-hex файл одновременно два адресных пространства: CODE и EEPROM. А для чего получать два файла с хексами для DATA и EEPROM - чтобы затем прошить их в МК smile.gif

Цитата
Обязательно ли все функции размещать в "BOOT_SEGMENT" ? По-моему, достаточно разместить только те функции, которые непосредственно работают с SPM инструкцией. Так? Или также и функции, в которые входят эти функции (SPM) ?

Да, конечно, можно размещать только функции с SPM. Но это только в том случае, если вы все эти функции компилируете и пишете в МК вместе (а не отдельно функции с SPM в проекте бутлоадера, а другие функции в прикладной программе), иначе вам необходимо обеспечить нахождение точек вызова функций по абсолютным адресам.

Цитата
И зачем объявлять их как extern? Без модификатора extern все компилится без ошибок.

В случае описания внешних функций спецификатор extern является спецификатором по умолчанию и его допускается не писать (как мы не пишем auto при определении локальных auto-переменных). Но я привык всегда явно указывать extern, считаю, что это наглядней.

Цитата
И последнее, для чего root?

__root служит для указания линкеру, что данная функция или переменная должна быть безусловно включена в код, даже если она нигде не используется. Поскольку пример был тестовый, я везде добавил __root , чтобы линкер не своевольничал smile.gif

з.ы. А как вы отлаживаете прикладную программу, с кодами бутлоадера или без них? Интересен опыт других людей, поскольку с этим вопросом сам недавно разбирался.
Breese
Возникла такая проблема - не работает АЕS бутлоадер для ATmega64. Стал упрощать код, еще и еще, пока не дошел просто до пустой функции main(void) - он в функцию входит но из нее не выходит и висит - что это может быть? maniac.gif
Сергей Борщ
Цитата(Breese @ Jan 20 2008, 20:02) *
дошел просто до пустой функции main(void) - он в функцию входит но из нее не выходит и висит - что это может быть?
Где-то ошибка. Попробуйте получившийса .hex пройти по шагам в симуляторе AVRStudio. Сразу увидите - куда код входит и куда выходит.
Breese
Эмм ошибка в пустой функции??? Кстати в АврСтудио все норм, как и должно быть а в железе чушь ((( Уже 5 ночей бьюсь ничего не помогает... Контроллер скажете вы, увы, пробовал на 3-х - один результат.
Я грешу на настройки компилятора или фьюзы. Может есть какой нить заковыйрестый фьюзик?
Вообще был бы благодарен если бы кто нить откомпили пустую функцию main в IAR 4 - тогда сразу бы нашел у себя ошибку.
aesok
Цитата(Breese @ Jan 20 2008, 22:27) *
Может есть какой нить заковыйрестый фьюзик?


А что там у вас с M103C ?

Анатолий.
Breese
Цитата(aesok @ Jan 20 2008, 22:52) *
А что там у вас с M103C ?

Анатолий.


Был запрограммирован (PonyProg), щас распрограммировали и... ЗАРАБОТАЛО!!! Ребята вы боги!!! yeah.gif
arttab
Breese
были приколы с "пустой функции main(void)". она была заоптимизирована. можно указать чтоб она не оптимизировалась или вставить в нее переход по метки, расположенной в main
YWAS
вот и у меня пришло время писать boot loader, начитавшись и натренировавшись столкнулся с такой проблемой... бут лоадер грузит программу с адреса 000000 и вроде запускает, первые команды проходят а дальше тишина, такое впечатление что не работают прерывания, может кто сталкивался с подобным - помогите - сижу уже битый час и все никак..
(компилятор IAR проц ATMega1280)
Сергей Борщ
Цитата(YWAS @ Aug 22 2009, 21:52) *
такое впечатление что не работают прерывания,
Или вы переключили вектора на нулевые адреса, но забыли отключить какое-то из прерываний загрузчика. В результате оно стало попадать на пустой обработчик, а часть прерываний (TXE, UDR) не сбрасываются просто от самого факта входа в обработчик. Поставьте заглушки на все неиспользуемые вектора и дергайте в каждой заглушке своей ногой. Легко найдете, в каком прерывании вы зацикливаетесь. Если свободных ног мало, но есть осциллограф, можно наблюдать разные затычки на одной ноге так.
YWAS
Сергей спасибо за подсказки...
Все оказалось тривиально просто, после возвращения из бут лоадера не переключился бит IVSEL, и вектора остались в бут области, переключив этот бит в 0 все заработало на ура....чего и всем желаю... smile.gif

------------------------------------------------------------------------------------------
__disable_interrupt();
char temp;
temp = MCUCR; // Get MCUCR
MCUCR = temp|(1<<IVCE); // Enable change of Interrupt Vectors
MCUCR = temp|(1<<IVSEL); // Move interrupts to Boot Flash section
-------------------------------------------------------------------------------------------
__disable_interrupt();
temp = MCUCR; // Get MCUCR
MCUCR = temp|(1<<IVCE); // Enable change of Interrupt Vectors
MCUCR = temp&(0<<IVSEL); // Move interrupts to 0x00000 Flash section
Сергей Борщ
Цитата(YWAS @ Aug 23 2009, 11:42) *
после возвращения из бут лоадера не переключился бит IVSEL
То есть как это? Вы его переключали, а он сопротивлялся? wink.gif
YWAS
типа того,
ошибся немного, было так
MCUCR = temp|(0<<IVSEL); // Move interrupts to 0x00000 Flash section
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.