реклама на сайте
подробности

 
 
> Как сделать дырку в коде, EWAVR 5.11B
LessNik
сообщение Nov 6 2009, 11:29
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 6-09-06
Из: Москва
Пользователь №: 20 118



Привет всем!
Подскажите, как объяснить компилятору, линкеру, чтобы расположить массив значений по строго заданному адресу во флеше. Причём так, чтобы код программы "огибал" этот массив.
Все попытки сделать дырку в коде заканчивались выводом ошибки:
Error[e16]: Segment CODE (size: 0x1104 align: 0x1) is too long for segment definition.
Если программа может разместиться до адреса, по которому пытаюсь расположить массив, то ошибки не происходит.

EWAVR 5.11B

Выражения типа
1. __root __flash const word XXX @ 0xBFE = {0xFFFF};
2.__root __flash const word XXX @ "MYSEGMENT" = {0xFFFF}; // в XCL: -Z(CODE)MYSEGMENT=AFE-AFF
3.__root __flash const word XXX @ 0xBFE = {0xFFFF};
#pragma required = XXX
не помогли.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Nov 6 2009, 13:08
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



а xcl файл вы свой написали?
Go to the top of the page
 
+Quote Post
LessNik
сообщение Nov 6 2009, 13:15
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 6-09-06
Из: Москва
Пользователь №: 20 118



Цитата(KRS @ Nov 6 2009, 16:08) *
а xcl файл вы свой написали?


За основу взял lnkm8.xcl и подредактировал немного
Код
/*                      - lnkm8.xcl -
*
*   XLINK command file for the ICCAVR C-compiler using the --cpu=m8, -ms
*   options.
*
*   Usage: xlink your_file(s) -f lnkm8
*
*   File version: $Revision: 1.8 $
*/

/*
* 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=100  /* 256 bytes for auto variables and saved registers. */
-D_..X_RSTACK_SIZE=20   /* 32 bytes for return addresses, equivalent to 16 */
                        /* levels of calls, including interrupts. */
-D_..X_HEAP_SIZE=0     /* 0 bytes of heap. */
-D_..X_NEAR_HEAP_SIZE=0     /* 0 bytes of heap. */

/* Define CPU */
-ca90

/*
* The following segments are located in the internal memory of
* the ATmega8. Do not change these lines.
*/

/* Code memory */

-Z(CODE)INTVEC=0-25 /* 19 Interrupt vectors * 2 bytes each */

/* Fill unused interrupt vector's with RETI */
-H1895 -h(CODE)0-25

-Z(CODE)TINY_F=26-FF
-Z(CODE)NEAR_F,SWITCH,INITTAB,DIFUNCT=26-17FF
-Z(CODE)CODE=26-17FF
-Z(CODE)MYSEGMENT=BFE-BFF
-Z(CODE)TINY_ID,NEAR_ID=26-17FF
-Z(CODE)CHECKSUM#1FFF


/* Internal data memory */
-Z(DATA)TINY_I,TINY_Z,TINY_N=60-FF
-Z(DATA)NEAR_I,NEAR_Z=60-45F
-Z(DATA)RSTACK+_..X_RSTACK_SIZE=60-45F
-Z(DATA)CSTACK+_..X_CSTACK_SIZE=60-45F
-Z(DATA)HEAP+_..X_HEAP_SIZE=60-45F
-Z(DATA)IOSTREAM_N#60-45F
-Z(DATA)NEAR_HEAP+_..X_NEAR_HEAP_SIZE=60-45F

/* Internal eeprom memory */
-Z(XDATA)EEPROM_I,EEPROM_N=0-1FF

/* 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 */
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 6 2009, 15:19
Сообщение #4


Гуру
******

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



Цитата(LessNik @ Nov 6 2009, 15:15) *
За основу взял lnkm8.xcl и подредактировал немного
Не поленитесь, почитайте документацию на линкер (опция -Z). Должно быть что-то вроде
Код
-D_..X_MYSEGMENT_START=BFE
-D_..X_MYSEGMENT_END=BFF

-Z(CODE)NEAR_F,SWITCH,INITTAB,DIFUNCT=26-(_..X_MYSEGMENT_START-1), (_..X_MYSEGMENT_END+1)-17FF
-Z(CODE)CODE=26-(_..X_MYSEGMENT_START-1), (_..X_MYSEGMENT_END+1)-17FF
-Z(CODE)MYSEGMENT=_..X_MYSEGMENT_START-_..X_MYSEGMENT_END
-Z(CODE)TINY_ID,NEAR_ID=26-(_..X_MYSEGMENT_START-1), (_..X_MYSEGMENT_END+1)-17FF
-Z(CODE)CHECKSUM#1FFF
То есть "обтекающие" сегменты должны быть заданы двумя диапазонами.
P.S. Писал по памяти, возможно вместо -Z потребуется -P (это тоже по памяти, могу ошибаться).
P.P.S. Сам не пробовал, просто в памяти отложилась такая возможность когда читал документацию.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 09:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01282 секунд с 7
ELECTRONIX ©2004-2016