Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Инструментарий

Инструментарий Тестеры, паяльники, осциллографы, программаторы, IDE.

Ответ
 
Опции темы Опции просмотра
Старый 03.06.2019, 14:15   #1
AJ_1983
Junior Member
 
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/25
AJ_1983 will become famous soon enoughAJ_1983 will become famous soon enough
Thumbs down XC8 не выделяет память локальным переменным при наличии свободных банков

Есть большой проект для 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;
...
}
__Compiler:

: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  //!

Внимание, вопрос - что это за жуть, и как с ней бороться?
AJ_1983 вне форума   Ответить с цитированием
Старый 03.06.2019, 17:40   #2
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 46
Сообщений: 497
Вес репутации: 1159/61
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Например:
Код:
...
__bank(15) BYTE  deb[50];
...
__________________
Для связи email: info собака qbit.su
bzx вне форума   Ответить с цитированием
Старый 03.06.2019, 18:34   #3
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,140
Вес репутации: 4017/87
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

AJ_1983
Как я понял, причина - компилятор упорно хочет добавить ее именно в банк0 - компилятор может добавить ее только в стек.

если Вы добавите квалификатор static, то функция перестанет быть реентрабельной.

xc8 1.32 был выпущен довольно давно, вряд-ли Вы найдете тех, кто в деталях знаете ограничения стека того релиза.

попробуйте обновить до последней версии xc8.
besogon вне форума   Ответить с цитированием
Старый 04.06.2019, 06:35   #4
AJ_1983
Junior Member
 
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/25
AJ_1983 will become famous soon enoughAJ_1983 will become famous soon enough
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Цитата:
Сообщение от bzx Посмотреть сообщение
Например:
Код:
...
__bank(15) BYTE  deb[50];
...
Я в примере дал намек, что такие спецификаторы он принимает только в "file scope" (для глобальных). Да и будь это возможно, тусовать переменные по банкам за си-компилятор? Они доплачивать должны людям за такое г-но.
AJ_1983 вне форума   Ответить с цитированием
Старый 04.06.2019, 06:44   #5
AJ_1983
Junior Member
 
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/25
AJ_1983 will become famous soon enoughAJ_1983 will become famous soon enough
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Цитата:
Сообщение от besogon Посмотреть сообщение
AJ_1983
компилятор может добавить ее только в стек.
... который он тут и организовал в банк0. А вот кто не дает его расширить, и как это укаазть, большой вопрос.

Цитата:
если Вы добавите квалификатор static, то функция перестанет быть реентрабельной.
Конечно, это просто чтобы понять, что происходит.

Цитата:
xc8 1.32 был выпущен довольно давно, вряд-ли Вы найдете тех, кто в деталях знаете ограничения стека того релиза.
Не так уж давно. Классика микрочип, никто толком не знает, что именно и где не работает, и при 1й проблеме - а портируйте ка ваш проект под вот это, ВДРУГ получится. А там legacy библиотеки...

Цитата:
попробуйте обновить до последней версии xc8.
Она вакцино-устойчивая, и портировать долго (см. выше), надо же еще добиться такой-же нехватки для проверки. Лотерея с ними в общем
AJ_1983 вне форума   Ответить с цитированием
Старый 04.06.2019, 08:56   #6
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,140
Вес репутации: 4017/87
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

AJ_1983
А вот кто не дает его расширить, и как это укаазть, большой вопрос. - насколько я помню, там в настройках были пункты, которые можно было менять. однако хороших воспоминаний об xc8 у меня нет.

Классика микрочип, никто толком не знает, что именно и где не работает - нет, Ваша проблема в том, что Вы считаете, что кто-то помнит особенности компилятора, что был выпущен более 2х лет назад. Нужно документацию тех лет пытаться где-то найти.

есть SDCC, но он в общем случае не совместим с xc8.
besogon вне форума   Ответить с цитированием
Старый 04.06.2019, 09:57   #7
AJ_1983
Junior Member
 
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/25
AJ_1983 will become famous soon enoughAJ_1983 will become famous soon enough
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Цитата:
Сообщение от besogon Посмотреть сообщение
насколько я помню, там в настройках были пункты, которые можно было менять.
Да, есть Stack type: compiled (исходно), reentrant и hybrid. С последними, или при использовании для той тестируемой функции локального аналога опции "reentrant", начинаются другие проблемы - "registers unavailable for code generation of this expression" в других функциях. Да и судя по мануалу compiled и быстрее, и должен подходить.

Цитата:
Ваша проблема в том, что Вы считаете, что кто-то помнит особенности компилятора, что был выпущен более 2х лет назад.
Не считаю, а надеюсь, какие м.б. притязания к простым людям. У микрочип я конечно тоже спрошу, но это долго, трудно и, как показала практика, толку мало.

Цитата:
Нужно документацию тех лет пытаться где-то найти.
Вообще нет проблем с доками, вот. Проблемы с их соответствием реальности (или пониманием, всё м.б.).

Цитата:
5.5.2.2.3 Size Limits of Auto Variables
The compiled stack is built up as one contiguous block which can be placed into one of the available data banks. However, if the stack becomes too large for this space, it can be assembled into several blocks, with each block being positioned in a different bank of memory ...
it is not efficient to access auto variables within the compiled stack using the linear memory... compiled stack must fit entirely within one bank of data memory on the target device (however, you can have more than one component, each allocated to a different bank)...
The software stack is always allocated one block of memory. This memory may cross bank boundaries...
If a program requires large objects that should not be accessible to the entire program, consider leaving them as local objects, but using the static specifier (только для ускорения доступа!?). Such variables are still local to a function, but are no longer auto and have fewer size limitations.
Миниатюры
MPLAB_XC8_C_Compiler_User_Guide.pdf  
AJ_1983 вне форума   Ответить с цитированием
Старый 04.06.2019, 10:19   #8
AJ_1983
Junior Member
 
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/25
AJ_1983 will become famous soon enoughAJ_1983 will become famous soon enough
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Еще поэкспериментировал с 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. Причина: дополнение
AJ_1983 вне форума   Ответить с цитированием
Старый 04.06.2019, 10:57   #9
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,633
Вес репутации: 2423/82
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Цитата:
Сообщение от AJ_1983 Посмотреть сообщение
, тусовать переменные по банкам за си-компилятор? Они доплачивать должны людям за такое г-но.

Меня тоже всегда удивляло, почему Хай Течь Си не распределял переменные по банкам, это нужно было делать вручную.
А ведь это был лучший компилятор дя пиков.
DimaS вне форума   Ответить с цитированием
Старый 04.06.2019, 11:25   #10
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,140
Вес репутации: 4017/87
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

AJ_1983
Вы можете обойтись без выделения массива более 127 байт на стеке? компилятор говорит, что не может выделить столь большой стековый кадр и скорее всего в рамках 1.32 это не решается.

Да и судя по мануалу compiled и быстрее, и должен подходить. - по моему опыту прекомпилированный стек использовать не надо. Это лишняя головная боль.

Насколько я помню, в xc8 есть довольно много ограничений, с которыми придется жить. Может сейчас стало лучше.

Можно долго ругаться на xc8, но у Вас уже большой проект на xc8 и чтобы не тратить силы на портирование, проще как-то закончить и в следующий раз задуматься над архитектурой системы.
besogon вне форума   Ответить с цитированием
Старый 04.06.2019, 12:39   #11
AJ_1983
Junior Member
 
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/25
AJ_1983 will become famous soon enoughAJ_1983 will become famous soon enough
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Да я конечно могу обойтись, денек танцев с бубнами, и запас останется еще. Но дело в том, что тут даже не понятно, в чем проявляется ограничение, и как собственно далее "задуматься над архитектурой", если строго по докам тут и так д.б.б. приличный запас по всем параметрам. В таком раскладе задуматься следует думаю только глобально - отказаться от производителя-раздолбая.
AJ_1983 вне форума   Ответить с цитированием
Старый 04.06.2019, 12:45   #12
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,140
Вес репутации: 4017/87
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

AJ_1983
отказаться от производителя-раздолбая - есть pic24, pic32m, pic32c, если рассматривать в пределах одной среды разработки - по моему опыту с точки зрения разработки серия pic24 в разы удобней, нежели pic16.

все проекты с pic14/pic16, которых я касался, вызывают у меня чувство тревоги. и не только из-за того, что xc8 плохой компилятор.
besogon вне форума   Ответить с цитированием
Старый 04.06.2019, 14:04   #13
AJ_1983
Junior Member
 
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/25
AJ_1983 will become famous soon enoughAJ_1983 will become famous soon enough
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Что pic16, что pic18 - это да, синоним слова "грабли". Но наработки-с...
Субъективно ХС16 адекватнее. Но с до-MLAшными библиотеками Ethernet, с библиотекой эмулятора EEPROM - та же беда, хотите адеквата - доработайте напильником.
И с самими dsPIC33, например, я тоже хапнул, с SPI и Alt.Flash как минимум. И это не считая глючности MPLAB X как таковой.
AJ_1983 вне форума   Ответить с цитированием
Старый 05.06.2019, 07:32   #14
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,866
Вес репутации: 5553/169
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Цитата:
Сообщение от DimaS Посмотреть сообщение
Меня тоже всегда удивляло, почему Хай Течь Си не распределял переменные по банкам, это нужно было делать вручную.
А ведь это был лучший компилятор дя пиков.
распределять самому - в этом хоть есть логика. можно соптимизировать на переключении банков при группировке "родственных" переменных.
есть компилятор (тоже считается лучшим в своем классе), где надо ещё и самому переключать банк перед использованием переменной...
http://www.microchip.su/showpost.php...25&postcount=5
Greg вне форума   Ответить с цитированием
Старый 05.06.2019, 07:58   #15
AJ_1983
Junior Member
 
Регистрация: 16.04.2013
Сообщений: 11
Вес репутации: 100/25
AJ_1983 will become famous soon enoughAJ_1983 will become famous soon enough
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Нет слов, одни шипящие... Стандартизация тут явно зашла в тупик.
AJ_1983 вне форума   Ответить с цитированием
Старый 05.06.2019, 09:56   #16
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,140
Вес репутации: 4017/87
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Greg
на переключении банков при группировке "родственных" переменных. - родственные переменные на мой взгляд должны быть упакованы в структуры.

другой вопрос, что в том же xc8 есть проблемы со структурами.
besogon вне форума   Ответить с цитированием
Старый 06.06.2019, 08:20   #17
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,866
Вес репутации: 5553/169
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: XC8 не выделяет память локальным переменным при наличии свободных банков

Цитата:
Сообщение от besogon Посмотреть сообщение
Greg
на переключении банков при группировке "родственных" переменных. - родственные переменные на мой взгляд должны быть упакованы в структуры.
это уже наверное "семейственность"
Цитата:
Сообщение от besogon Посмотреть сообщение
другой вопрос, что в том же xc8 есть проблемы со структурами.
не мудрено. основная фишка в работе со структурой - простота копирования и обращение по указателю, а с указателями там всегда (by design) была беда. В хайтеке няп для переменной в определенном банке должен был быть и специальный (для этого банка) указатель.
Проще было "не фигурять"...
Greg вне форума   Ответить с цитированием
Ответ

Метки
bank, compiler, memory, pic18f, xc8


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что за зверь - Скатерограмма Edua Общетехнические вопросы 17 01.03.2013 23:33
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
Передача сигнала по линии питания 24В maagalex Общетехнические вопросы 34 25.04.2010 21:11


Часовой пояс GMT +3, время: 13:21.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot