реклама на сайте
подробности

 
 
> #pragma bank pic16f887, проблема с памятью в мк
Mikron
сообщение Dec 21 2012, 09:08
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 1-03-10
Пользователь №: 55 731



Здравствуйте, есть проблема с программой, не хватает памяти.
Вот что пишет компилятор 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 я так понимаю?

Спасибо за помощь(
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
doublekey
сообщение Dec 21 2012, 13:29
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 28-01-08
Из: Zelenograd
Пользователь №: 34 503



Укажите для части перменных 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) это не связано.

Сообщение отредактировал doublekey - Dec 21 2012, 13:35
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 21 2012, 13:41
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(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 // возвращает контроль за размещением переменных компилятору
)
Go to the top of the page
 
+Quote Post
doublekey
сообщение Dec 21 2012, 15:02
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 28-01-08
Из: Zelenograd
Пользователь №: 34 503



Цитата
С глобальными переменными у компиляторов под пики проблемы - они размещаются только в bank0.

xemul, не соглашусь с вами, в моём примере переменные как раз глобальные и размещаются в банках 1 и 2, кусок из работающего кода.
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 21 2012, 17:34
Сообщение #5



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



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

Ну да, написал не однозначно.
Без явного указания банка памяти встречавшиеся мне компиляторы С для пиков размещали глобальные и статические переменные только в bank0. Об этом и в их манах написано. Похоже, CC5X - не исключение.
Go to the top of the page
 
+Quote Post
Mikron
сообщение Dec 21 2012, 23:19
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 82
Регистрация: 1-03-10
Пользователь №: 55 731



Спасибо за помощь, 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?

Сообщение отредактировал Mikron - Dec 21 2012, 23:20
Go to the top of the page
 
+Quote Post
doublekey
сообщение Dec 22 2012, 07:08
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 28-01-08
Из: Zelenograd
Пользователь №: 34 503



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

Да, в связи с тем, что разрядность шины адреса маленькая, память разделена на банки и предусмотрен специальный регистр для выбора активного банка.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016