Перейти к содержанию
    

IAR и строки - помогите

в проекте 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 что тут написать ?

gsm_sms.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какую строку вписать в массив temp

...

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

 

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

 

temp надо объявить как

char __flash* temp;

 

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

typedef char __flash* PGM_P;

 

и дальше

 

PGM_P temp;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

ab15c072900bt.jpg

 

 

2b3693578c5bt.jpg

 

 

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

 

 

8f165b705565t.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так напишите, как ему хочется - const char* __flash temp

ну или const char __flash* temp ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

const или в обоих случаях пишите или в обоих не пишите. Так как все равно __flash, то оба варианта эквивалентны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Итак !!! typedef char const __flash* PGM_P; он съел таки ! Ура.

 

Ну так напишите, как ему хочется - 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

Изменено пользователем dowhile

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Segment CODE (size: 0x664 align: 0x1) is too long for segment definition. At least 0xaa more bytes needed

насколько я понимаю, код не влазит в отведённый ему сегмент.

Проверьте настройки проекта на предмет правильности установки типа контроллера

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

6922fad1436a.png

1_gsm_sms.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну тогда порпробуйте поширше чип взять.

Если прокатит - надо поиграть с оптимизацией, авось утопчет эти 170 байт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну тогда порпробуйте поширше чип взять.

Если прокатит - надо поиграть с оптимизацией, авось утопчет эти 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 байт ?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Если Вы хотите использовать или менять данные настройки линкера, снимите галку

в System configuration в том окошке, которое Вы показали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

понял - это пространство CODE:246-7ff а где уменьшить число 246h в каких настройках ?
А нигде. Вы же сами видите, там лежат другие (не менее необходимые) данные:

 

CODE:16-23d NEAR_F

CODE:23e-245 INITTAB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте ещё скомпилить релиз - в дебаг может всякую хрень насовать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Релизе таже батва что в Дебаге - вот. Что это такое ?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...