Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR и строки - помогите
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
dowhile
в проекте IAR 5.20 ( вот архив с проектом gsm pager - http://slil.ru/27027257 ) есть строки одинаковой длины типа ...

const char __flash stroka1[] = "12F04EF0";

const char __flash stroka2[] = "1B207438";


...
...


где то в функции func происходит выбор
какую строку вписать в массив temp

void func(char cause)
{
temp = NULL;

switch(cause)
{
case 2:
temp = stroka1;
break;

case 3:
temp = stroka2;
break;


Затем строка из temp выводится в USART

===================================

Вопрос - как правильно объявить массив temp ???

Можно ли копировать так строки ?

===================================

В исходнике этот тип обозначен как PGM_P и использован в нескольких местах программы.

но отсутствует #define PGM_P

Нужно сделать:

#define PGM_P что тут написать ?
Непомнящий Евгений
Цитата(dowhile @ Mar 6 2009, 10:30) *
какую строку вписать в массив temp
...
Можно ли копировать так строки ?


temp - это не массив, а указатель. В вашей функции вы не копируете строку, а просто указываете на нужную.

temp надо объявить как
char __flash* temp;

вместо #define PGM_P значительно безопаснее использовать typedef:
typedef char __flash* PGM_P;

и дальше

PGM_P temp;
VladimirYU
Цитата(Непомнящий Евгений @ Mar 6 2009, 10:42) *
temp надо объявить как
char __flash* temp;


const char __flash* temp;
dowhile
Спасибо за помощь - я серьезно. Но ваши варианты не работают ! Если есть минутка откройте поект пожалуйста в IAR.

Вот скриншоты ошибок.

Спасибо. Но с вашими вариантами по 12 ошибок - типа тип не тот







Если вообще не определять то 5 ошибок в тех местах как описано в вопросе в начале топика.


MrYuran
Ну так напишите, как ему хочется - const char* __flash temp
ну или const char __flash* temp ...
Непомнящий Евгений
const или в обоих случаях пишите или в обоих не пишите. Так как все равно __flash, то оба варианта эквивалентны.
dowhile
Итак !!! typedef char const __flash* PGM_P; он съел таки ! Ура.

Цитата(MrYuran @ Mar 6 2009, 11:17) *
Ну так напишите, как ему хочется - const char* __flash temp
ну или const char __flash* temp ...

Дак в том то и дело что писал ТАК !

а надо было наоборот ! ЧАР а потом КОНСТ ! во как.

===================

Но теперь линкер заругался на сегменты что-то. Как исправить ситуацию ?

Вот брань линкера дословно: at90s2313


Building configuration: Gsm_sms - Debug
Updating build tree...
gsm_avrv4_c.c

Linking
Error[e16]: Segment CODE (size: 0x664 align: 0x1) is too long for segment definition. At least 0xaa more bytes needed. The problem occurred while processing the
segment placement command "-Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END", where at the moment of placement the available memory ranges were
"CODE:246-7ff"
Reserved ranges relevant to this placement:
CODE:16-23d NEAR_F
CODE:23e-245 INITTAB
CODE:246-7ff CODE
Error while running Linker

Total number of errors: 1
Total number of warnings: 0
MrYuran
Цитата
Segment CODE (size: 0x664 align: 0x1) is too long for segment definition. At least 0xaa more bytes needed

насколько я понимаю, код не влазит в отведённый ему сегмент.
Проверьте настройки проекта на предмет правильности установки типа контроллера
dowhile
Да я его туда сам вписывал. Может еще где подправить что-то нужно ? Если не в лом скачайте проект плиз - 12 кб всего.

MrYuran
ну тогда порпробуйте поширше чип взять.
Если прокатит - надо поиграть с оптимизацией, авось утопчет эти 170 байт
dowhile
Цитата(MrYuran @ Mar 6 2009, 11:35) *
ну тогда порпробуйте поширше чип взять.
Если прокатит - надо поиграть с оптимизацией, авось утопчет эти 170 байт


Усилил оптимизацию, но все равно не хватает.

Линкер пишет что сегмент кода 0x5c8 (это 1480) и нужно еще 0xe (это 14) байт.

Чего 1480+14 = 1496 байт в AT90s2313 или в любом другом AVR ???

понял - это пространство CODE:246-7ff а где уменьшить число 246h в каких настройках ?

===========================

Error[e16]: Segment CODE (size: 0x5c8 align: 0x1) is too long for segment definition. At least 0xe more bytes needed.

The problem occurred while processing the
segment placement command "-Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END", where at the moment of placement the available memory ranges were

"CODE:246-7ff"

Reserved ranges relevant to this placement:
CODE:16-23d NEAR_F
CODE:23e-245 INITTAB
CODE:246-7ff CODE

Error while running Linker

Total number of errors: 1
Total number of warnings: 0

Вот текст файла линкера lnk2313t.xcl - как в сегмент CODE добавить 20 байт ?

CODE
/* - lnk2313.xcl -
*
* XLINK command file for the ICCAVR C-compiler using the --cpu=2313, -mt
* options. Segments are defined for an AT90S2313 without external memory.
*
* Usage: xlink your_file(s) -f lnk2313
*
* File version: $Revision: 5794 $
*/

/*
* 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=20 /* 32 bytes for auto variables and register save. */
-D_..X_RSTACK_SIZE=10 /* 16 bytes for return addresses, equivalent to */
/* 8 levels of calls, including interrupts. */
-D_..X_HEAP_SIZE=10 /* 16 bytes of heap. */
-D_..X_TINY_HEAP_SIZE=10 /* 16 bytes of heap. */

/* Define CPU */
-ca90

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

/* Code memory */
-Z(CODE)INTVEC=0-15 /* 11 Interrupt vectors * 2 bytes each */

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

-Z(CODE)TINY_F=16-FF
-Z(CODE)SWITCH,INITTAB,DIFUNCT=16-7FF
-Z(CODE)CODE=16-7FF
-Z(CODE)NEAR_F=16-7FF
-Z(CODE)TINY_ID,NEAR_ID=16-7FF
-Z(CODE)CHECKSUM#7FF


/* Data memory */

-Z(DATA)TINY_I,TINY_Z,TINY_N=60-DF
-Z(DATA)CSTACK+_..X_CSTACK_SIZE=60-DF
-Z(DATA)HEAP+_..X_HEAP_SIZE=60-DF
-Z(DATA)IOSTREAM_N#60-DF
-Z(DATA)TINY_HEAP+_..X_TINY_HEAP_SIZE=60-DF
-Z(DATA)RSTACK+_..X_RSTACK_SIZE=60-DF
-Z(DATA)NEAR_I,NEAR_Z=60-DF

/* Internal eeprom memory */
-Z(XDATA)EEPROM_I,EEPROM_N=0-7F

/* 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 */


\\\\\\\\\\\\\\\

выкинул из проги одну большую строку - влезла в память.


Теперь новая напасть - что за ошибка ?


Building configuration: Gsm_sms - Debug
Updating build tree...
gsm_avrv4_c.c
Linking
Error[e46]: Undefined external "__iar_Strchr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Debug\Obj\gsm_avrv4_c.r90 )
Error[e46]: Undefined external "__iar_Strstr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Debug\Obj\gsm_avrv4_c.r90 )
Error while running Linker

Total number of errors: 2
Total number of warnings: 0
VladimirYU
[quote name='dowhile' date='Mar 6 2009, 11:55' post='557393']

Если Вы хотите использовать или менять данные настройки линкера, снимите галку
в System configuration в том окошке, которое Вы показали.
Сергей Борщ
Цитата(dowhile @ Mar 6 2009, 11:02) *
понял - это пространство CODE:246-7ff а где уменьшить число 246h в каких настройках ?
А нигде. Вы же сами видите, там лежат другие (не менее необходимые) данные:

CODE:16-23d NEAR_F
CODE:23e-245 INITTAB
MrYuran
Попробуйте ещё скомпилить релиз - в дебаг может всякую хрень насовать
dowhile
В Релизе таже батва что в Дебаге - вот. Что это такое ?

Building configuration: Gsm_sms - Release
Updating build tree...
gsm_avrv4_c.c
Linking
Error[e46]: Undefined external "__iar_Strchr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Release\Obj\gsm_avrv4_c.r90 )
Error[e46]: Undefined external "__iar_Strstr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Release\Obj\gsm_avrv4_c.r90 )
Error while running Linker

Total number of errors: 2
Total number of warnings: 0
VladimirYU
Цитата(dowhile @ Mar 6 2009, 12:08) *
В Релизе таже батва что в Дебаге - вот. Что это такое ?


Иногда помогает Rebuild all
Цитата(VladimirYU @ Mar 6 2009, 12:27) *
Иногда помогает Rebuild all

Попробуйте полностью пересобрать проект, т.е. сделайте Remove всем файлам, а затем заново включите в их проект. Проверьте правильность всех путей к хидерам и библиотекам.
MrYuran
Цитата(dowhile @ Mar 6 2009, 12:02) *
выкинул из проги одну большую строку - влезла в память.
Теперь новая напасть - что за ошибка ?

выкинули - вот и ошибка...
Ну возьмите для начала хоть мегу8...
а там уж, как разберётесь, может удастся упаковать
dowhile
Создал новую папку - туда только исходники скопировал, создал вокспэйс и новые проект.

таже батва :

Changed settings forces a full rebuild...
Building configuration: iar520 - Debug
Updating build tree...

0 file(s) deleted.
Updating build tree...
gsm_avrv4_c.c
Linking
Error[e46]: Undefined external "__iar_Strchr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Debug\Obj\gsm_avrv4_c.r90 )
Error[e46]: Undefined external "__iar_Strstr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Debug\Obj\gsm_avrv4_c.r90 )
Error while running Linker

Total number of errors: 2
Total number of warnings: 0



Цитата(MrYuran @ Mar 6 2009, 12:48) *
выкинули - вот и ошибка...


Ну еслиб совсем выкинул то и ошибка была что "адентифая не определен", конечно я просто укаоротил ее.


вот совсем убрал строку - ЕСТЕСТВЕННО он пишет об этом с возмущением:

Error[Pe020]: identifier "szSMSPower" is undefined C:\_WORKs\__gsm sms\gsm_avrv4_c.c 528


Теперь убрал упоминание это строки в проге - компилер опять за свое ....


Building configuration: iar520 - Debug
Updating build tree...
gsm_avrv4_c.c
Linking
Error[e46]: Undefined external "__iar_Strchr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Debug\Obj\gsm_avrv4_c.r90 )
Error[e46]: Undefined external "__iar_Strstr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Debug\Obj\gsm_avrv4_c.r90 )
Error while running Linker

Total number of errors: 2
Total number of warnings: 0
XVR
Цитата(dowhile @ Mar 6 2009, 12:08) *
В Релизе таже батва что в Дебаге - вот. Что это такое ?

Error[e46]: Undefined external "__iar_Strchr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Release\Obj\gsm_avrv4_c.r90 )
Error[e46]: Undefined external "__iar_Strstr" referred in gsm_avrv4_c ( C:\_WORKs\__gsm sms\Release\Obj\gsm_avrv4_c.r90 )
Error while running Linker
Похоже он это сделал из функций strstr и strchr. Либо они перебились каким то define'ом (где то в стандартных библиотеках), либо они таковыми и должны быть, а у вас не подключена библиотека со стринговыми функциями
dowhile
Вот че еще подключить то ???

#include <io2313.h>
#include <string.h>
#include <pgmspace.h>
#include <inavr.h>
#include <stdbool.h>
#include "signal.h"

Может прожект IAR скачайте да взглянете ? там 12 кб всего.

===========
блин крапал я себе в 2 мб CVAVR проблем не знал ни со стрингами ни с линкерами всякими ... а тут на тебе - ГОТОВЫЙ ПРОЕТ, компиль да юзай. Фига !

Может у меня демо период закончился ???
VladimirYU
Цитата(dowhile @ Mar 6 2009, 13:10) *
Вот че еще подключить то ???

У меня в релизе все собралось, правда под 5.10А

Цитата(VladimirYU @ Mar 6 2009, 13:35) *
У меня в релизе все собралось, правда под 5.10А

Да и еще, собралось под С++ с максимальной оптимизацией по объему.
Похоже для 2313 "коротка была кольчужка".
dowhile
Цитата(VladimirYU @ Mar 6 2009, 13:41) *
У меня в релизе все собралось, правда под 5.10А
Да и еще, собралось под С++ с максимальной оптимизацией по объему.
Похоже для 2313 "коротка была кольчужка".


Дак дайте плиз архивчик. Я 5.11 поставлю.
VladimirYU
Цитата(dowhile @ Mar 6 2009, 14:18) *
Дак дайте плиз архивчик. Я 5.11 поставлю.

А Вы свой уже прокидали? rolleyes.gif Я полагаю если Вы в опциях пректа поставите С++, и оптимизацию Size Maximum optimization, то должно все получиться и на 5.20
dowhile
Спасибо, попробую. Но у меня в WinAVR 200812 с ходу собралось все и в 2313 влезло БЕЗ вопросов с оптимизацией O1 - там такая была в мэйке.

Есще раз СПАСИБО ! всем кто помогал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.