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

 
 
 
Reply to this topicStart new topic
> MPLAB и HI-TECH 9.60
tarasik
сообщение Apr 9 2008, 16:23
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 9-04-08
Пользователь №: 36 618



Как программист я не очень сильный, как электронщик еще ничего... Посему не судите строго за может быть и дурацкий вопрос. Суть проблемы в следующем: Писал программу на С используя MPLAB v8 в cвязке с HI-TECH v9.60 для микроконтроллера PIC16F876A. Схема хорошо работает и я постепенно добавляю в нее новые сервисные возможности. И теперь компилятор выдает окно, что использовал я Program DATA на 99% в BANK 0 и при введении новых переменных естественно выдает ошибку. Господа, а как же другие банки? Ведь они вообще пустые, судя по отчету компилятора. Вот я и хотел бы знать как заставить HI-TECH размещать переменные в других банках, например в BANK1 ? Еще раз извините за каламбур.
Go to the top of the page
 
+Quote Post
dac
сообщение Apr 9 2008, 16:42
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482



Цитата(tarasik @ Apr 9 2008, 20:23) *
Program DATA на 99% в BANK 0


1. вообще-то не совсем понятно - Program DATA - это память программ, а не RAM. Уже программа не лезет? все таки приведите полностью что выдает компилятор, что бы не было недопонимания.
2. если все таки не хватает озу, то возможны следующие причины:

2.1 версия 9.60 глючит (используйте 9.50пл3. у меня был случай когда программа нормальнл компилирующаяся в 9.50 отказалась компилироваться в 9.60 с сообщением о нехватке памяти).
2.2 по умолчанию, если не указвать квалификатор "near" или "bank0" компилятор распологает переменные во всех свободных банках, кроме банка 0. в банк 0 ложатся переменные только c вышеуказанными квалификаторами.
пример
Код
static near unsigned int a; // переменная в банке 0
static unsigned int b; // переменная в банке 1 или любом другом выше, если банк 1 полностью занят
Go to the top of the page
 
+Quote Post
tarasik
сообщение Apr 10 2008, 01:31
Сообщение #3





Группа: Новичок
Сообщений: 8
Регистрация: 9-04-08
Пользователь №: 36 618



Я извиняюсь, не Program data a Space Data смотрим прилогающийся рисунок,
Прикрепленное изображение
как видно из последнего использовано 99% данных BANK 0 При попытке добавить ещеодну переменную типа int (я уже не говорю про long), получаем следующий рисунок
Прикрепленное изображение
Вот я и спрашиваю как заставить компилятор размещать мои переменные в других банках? За ранее спасибо.
Go to the top of the page
 
+Quote Post
dac
сообщение Apr 10 2008, 02:15
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482



Цитата(tarasik @ Apr 10 2008, 05:31) *
Вот я и спрашиваю как заставить компилятор размещать мои переменные в других банках? За ранее спасибо.

См выше п 2.2
если нужно положить в какой-то конкретный банк попробуй так:
static bank1 int b;
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Apr 10 2008, 06:09
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



Цитата(dac @ Apr 10 2008, 05:15) *
См выше п 2.2

На самом деле все с точностью до наоборот. По умолчанию - bank0, остальные банки нужно объявлять явно.
Go to the top of the page
 
+Quote Post
dac
сообщение Apr 10 2008, 07:22
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482



Цитата(Alex B._ @ Apr 10 2008, 10:09) *
На самом деле все с точностью до наоборот. По умолчанию - bank0, остальные банки нужно объявлять явно.

странно, хотя может в 16 наоборот, давно уже не пользовал. для 18 точно как я написал
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 10 2008, 07:58
Сообщение #7



*****

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



Из manual.pdf от picc 9.60 PL2 STD
Цитата
3.4.9.2 Bank1, Bank2 and Bank3 Type Qualifiers
The bank1, bank2 and bank3 type qualifiers are used to place static variables in RAM bank 1,
RAM bank2 and RAM bank 3 respectively. Note that there is no bank0 qualifier. Objects default to
being in bank0 if no other bank qualifier is used. All auto objects are positioned into bank0, along
with function parameters.

Из manual.pdf от picc 9.60 PL0 PRO
Цитата
3.3.10.3 Bank1, Bank2 and Bank3 Type Qualifiers
The bank1, bank2 and bank3 type qualifiers are always recognised by HI-TECH C PRO for
the PIC10/12/16 MCU Family so that code may be easily ported from other compilers, however by
default, these qualifiers have no effect. If the --FORCEBANK option is used, the bank1, bank2
and bank3 qualifiers become a recommendation to place static variables in RAM bank 1, RAM
bank2 and RAM bank 3, respectively.

Для picc18 аналогично. (но он тоже не знает про квалификатор bank0:))
Могу предположить, что tarasik пользуется STD версией компилятора, которая требует рукопашного разведения переменных по банкам.
2tarasik: обратите внимание на "All auto objects are positioned into bank0, along with function parameters.", и, соответственно, не вводите лишних локальных переменных и аргументов функций.
Go to the top of the page
 
+Quote Post
Abckur
сообщение Apr 10 2008, 09:18
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 57
Регистрация: 14-03-08
Пользователь №: 35 904



Цитата(xemul @ Apr 10 2008, 11:58) *
tarasik, не вводите лишних локальных переменных и аргументов функций.


т.е. пишите как рекомендуется новичкам - просто глобальные переменный.
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 10 2008, 09:50
Сообщение #9



*****

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



Цитата(Abckur @ Apr 10 2008, 13:18) *
т.е. пишите как рекомендуется новичкам - просто глобальные переменный.

Вы упрощаете. Просто иногда случается, что программеры пытаются стиль
Код
boo(a, b, c)
{
   ...
   foo(a, b, c);
   ...
}
, навязанный им при программировании окошек с кнопками, перенести 1:1 на контроллеры.
Go to the top of the page
 
+Quote Post
dac
сообщение Apr 10 2008, 10:34
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482



одного не пойму, уж 5 лет как ПИКами 18 занимаюсь (ипсользуется RAM до 90%), не было вопросов с банками под С. вот когда в память быстрого доступа не лезут (near) это да, но вот остальное...

да и с 16ми в свое время тоже вопросов не возникало. в крайнем случае просто необходимо было указать bank1 bank2 и т.д. и то, если память не изменяет, скорее для оптимизации, чтоб нужные одновременно переменные в одном банке лежали

может все таки поставить 9.50пл3 и не мучиться человеку?
Go to the top of the page
 
+Quote Post
blackbit
сообщение Apr 10 2008, 11:46
Сообщение #11


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

Группа: Новичок
Сообщений: 100
Регистрация: 5-03-07
Пользователь №: 25 892



Цитата(xemul @ Apr 10 2008, 11:58) *
2tarasik: обратите внимание на "All auto objects are positioned into bank0, along with function parameters.", и, соответственно, не вводите лишних локальных переменных и аргументов функций.

Лучше наоборот. При использовании указанного компилятора (STD) лучше свои переменные вручную размещать по банкам с квалификаторами, отдав 0-й банк на откуп компилятору под его системные дела. Потому что "лишнии локальные переменные и аргументы функций" имеют класс auto и будут размещаться на стеке, уничтожаясь при выходе из функции. Стек же компилер, в свою очередь, сможет сделать поболе в 0-м банке. Получаем недурственную экономию ОЗУ за счет повторного использования памяти стека на всякие промежуточные дела.
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 10 2008, 12:32
Сообщение #12



*****

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



Цитата(blackbit @ Apr 10 2008, 15:46) *
Лучше наоборот. При использовании указанного компилятора (STD) лучше свои переменные вручную размещать по банкам с квалификаторами, отдав 0-й банк на откуп компилятору под его системные дела. Потому что "лишнии локальные переменные и аргументы функций" имеют класс auto и будут размещаться на стеке, уничтожаясь при выходе из функции. Стек же компилер, в свою очередь, сможет сделать поболе в 0-м банке. Получаем недурственную экономию ОЗУ за счет повторного использования памяти стека на всякие промежуточные дела.

smile.gif Вот вырос у мелких пиков стек данных, и полезла из него сплошная экономия... Или picc строит софтовый стек и кучу на нем?
Go to the top of the page
 
+Quote Post
blackbit
сообщение Apr 10 2008, 13:51
Сообщение #13


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

Группа: Новичок
Сообщений: 100
Регистрация: 5-03-07
Пользователь №: 25 892



Цитата(xemul @ Apr 10 2008, 16:32) *
smile.gif Вот вырос у мелких пиков стек данных, и полезла из него сплошная экономия... Или picc строит софтовый стек и кучу на нем?

Аппаратный стек пика определяет возможную глубину вложения, а софтовый стек picc строит, для размещения в нем передаваемых аргументов и локальных переменных функций. При вложении функций софтовый стек тоже растет само собой. Вот под это память и нужно ему отдать в 0-м банке. Или вы под каждую temp'овую мелочь внутри функции глобальную переменную заводите? А я предпочитаю пользовать одну и ту же область стековой памяти для всех функций.

И при чем здесь куча?
Go to the top of the page
 
+Quote Post
tarasik
сообщение Apr 10 2008, 21:55
Сообщение #14





Группа: Новичок
Сообщений: 8
Регистрация: 9-04-08
Пользователь №: 36 618



Цитата(xemul @ Apr 10 2008, 10:58) *
Могу предположить, что tarasik пользуется STD версией компилятора, которая требует рукопашного разведения переменных по банкам.

Да, Вы правы я пользуюсь именно этой версией, что ж будем вручную разводить. За помощь всем простое человеческое СПАСИБО!
Go to the top of the page
 
+Quote Post
xemul
сообщение Apr 10 2008, 23:30
Сообщение #15



*****

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



Цитата(blackbit @ Apr 10 2008, 17:51) *
Аппаратный стек пика определяет возможную глубину вложения, а софтовый стек picc строит, для размещения в нем передаваемых аргументов и локальных переменных функций. При вложении функций софтовый стек тоже растет само собой. Вот под это память и нужно ему отдать в 0-м банке.

На досуге пробегитесь по листингу и мапу - пары минут хватит, чтобы понять, что picc не строит софтовый стек (на всякий случай: под стеком обычно понимают одностороннюю очередь с организацией LIFO). Автопеременные размещаются линкером жестко без каких-либо возможностей для телодвижений и при наличии возможности попадают на те же адреса, что и btemp? (но это уже проделки оптимизатора). Закос под стек у picc состоит только в распределении памяти под автопеременные и btemp?, начиная со старших адресов bank0.
Цитата
Или вы ...

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

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

 


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


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