|
|
  |
MPLAB и HI-TECH 9.60 |
|
|
|
Apr 9 2008, 16:23
|
Группа: Новичок
Сообщений: 8
Регистрация: 9-04-08
Пользователь №: 36 618

|
Как программист я не очень сильный, как электронщик еще ничего... Посему не судите строго за может быть и дурацкий вопрос. Суть проблемы в следующем: Писал программу на С используя MPLAB v8 в cвязке с HI-TECH v9.60 для микроконтроллера PIC16F876A. Схема хорошо работает и я постепенно добавляю в нее новые сервисные возможности. И теперь компилятор выдает окно, что использовал я Program DATA на 99% в BANK 0 и при введении новых переменных естественно выдает ошибку. Господа, а как же другие банки? Ведь они вообще пустые, судя по отчету компилятора. Вот я и хотел бы знать как заставить HI-TECH размещать переменные в других банках, например в BANK1 ? Еще раз извините за каламбур.
|
|
|
|
|
Apr 9 2008, 16:42
|
Знающий
   
Группа: Свой
Сообщений: 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 полностью занят
|
|
|
|
|
Apr 10 2008, 01:31
|
Группа: Новичок
Сообщений: 8
Регистрация: 9-04-08
Пользователь №: 36 618

|
Я извиняюсь, не Program data a Space Data смотрим прилогающийся рисунок,
как видно из последнего использовано 99% данных BANK 0 При попытке добавить ещеодну переменную типа int (я уже не говорю про long), получаем следующий рисунок
Вот я и спрашиваю как заставить компилятор размещать мои переменные в других банках? За ранее спасибо.
|
|
|
|
|
Apr 10 2008, 02:15
|
Знающий
   
Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482

|
Цитата(tarasik @ Apr 10 2008, 05:31)  Вот я и спрашиваю как заставить компилятор размещать мои переменные в других банках? За ранее спасибо. См выше п 2.2 если нужно положить в какой-то конкретный банк попробуй так: static bank1 int b;
|
|
|
|
|
Apr 10 2008, 07:58
|
    
Группа: Свой
Сообщений: 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 версией компилятора, которая требует рукопашного разведения переменных по банкам. 2 tarasik: обратите внимание на "All auto objects are positioned into bank0, along with function parameters.", и, соответственно, не вводите лишних локальных переменных и аргументов функций.
|
|
|
|
|
Apr 10 2008, 09:18
|
Участник

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

|
Цитата(xemul @ Apr 10 2008, 11:58)  tarasik, не вводите лишних локальных переменных и аргументов функций. т.е. пишите как рекомендуется новичкам - просто глобальные переменный.
|
|
|
|
|
Apr 10 2008, 09:50
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Abckur @ Apr 10 2008, 13:18)  т.е. пишите как рекомендуется новичкам - просто глобальные переменный. Вы упрощаете. Просто иногда случается, что программеры пытаются стиль Код boo(a, b, c) { ... foo(a, b, c); ... } , навязанный им при программировании окошек с кнопками, перенести 1:1 на контроллеры.
|
|
|
|
|
Apr 10 2008, 11:46
|
Частый гость
 
Группа: Новичок
Сообщений: 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-м банке. Получаем недурственную экономию ОЗУ за счет повторного использования памяти стека на всякие промежуточные дела.
|
|
|
|
|
Apr 10 2008, 13:51
|
Частый гость
 
Группа: Новичок
Сообщений: 100
Регистрация: 5-03-07
Пользователь №: 25 892

|
Цитата(xemul @ Apr 10 2008, 16:32)   Вот вырос у мелких пиков стек данных, и полезла из него сплошная экономия... Или picc строит софтовый стек и кучу на нем? Аппаратный стек пика определяет возможную глубину вложения, а софтовый стек picc строит, для размещения в нем передаваемых аргументов и локальных переменных функций. При вложении функций софтовый стек тоже растет само собой. Вот под это память и нужно ему отдать в 0-м банке. Или вы под каждую temp'овую мелочь внутри функции глобальную переменную заводите? А я предпочитаю пользовать одну и ту же область стековой памяти для всех функций. И при чем здесь куча?
|
|
|
|
|
Apr 10 2008, 21:55
|
Группа: Новичок
Сообщений: 8
Регистрация: 9-04-08
Пользователь №: 36 618

|
Цитата(xemul @ Apr 10 2008, 10:58)  Могу предположить, что tarasik пользуется STD версией компилятора, которая требует рукопашного разведения переменных по банкам. Да, Вы правы я пользуюсь именно этой версией, что ж будем вручную разводить. За помощь всем простое человеческое СПАСИБО!
|
|
|
|
|
Apr 10 2008, 23:30
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(blackbit @ Apr 10 2008, 17:51)  Аппаратный стек пика определяет возможную глубину вложения, а софтовый стек picc строит, для размещения в нем передаваемых аргументов и локальных переменных функций. При вложении функций софтовый стек тоже растет само собой. Вот под это память и нужно ему отдать в 0-м банке. На досуге пробегитесь по листингу и мапу - пары минут хватит, чтобы понять, что picc не строит софтовый стек (на всякий случай: под стеком обычно понимают одностороннюю очередь с организацией LIFO). Автопеременные размещаются линкером жестко без каких-либо возможностей для телодвижений и при наличии возможности попадают на те же адреса, что и btemp? (но это уже проделки оптимизатора). Закос под стек у picc состоит только в распределении памяти под автопеременные и btemp?, начиная со старших адресов bank0. Цитата Или вы ... Уф-ф... Давайте лучше порадуемся за автора треда, что ему пригодилась информацию, которой мы смогли с ним поделиться.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|