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

 
 
 
Reply to this topicStart new topic
> Как сделать дырку в коде, 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
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
zltigo
сообщение Nov 6 2009, 14:41
Сообщение #4


Гуру
******

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



Цитата(LessNik @ Nov 6 2009, 14:29) *
Подскажите, как...

Уже устал удивляться неиссякающему потоку не желающих думать и тупо располагать данные по фиксированным адресам sad.gif. Ну не нужно это практически никогда. Как максимум нужен один расположенный, например, после таблицы векторов, указатель на эту область данных.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
LessNik
сообщение Nov 6 2009, 14:58
Сообщение #5


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

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



Цитата(zltigo @ Nov 6 2009, 17:41) *
Уже устал удивляться неиссякающему потоку не желающих думать и тупо располагать данные по фиксированным адресам sad.gif. Ну не нужно это практически никогда. Как максимум нужен один расположенный, например, после таблицы векторов, указатель на эту область данных.

Это имено тот случай, когда нужно. По другому сделать я могу, разными способами и без помощи окружающих. Нужно для совместимости с предыдущей разработкой. Лучше подскажите как сделать, чтоб программный код не располагался по определённому адресу, а "огибал его".
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 6 2009, 15:07
Сообщение #6


Гуру
******

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



Цитата(LessNik @ Nov 6 2009, 17:58) *
Нужно для совместимости с предыдущей разработкой

smile.gif smile.gif smile.gif
Цитата
чтоб программный код не располагался по определённому адресу, а "огибал его".

Что это Вы написали???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 6 2009, 15:19
Сообщение #7


Гуру
******

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


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

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



Цитата(zltigo @ Nov 6 2009, 18:07) *
smile.gif smile.gif smile.gif

Что это Вы написали???


Ещё раз по подробнее: Нужно сделать так, чтобы программа не занимала некоторые адреса.
Решение мне видится так:
1. Либо положить по этим адресам что-то, для того чтобы линкер не положил туда часть программы.
2. Либо как-то перепрыгнуть эти адреса, желательно без помощи асма, а при помощи директив компилятора, линкера.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 6 2009, 16:48
Сообщение #9


Гуру
******

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



Цитата(LessNik @ Nov 6 2009, 18:20) *
Решение мне видится так:

Это не решение, это желание smile.gif Учите опцию -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
Go to the top of the page
 
+Quote Post
LessNik
сообщение Nov 10 2009, 15:36
Сообщение #10


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

Группа: Свой
Сообщений: 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 ?
Прикрепленные файлы
Прикрепленный файл  PlacingCode.rar ( 23.49 килобайт ) Кол-во скачиваний: 68
 
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 10 2009, 16:14
Сообщение #11


Гуру
******

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



Цитата(LessNik @ Nov 10 2009, 18:36) *
Что-то не получилось сделать через опцию -P
Линкер не может сам разбить блок кода на два более мелких блока и расположить их по нужным областям.

А что, Вы типа почти одним куском все написали???? Почти без разбиения на файлы и функции??? Ну тогда чего на линкер пенять - не может он работу компилятора выполнять когда доступные ему куски большие и не вмещаются в две небольшие зоны. Ну а вообще с -P все принципиально работает - проверялось на этапе освоения линкера (кстати возьмите на сайте свежайший). Другое дело, что заниматься ерундой создавая проблемы на ровном месте не нужно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:22
Рейтинг@Mail.ru


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