![]() |
|
|
Инструментарий Тестеры, паяльники, осциллографы, программаторы, IDE. |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Junior Member
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/26 ![]() ![]() |
![]()
Есть большой проект для PIC18F66K22 на XC8 v.1.32pro. Полный код выложить не могу, но суть в следующем.
На некоторой стадии проект нормально собирался (хотя RAM там уже ЯКОБЫ мало). При попытке добавить в одну из функций (SyncEvent) небольшую переменную (deb) - ошибка выделения памяти. Как я понял, причина - компилятор упорно хочет добавить ее именно в банк0, м.б. потому что в нем уже были другие переменные функции. Банки 11-15 при этом простаивают. Стоит указать переменную как static (под которые очевидно выделен другой сектор) - все нормально. ПРИМЕР. __CODE Код:
... void SyncEvent() { BYTE i, mode; volatile BYTE deb[50]; // __section("bssBIGRAM") - ignored here deb[1] = 1; ... } :0: error: (1347) can't find 0x3C7 words (0x3c7 withtotal) for psect "bssBIGRAM" in class "BIGRAM" (largest unused contiguous range 0x316) __MAP: Код:
... TOTAL Name Link Load Length Space CLASS BANK0 cstackBANK0 60 60 51 1 dataBANK0 F6 F6 4 1 bssBANK0 B1 B1 45 1 ... SEGMENTS Name Load Length Top Selector Space Class cstackBANK0 000060 00009A 0000FA 60 1 BANK0 ... Symbol Table ?i2_CorrectPercent cstackBANK0 000060 ?i2_PWMtoPercents cstackBANK0 000060 __accesstop (abs) 000060 __pcstackBANK0 cstackBANK0 000060 i2CorrectPercent@PercVal cstackBANK0 000060 i2PWMtoPercents@PWMval cstackBANK0 000060 i2SetDevErr@SubErr cstackBANK0 000060 i2CorrectPercent@Out12mode cstackBANK0 000062 i2SetDevErr@Err cstackBANK0 000062 ?i2_PercentsToPWMtest cstackBANK0 000063 i2PercentsToPWMtest@PercVal cstackBANK0 000063 i2RunTestValues@tmp cstackBANK0 000069 i2_RunTestValues$1027 cstackBANK0 00006B i2RunTestValues@ReleN cstackBANK0 00006D i2SyncEvent@deb cstackBANK0 000070 //! i2SyncEvent@mode cstackBANK0 0000A2 i2SyncEvent@i cstackBANK0 0000A3 _ISR_HI$1039 cstackBANK0 0000AA _ISR_HI$1040 cstackBANK0 0000AC _ISR_HI$1042 cstackBANK0 0000AE ISR_HI@IntHiDone cstackBANK0 0000B0 ISR_LOW@LastCapture bssBANK0 0000B1 __pbssBANK0 bssBANK0 0000B1 _GoodIC_cnt bssBANK0 0000B9 _PWMvalcopy bssBANK0 0000C1 _CN_SPEDif bssBANK0 0000C9 _CuptureOV bssBANK0 0000CD _CuptureOffStage bssBANK0 0000D1 _AdrLogLvlCnt bssBANK0 0000D5 _CNT_10ms bssBANK0 0000D6 _Data_templ bssBANK0 0000D7 _RTS1toOff bssBANK0 0000D8 _RTS2toOff bssBANK0 0000D9 _RdTrash bssBANK0 0000DA _fCNT_20ms bssBANK0 0000DB _U1Data bssBANK0 0000DC _U2Data bssBANK0 0000E9 _TestROMSum1 dataBANK0 0000F6 __pdataBANK0 dataBANK0 0000F6 _TestROMSum2 dataBANK0 0000F8 ... __HbssBANK0 bssBANK0 0003C7 __HdataBANK0 dataBANK0 0003C7 __HidataBANK0 idataBANK0 0003C7 __LbssBANK0 bssBANK0 0003C7 МЕНЯЕМ: ... volatile BYTE static deb[50]; ... __Compiler: BUILD SUCCESSFUL (Free: 429) Memory Summary: Program space used 6B40h ( 27456) of E000h bytes ( 47.9%) Data space used D69h ( 3433) of F16h bytes ( 88.9%) Configuration bits used 7h ( 7) of 7h words (100.0%) EEPROM space used 400h ( 1024) of 400h bytes (100.0%) ID Location space used 0h ( 0) of 8h bytes ( 0.0%) Data stack space used 0h ( 0) of 4Fh bytes ( 0.0%) Extra sections used 370h ( 880) __MAP: Код:
... CLASS BANK0 cstackBANK0 60 60 80 1 dataBANK0 FD FD 3 1 bssBANK0 E0 E0 1D 1 ... CLASS BANK10 dataBANK10 A00 A00 100 1 CLASS BANK11 CLASS BANK12 CLASS BANK13 CLASS BANK14 CLASS BANK15 ... cstackBANK0 000060 0000A0 000100 60 1 BANK0 ... Symbol Table SyncEvent@deb bssBANK3 000300 //! Внимание, вопрос - что это за жуть, и как с ней бороться? ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
|
![]()
Например:
Код:
... __bank(15) BYTE deb[50]; ...
__________________
Для связи email: info собака qbit.su |
![]() |
![]() |
![]() |
#3 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
AJ_1983
Как я понял, причина - компилятор упорно хочет добавить ее именно в банк0 - компилятор может добавить ее только в стек. если Вы добавите квалификатор static, то функция перестанет быть реентрабельной. xc8 1.32 был выпущен довольно давно, вряд-ли Вы найдете тех, кто в деталях знаете ограничения стека того релиза. попробуйте обновить до последней версии xc8. |
![]() |
![]() |
![]() |
#4 |
Junior Member
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/26 ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#5 | |||
Junior Member
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/26 ![]() ![]() |
![]()
... который он тут и организовал в банк0. А вот кто не дает его расширить, и как это укаазть, большой вопрос.
Цитата:
Цитата:
Цитата:
![]() |
|||
![]() |
![]() |
![]() |
#6 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
AJ_1983
А вот кто не дает его расширить, и как это укаазть, большой вопрос. - насколько я помню, там в настройках были пункты, которые можно было менять. однако хороших воспоминаний об xc8 у меня нет. Классика микрочип, никто толком не знает, что именно и где не работает - нет, Ваша проблема в том, что Вы считаете, что кто-то помнит особенности компилятора, что был выпущен более 2х лет назад. Нужно документацию тех лет пытаться где-то найти. есть SDCC, но он в общем случае не совместим с xc8. |
![]() |
![]() |
![]() |
#7 | ||||
Junior Member
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/26 ![]() ![]() |
![]() Цитата:
Цитата:
Цитата:
Цитата:
|
||||
![]() |
![]() |
![]() |
#8 |
Junior Member
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/26 ![]() ![]() |
![]()
Еще поэкспериментировал с reentrant, просто убрал пока асм-функцию, с которой не компилилось.
С reentrant тот массив вошел уже и на 80 байт (с compiled предел был ~30), без видимого изменения оставшейся памяти в сводке (что многое говорит о ее адекватности, пишет 88%, на деле чуть не половина не занята). А вот на 180 байт уже: reentrant void SyncEvent() { BYTE i, mode; volatile BYTE deb[180]; ... main.c:1165: error: (1465) the stack frame size for function "_SyncEvent" (182 bytes) has exceeded the maximum allowable (127 bytes) Банки 11-15 по прежнему свободны... Последний раз редактировалось AJ_1983; 04.06.2019 в 10:20. Причина: дополнение |
![]() |
![]() |
![]() |
#9 |
Senior Member
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,691
Вес репутации: 2423/83 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
AJ_1983
Вы можете обойтись без выделения массива более 127 байт на стеке? компилятор говорит, что не может выделить столь большой стековый кадр и скорее всего в рамках 1.32 это не решается. Да и судя по мануалу compiled и быстрее, и должен подходить. - по моему опыту прекомпилированный стек использовать не надо. Это лишняя головная боль. Насколько я помню, в xc8 есть довольно много ограничений, с которыми придется жить. Может сейчас стало лучше. Можно долго ругаться на xc8, но у Вас уже большой проект на xc8 и чтобы не тратить силы на портирование, проще как-то закончить и в следующий раз задуматься над архитектурой системы. |
![]() |
![]() |
![]() |
#11 |
Junior Member
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/26 ![]() ![]() |
![]()
Да я конечно могу обойтись, денек танцев с бубнами, и запас останется еще. Но дело в том, что тут даже не понятно, в чем проявляется ограничение, и как собственно далее "задуматься над архитектурой", если строго по докам тут и так д.б.б. приличный запас по всем параметрам. В таком раскладе задуматься следует думаю только глобально - отказаться от производителя-раздолбая.
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
AJ_1983
отказаться от производителя-раздолбая - есть pic24, pic32m, pic32c, если рассматривать в пределах одной среды разработки - по моему опыту с точки зрения разработки серия pic24 в разы удобней, нежели pic16. все проекты с pic14/pic16, которых я касался, вызывают у меня чувство тревоги. и не только из-за того, что xc8 плохой компилятор. |
![]() |
![]() |
![]() |
#13 |
Junior Member
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/26 ![]() ![]() |
![]()
Что pic16, что pic18 - это да, синоним слова "грабли". Но наработки-с...
Субъективно ХС16 адекватнее. Но с до-MLAшными библиотеками Ethernet, с библиотекой эмулятора EEPROM - та же беда, хотите адеквата - доработайте напильником. И с самими dsPIC33, например, я тоже хапнул, с SPI и Alt.Flash как минимум. И это не считая глючности MPLAB X как таковой. |
![]() |
![]() |
![]() |
#14 | |
Super Moderator
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,893
Вес репутации: 5611/171 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
есть компилятор (тоже считается лучшим в своем классе), где надо ещё и самому переключать банк перед использованием переменной... http://www.microchip.su/showpost.php...25&postcount=5 |
|
![]() |
![]() |
![]() |
#15 |
Junior Member
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/26 ![]() ![]() |
![]()
Нет слов, одни шипящие... Стандартизация тут явно зашла в тупик.
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,179
Вес репутации: 4133/90 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Greg
на переключении банков при группировке "родственных" переменных. - родственные переменные на мой взгляд должны быть упакованы в структуры. другой вопрос, что в том же xc8 есть проблемы со структурами. |
![]() |
![]() |
![]() |
#17 | |
Super Moderator
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,893
Вес репутации: 5611/171 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
не мудрено. основная фишка в работе со структурой - простота копирования и обращение по указателю, а с указателями там всегда (by design) была беда. В хайтеке няп для переменной в определенном банке должен был быть и специальный (для этого банка) указатель. Проще было "не фигурять"... |
|
![]() |
![]() |
![]() |
Метки |
bank, compiler, memory, pic18f, xc8 |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
что за зверь - Скатерограмма | Edua | Общетехнические вопросы | 17 | 01.03.2013 23:33 |
Имитатор DS18B20 | Filya44 | Вопросы начинающих | 14 | 12.03.2012 17:39 |
Передача сигнала по линии питания 24В | maagalex | Общетехнические вопросы | 34 | 25.04.2010 21:11 |