Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.80.144.110] |
|
Сообщ.
#1
,
|
|
|
Только начал с ним разбираться, в WinAVR с этим вопросом все просто, а тут вот не получилось...
Контроллер - atmega128 Пока пробовал вот так: в параметрах проекта General указывал на существование внешней памяти (32х8к) и задавал размер кучи в 0x6F00 = 32кбайт - 4352(внутренние адреса) Ругается на недостаток места для RSTACK: Error[e16]: Segment RSTACK (size: 0x200 align: 0) is too long for segment definition. At least 0x200 more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_RSTACK_BASE-_..X_RSTACK_END", where at the moment of placement the available memory ranges were "-none-" Reserved ranges relevant to this placement: DATA:100-4ff CSTACK DATA:500-10ff HEAP А я хочу кучу в адресах 0x1100-0x8000 Видимо нужно добавить параметр командной строки для линкера, но это-то у меня сделать прямым способом не вышло... |
Сообщ.
#2
,
|
|
|
Давно не работал с IAR. Этот выводимый кусок - это кусок конфигурационного файла. Там, ЕМНИП, можно указать, какой сегмент где должен лежать.
|
Сообщ.
#3
,
|
|
|
Цитата Matracc @ А я хочу кучу в адресах 0x1100-0x8000 Видимо нужно добавить параметр командной строки для линкера, но это-то у меня сделать прямым способом не вышло... IAR использует .xcl - файл как расширитель командной строки линкера. Покопайся там. У нужного тебе сегмента укажи начальный адрес. И, если надо, еще и размер. Чтобы настройки .xcl файла конкретного проекта не влияли на другие проекты, нужно скопировать этот файл в директорию проекта. Затем в настройках среды программирования "указать на него". Можно просто физически расположить сегмент последним в списке сегментов. Указать его начальный адрес и все. Но в этом случае не будет контроля за возможным выходом за предельные размеры сегмента. |
Сообщ.
#4
,
|
|
|
Скопировал в папку с кодом файл, который использовался линкером. Руками поправил один параметр, получилась такая строка:
-Z(DATA)HEAP+0x6F00=0x1100-0x8000 Вот итоговый файл: ////////////////////////////////////////////////////////////////////////////// // // Configuration for a generic -v3 -ms target. // // File version: $Revision: 1.12 $ // // The '_..X_' prefix is used by C-SPY as an indication that the label should // not be displayed in the dissassembly window. // // Set up XLINK -ca90 -w29 ////////////////////////////////////////////////////////////////////////////// // Code (flash) segments -Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1) -Z(CODE)TINY_F=_..X_FLASH_BASE-FF -Z(CODE)NEAR_F=_..X_FLASH_BASE-_..X_FLASH_NEND -Z(CODE)SWITCH=_..X_FLASH_BASE-_..X_FLASH_NEND -Z(CODE)DIFUNCT=_..X_FLASH_BASE-_..X_FLASH_NEND -Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END -Z(CODE)FAR_F=[_..X_FLASH_BASE-_..X_FLASH_END]/10000 -Z(CODE)INITTAB=_..X_FLASH_BASE-_..X_FLASH_END -Z(CODE)HUGE_F=_..X_FLASH_BASE-_..X_FLASH_END -Z(CODE)TINY_ID=_..X_FLASH_BASE-_..X_FLASH_END -Z(CODE)NEAR_ID=_..X_FLASH_BASE-_..X_FLASH_END -Z(CODE)CHECKSUM#_..X_FLASH_END ////////////////////////////////////////////////////////////////////////////// // Data (SRAM, external ROM or external NV RAM) memory -Z(DATA)TINY_I,TINY_Z,TINY_N=_..X_SRAM_TBASE:+_..X_SRAM_TSIZE -Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_CSTACK_BASE-_..X_CSTACK_END -Z(DATA)HEAP+0x6F00=0x1100-0x8000 -Z(DATA)IOSTREAM_N#_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE:+_..X_EXT_SRAM_SIZE -Z(DATA)NEAR_HEAP+_..X_NEAR_HEAP_SIZE=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE:+_..X_EXT_SRAM_SIZE -Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_RSTACK_BASE-_..X_RSTACK_END -Z(DATA)NEAR_I,NEAR_Z=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE:+_..X_EXT_SRAM_SIZE -Z(DATA)NEAR_C=_..X_EXT_ROM_BASE:+_..X_EXT_ROM_SIZE -Z(DATA)NEAR_N=_..X_EXT_NV_BASE:+_..X_EXT_NV_SIZE ////////////////////////////////////////////////////////////////////////////// // Internal EEPROM -Z(XDATA)EEPROM_I,EEPROM_N=_..X_EEPROM_START-_..X_EEPROM_END На это мне говорят непонятную фразу: Linking Fatal Error[e106]: Syntax error or bad argument in -D_..X_FLASH_BASE=_..X_INTVEC_SIZE |
Сообщ.
#5
,
|
|
|
А если попробовать расположить строку
Цитата -Z(DATA)HEAP+0x6F00=0x1100-0x8000 последней в списке ? Сообщение об ошибке, как я понял, относится к ROM а не к RAM. На первый взгляд все правильно, но с этой версией линкера я не работал, у меня все проще. Если не все понятно, надо посмотреть документацию на содержание .xcl - файла. Обычно эта документация прилагается и там несложно разобраться. Возможно, это не тот файл. Файлов может быть и несколько под разные модели памяти и сегментации. |
Сообщ.
#6
,
|
|
|
Действительно, я менял не тот файл. Нашел, вроде бы действительно подходящий для этого, поменял все, что нужно.
Все откомпилировалось, но в отладчике выполнение даже не доходит до начала main. Выполняется участок ассемблерного кода с меткой __flashcpy. Притом, когда просто отключаю Linker command file - Override default, код выполняется нормально, просто все большие запросы к маллоку возвращают 0. Вот файл линкера, между строками комментариев "/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/" те строки, которые я менял: /* - lnkm128.xcl - * * XLINK command file for the ICCAVR C-compiler using the --cpu=m128, -ms * options. Segments are defined for an ATmega128 whithout external * memory. It is also possible to "add" external SRAM, EPROM and EEPROM. * * Usage: xlink your_file(s) -f lnkm128 * * File version: $Revision: 1.9 $ */ /*====================================================*/ /* * Constants used down below, * Do not change these lines, * if it is not stated otherwise */ /* Code (flash) segments */ -D_..X_INTVEC_SIZE=8C /* 4 bytes * 35 vectors */ -D_..X_FLASH_TEND=FF /* End of tiny flash memory */ -D_..X_FLASH_NEND=FFFF /* End of near flash memory */ -D_..X_FLASH_END=1FFFF /* End of flash memory */ /* Internal data memory */ /* * Change the two lines below to 60(BASE) and FF(TEND) * if you are running in "mega103 mode" */ -D_..X_SRAM_BASE=100 /* Start of ram memory */ -D_..X_SRAM_TEND=100 /* End of tiny ram memory */ -D_..X_SRAM_END=10FF /* End of ram memory */ /* Internal EEPROM */ -D_..X_EEPROM_END=FFF /* End of eeprom memory */ /*====================================================*/ /* * Modify the lines below to alter the size of the RSTACK, CSTACK and HEAP * segments. These need to be fine tuned to suit your specific application. * The '_..X_' prefix is used by C-SPY as an indication that the label should * not be displayed in the dissassembly window. */ -D_..X_CSTACK_SIZE=400 /* 1024 bytes for auto variables and saved registers. */ -D_..X_RSTACK_SIZE=40 /* 64 bytes for return addresses, equivalent to 32 */ /* levels of calls, including interrupts. */ /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -D_..X_HEAP_SIZE=6F00 -D_..X_NEAR_HEAP_SIZE=6F00 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /* * Modify these lines if you have an external SRAM connected to the system. * * Note: Remember to turn on the external data and address busses in * __low_level_init if external memory is used. */ /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -D_..X_EXT_SRAM_BASE=1100 -D_..X_EXT_SRAM_END=8000 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /* * Modify these lines if you have an external EPROM connected to the system. * * Note: Remember to turn on the external data and address busses in * __low_level_init if external memory is used. */ -D_..X_EXT_EPROM_BASE=_..X_SRAM_BASE -D_..X_EXT_EPROM_END=_..X_SRAM_END /* * Modify these lines if you have an external EEPROM connected to the system. * * Note: Remember to turn on the external data and address busses in * __low_level_init if external memory is used. */ -D_..X_EXT_EEPROM_BASE=_..X_SRAM_BASE -D_..X_EXT_EEPROM_END=_..X_SRAM_END /* * The following segments are located in the internal memory of * the ATmega128. Do not change these lines. */ /* Define CPU */ -ca90 /* Code memory */ -Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1) /* Fill unused interrupt vector's with RETI */ //-H1895 -h(CODE)0-_..X_INTVEC_SIZE -Z(CODE)TINY_F=_..X_INTVEC_SIZE-_..X_FLASH_TEND -Z(CODE)NEAR_F,SWITCH,DIFUNCT=_..X_INTVEC_SIZE-_..X_FLASH_NEND -Z(CODE)CODE=_..X_INTVEC_SIZE-_..X_FLASH_END -Z(FARCODE)FAR_F=_..X_INTVEC_SIZE-_..X_FLASH_END -Z(CODE)HUGE_F,INITTAB=_..X_INTVEC_SIZE-_..X_FLASH_END -Z(CODE)TINY_ID,NEAR_ID=_..X_INTVEC_SIZE-_..X_FLASH_END -Z(CODE)CHECKSUM#_..X_FLASH_END /* Internal data memory */ -Z(DATA)TINY_I,TINY_Z,TINY_N=_..X_SRAM_BASE-_..X_SRAM_TEND -Z(DATA)NEAR_I,NEAR_Z=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END /* * If external SRAM is available it is possible to place the stacks there. * However, the external memory is slower than the internal so moving the * stacks to the external memory will degrade the system performance. */ -Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END /* ,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END */ -Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END /* ,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END */ /* * If external SRAM is available it might be a good idea to move the * heap segment there, i.e. remove the _..X_SRAM_BASE-_..X_SRAM_END range. */ /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -Z(DATA)HEAP+_..X_HEAP_SIZE=_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -Z(DATA)IOSTREAM_N#_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -Z(DATA)NEAR_HEAP+_..X_NEAR_HEAP_SIZE=_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ /* Internal eeprom memory */ -Z(XDATA)EEPROM_I,EEPROM_N=0-_..X_EEPROM_END /* * The following segment definitions are only used if external memory is * connected to the AVR controller. */ /* External EPROM */ -Z(CONST)NEAR_C=_..X_EXT_EPROM_BASE-_..X_EXT_EPROM_END /* External EEPROM */ -Z(DATA)NEAR_N=_..X_EXT_EEPROM_BASE-_..X_EXT_EEPROM_END /* Select reduced "printf" support to reduce library size. See configuration section in manual concerning printf/sprintf. */ /*Dlib*/ -e_PrintfSmall=_Printf /*Clib*/ -e_small_write=_formatted_write /*Dlib and Clib*/ -e_small_write_P=_formatted_write_P /* Disable floating-point support in "scanf" to reduce library size. See configuration section in manual concerning scanf/sscanf */ /*Dlib*/ -e_ScanfSmall=_Scanf /*Clib*/ -e_medium_read=_formatted_read /*Dlib and Clib*/ -e_medium_read_P=_formatted_read_P /* Suppress one warning which is not relevant for this processor */ -w29 /* Code will now reside in file aout.a90 or aout.d90, unless -o is specified */ /* .d90 is the default if debug system is linked (option -r) */ /* .a90 is the default without debugging. Default format is -Fmotorola */ |
Сообщ.
#7
,
|
|
|
Цитата Matracc @ Выполняется участок ассемблерного кода с меткой .. У меня точно такого результата не было, поэтому могу только предполагать. я бы попробовал проверить - а не сбрасываются/устанавливаются какие-либо "птички" в настройках среды автоматически, когда меняется .xcl - файл ? Разрешена ли внешняя память в настройках проекта ? У AVR действительно возможна тупиковая ситуация, если стек смонтирован на внешнюю память, а она запрещена. Если поиски по документации не приведут к успеху, можно просто поизучать - на чем циклится программа ? Что читает и чего ожидает ? Выяснив, какой(ие) регистры старт-ап читает и какие биты ожидает можно понять, что происходит. Попробуй еще тут поспрашивать. |