Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: #pragma bank pic16f887
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Mikron
Здравствуйте, есть проблема с программой, не хватает памяти.
Вот что пишет компилятор CC5X
Код
Error[1] C:\pic\pr2\main.c 1241 : No space for global variable 'blink_b'
(Too few RAM locations (within a specific bank or shared) are available.
#pragma rambank or bank type modifiers (bank0 ..) can be used to move
variables to another bank)
RAM : -------- -------- -------- -------- ======== ======== =======. ........
  40h: ........ ........ ........ ........ ........ ........ ........ .*******
  80h: --...--- --..---- -------- -------- ******** ******** ******** ********
  C0h: ******** ******** ******** ******** ******** ******** -------- --------
100h: -------- -------- ******** ******** ******** ******** ******** ********
140h: ******** ******** ******** ******** ******** ******** -------- --------
180h: -------- -------- ******** ******** ******** ******** ******** ********
1C0h: ******** ******** ******** ******** ******** ******** -------- --------
RAM usage: 89 bytes (23 local), 279 bytes free



Вот что если убрать немного кода
Код
Codepage 0 has 1961 word(s) :  95 %
Codepage 1 has    0 word(s) :   0 %
Codepage 2 has    0 word(s) :   0 %
Codepage 3 has    0 word(s) :   0 %
Total of 1961 code words (23 %)


Вопрос, как сделать так, что бы программа была и на других codepage, с использованием pragma rambank я так понимаю?

Спасибо за помощь(
doublekey
Укажите для части перменных bankX перед типом.
Делаю так:
Код
bank1 struct accel_struct accel_z; // Акселерометр Z.
bank1 struct accel_struct accel_x; // Акселерометр X.
bank2 struct temp_struct temp_z; // Датчик температуры Z.
bank2 struct temp_struct temp_x; // Датчик температуры X.

При этом данные располагаются соответственно в 1 и 2 банке.
У вас проблема в том, что не хватает именно памяти данных, с заполненностью памяти программ (codepage) это не связано.
xemul
Цитата(Mikron @ Dec 21 2012, 13:08) *
Здравствуйте, есть проблема с программой, не хватает памяти.
Вот что пишет компилятор CC5X
Код
Error[1] C:\pic\pr2\main.c 1241 : No space for global variable 'blink_b'
...
RAM usage: 89 bytes (23 local), 279 bytes free
...
Total of 1961 code words (23 %)

Вопрос, как сделать так, что бы программа была и на других codepage, с использованием pragma rambank я так понимаю?

CODE(page) и RAM(bank) в пиках непосредственно никак не пересекаются. Под программу у Вас используется только 23% наличной памяти.
В программе действительно нужны (89-23)=(64+1) байтов под глобальные переменные? (+1 - это как раз тот байт, под который не хватает памяти в bank0 _этого_ контроллера)
С глобальными переменными у компиляторов под пики проблемы - они размещаются только в bank0.

Со словом bank всё просто. Вы можете объявить глобальную или статическую локальную как
(static) bank1(2, 3, ...) int my_var;

По #pragma rambank могу только предложить почитать мануал компилятора, т.к. посредством #pragma описываются чудеса конкретного компилятора.
(скорее всего для размещения переменных в разных банках CC5X предполагает конструкцию типа
#pragma rambank 1
<переменные в bank1>
#pragma rambank 2
<переменные в bank2>
...
#pragma rambank // возвращает контроль за размещением переменных компилятору
)
doublekey
Цитата
С глобальными переменными у компиляторов под пики проблемы - они размещаются только в bank0.

xemul, не соглашусь с вами, в моём примере переменные как раз глобальные и размещаются в банках 1 и 2, кусок из работающего кода.
xemul
Цитата(doublekey @ Dec 21 2012, 19:02) *
xemul, не соглашусь с вами, в моём примере переменные как раз глобальные и размещаются в банках 1 и 2, кусок из работающего кода.

Ну да, написал не однозначно.
Без явного указания банка памяти встречавшиеся мне компиляторы С для пиков размещали глобальные и статические переменные только в bank0. Об этом и в их манах написано. Похоже, CC5X - не исключение.
Mikron
Спасибо за помощь, doublekey, xemul!

Цитата(xemul @ Dec 21 2012, 17:41) *
CODE(page) и RAM(bank) в пиках непосредственно никак не пересекаются. Под программу у Вас используется только 23% наличной памяти.
В программе действительно нужны (89-23)=(64+1) байтов под глобальные переменные? (+1 - это как раз тот байт, под который не хватает памяти в bank0 _этого_ контроллера)
С глобальными переменными у компиляторов под пики проблемы - они размещаются только в bank0.


В программе есть буфер на прием и буфер на передачу по usart, с ними работаю из прерываний, а программа разбирает этот массив в бесконечном цикле, к сожалению пакет данных длинный, поэтому столько места в памяти выделил под глобальные переменные, остальные глобальные переменные (16) - флаги состояния, но сейчас подумал что лучше сделаю через битовые поля их, тогда это будет всего два байта


Цитата(doublekey @ Dec 21 2012, 19:02) *
xemul, не соглашусь с вами, в моём примере переменные как раз глобальные и размещаются в банках 1 и 2, кусок из работающего кода.


а то что память данных разделена на банки, это связано с особенностями архитектуры процессора? какая для компилятора разница, bank1 это или bank2?
doublekey
Цитата
а то что память данных разделена на банки, это связано с особенностями архитектуры процессора? какая для компилятора разница, bank1 это или bank2?

Да, в связи с тем, что разрядность шины адреса маленькая, память разделена на банки и предусмотрен специальный регистр для выбора активного банка.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.