|
Как сделать дырку в коде, EWAVR 5.11B |
|
|
|
 |
Ответов
(1 - 10)
|
Nov 6 2009, 13:15
|

Частый гость
 
Группа: Свой
Сообщений: 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 */
|
|
|
|
|
Nov 6 2009, 14:58
|

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

|
Цитата(zltigo @ Nov 6 2009, 17:41)  Уже устал удивляться неиссякающему потоку не желающих думать и тупо располагать данные по фиксированным адресам  . Ну не нужно это практически никогда. Как максимум нужен один расположенный, например, после таблицы векторов, указатель на эту область данных. Это имено тот случай, когда нужно. По другому сделать я могу, разными способами и без помощи окружающих. Нужно для совместимости с предыдущей разработкой. Лучше подскажите как сделать, чтоб программный код не располагался по определённому адресу, а "огибал его".
|
|
|
|
|
Nov 6 2009, 15:19
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 6 2009, 15:20
|

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

|
Цитата(zltigo @ Nov 6 2009, 18:07)  Ещё раз по подробнее: Нужно сделать так, чтобы программа не занимала некоторые адреса. Решение мне видится так: 1. Либо положить по этим адресам что-то, для того чтобы линкер не положил туда часть программы. 2. Либо как-то перепрыгнуть эти адреса, желательно без помощи асма, а при помощи директив компилятора, линкера.
|
|
|
|
|
Nov 6 2009, 16:48
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(LessNik @ Nov 6 2009, 18:20)  Решение мне видится так: Это не решение, это желание  Учите опцию -P -P(CODE)CODE=0-BEF,C00-3FFF -Z(CODE)MYSEGMENT=BF0-BFF Но дырочка все равно будет - до байта подгонка невозможна Цитата(Сергей Борщ @ Nov 6 2009, 18:19)  P.S. Писал по памяти, возможно вместо -Z потребуется -P (это тоже по памяти, могу ошибаться). Без -P, не будет категорически, ибо -Z это последовательно одним куском.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 10 2009, 15:36
|

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

|
Что-то не получилось сделать через опцию -P -P(CODE)CODE=100-1FF,240-440 Error[e104]: Failed to fit all segments into specified ranges. Problem discovered in segment CODE. Unable to place 1 block(s) (0x23c byte(s) total) in 0x261 byte(s) of memory. The problem occurred while processing the segment placement command "-P(CODE)CODE=100-1FF,240-440", where at the moment of placement the available memory ranges were "CODE:100-1ff,CODE:240-440" Линкер не может сам разбить блок кода на два более мелких блока и расположить их по нужным областям. Пока решил проблему при помощи создания нового сегмента и поместил в него некоторые функции. Пример прикрепил. Возможно кому-то интересно будет посмотреть. Чтобы линкер не ругался необходимо убрать комментарий перед #pragma location. Может у кого-нибудь есть рабочий пример через опцию -P ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|