dowhile 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба в проекте 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба какую строку вписать в массив temp ... Можно ли копировать так строки ? temp - это не массив, а указатель. В вашей функции вы не копируете строку, а просто указываете на нужную. temp надо объявить как char __flash* temp; вместо #define PGM_P значительно безопаснее использовать typedef: typedef char __flash* PGM_P; и дальше PGM_P temp; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба temp надо объявить как char __flash* temp; const char __flash* temp; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dowhile 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба Спасибо за помощь - я серьезно. Но ваши варианты не работают ! Если есть минутка откройте поект пожалуйста в IAR. Вот скриншоты ошибок. Спасибо. Но с вашими вариантами по 12 ошибок - типа тип не тот Если вообще не определять то 5 ошибок в тех местах как описано в вопросе в начале топика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба Ну так напишите, как ему хочется - const char* __flash temp ну или const char __flash* temp ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба const или в обоих случаях пишите или в обоих не пишите. Так как все равно __flash, то оба варианта эквивалентны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dowhile 0 6 марта, 2009 Опубликовано 6 марта, 2009 (изменено) · Жалоба Итак !!! 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 Изменено 6 марта, 2009 пользователем dowhile Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба Segment CODE (size: 0x664 align: 0x1) is too long for segment definition. At least 0xaa more bytes needed насколько я понимаю, код не влазит в отведённый ему сегмент. Проверьте настройки проекта на предмет правильности установки типа контроллера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dowhile 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба Да я его туда сам вписывал. Может еще где подправить что-то нужно ? Если не в лом скачайте проект плиз - 12 кб всего. 1_gsm_sms.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба ну тогда порпробуйте поширше чип взять. Если прокатит - надо поиграть с оптимизацией, авось утопчет эти 170 байт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dowhile 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба ну тогда порпробуйте поширше чип взять. Если прокатит - надо поиграть с оптимизацией, авось утопчет эти 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба Если Вы хотите использовать или менять данные настройки линкера, снимите галку в System configuration в том окошке, которое Вы показали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба понял - это пространство CODE:246-7ff а где уменьшить число 246h в каких настройках ?А нигде. Вы же сами видите, там лежат другие (не менее необходимые) данные: CODE:16-23d NEAR_F CODE:23e-245 INITTAB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба Попробуйте ещё скомпилить релиз - в дебаг может всякую хрень насовать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dowhile 0 6 марта, 2009 Опубликовано 6 марта, 2009 · Жалоба В Релизе таже батва что в Дебаге - вот. Что это такое ? 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться