Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обращение к верхнему 1кб ОЗУ pic18f2550. Как?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Roman_V
Привет! Забил 1 кб ОЗУ, теперь Hitech PICC ругается что нету ОЗУ. Но у ПИКа есть еще 1 кб. Как к нему обратиться из C? USB модуль отключен, в даташите сказано что это ОЗУ мне доступно. На асме не пробовал, но через регистр выбора банка вроде все понятно. А как быть с С? Ведь там просто описываешь массив и все. Си сам заботится о выборе банков. Спасибо за помощь!
dac
а чем "верхнее" озу отличается от обычного?
хотя вообще зависит от длины массива и т.д. т.е. область памяти должна быть непрерывно, для обычных переменных - если пытаешься запихать в быстрый доступ - квалификатор near, но ее не много. в общем напиши что именно говорит компилятор
Roman_V
глобально описаны
char buf1[140],buf2[85];
char m_buffer[512];
ну и конечно остальные переменные. Компилятор выдает:

Error[000] : Can't find 0x32 words for psect param in segment RAM
Error[000] : Can't find 0xC words (0xC withtotal) for psect bss in segment RAM

Если делаю размер m_buffer меньшим, то все прокатывает. Просто создаю в HT-PICC18 проект пустой. #include <pic18.h>
#include <pic18f4550.h>

unsigned char i[1024];

void main(void)
{
int y;
for(y=0;y<1023;y++)
i[y]=9;
}

Так все работает. 1 кб памяти использую. Но если я сделаю размер i 1025, то ошибка:
Error[000] : Can't find 0x401 words for psect bigbss in segment BIGRAM

В связи с этим вопрос. как мне долезть до другого 1 кб? Именно на Си. В асме это делается регистром BSR, а тут то как то Си рулит без регистров.
Alex B._
Цитата(Roman_V @ Apr 1 2008, 08:46) *
В связи с этим вопрос. как мне долезть до другого 1 кб?

разбить исходник на модули
Roman_V
никогда не подключал. Сейчас попробовал и не получилось. тоже самое пишет... Можно примерчик?
dac
для пик18ф4523

объявлены два массива по 700 байт, + мелочь
Data space:
RAM used 7h ( 7) of 600h bytes ( 0.5%)
BIGRAM used 5A2h ( 1442) of 600h bytes ( 93.9%)
COMRAM used 42h ( 66) of 80h bytes ( 51.6%)
NVRAM used 0h ( 0) of 100h bytes ( 0.0%)

делаю чуть больше, не комплит с той же ошибкой. ситуация похожа, осюда выводы:
судя по отчету область памяти под массивы BIGRAM полностью заполнена, но осталось еще столько же в области RAM.
либо надо увеличить область BIGRAM либо положить массив в RAM. дальше вопросы мануалу. я с этим не сталкивался

сорри, ошибся, у меня всего 1,5кБ памяти, поэтому все работает smile.gif
возможно проблема с компилятором. у меня 9,50пл3. в старых (и новых которые 9.60про) на эту тему были ошибки
Roman_V
Ну у меня все еще 8.35PL3 стоит. Искал сейчас и нигде не найду откуда скачать 9.50. Поможете? И еще можно пример кода описания массива и обращения к нему. Может что не так делаю?
Например так могу?
char a[1023];
char b[512];

void main(void)
{
a[1023]=10;
b[510]=2;
}
dac
Цитата(Roman_V @ Apr 3 2008, 19:03) *
Ну у меня все еще 8.35PL3 стоит. Искал сейчас и нигде не найду откуда скачать 9.50. Поможете?

в нем как раз этот глюк присутствует, натыкался в свое время
скачать можно здесь если есть доступ в свои
либо гугль. в принципе могу почтой отправить

Цитата(Roman_V @ Apr 3 2008, 19:03) *
И еще можно пример кода описания массива и обращения к нему. Может что не так делаю?
Например так могу?
char a[1023];
char b[512];

void main(void)
{
a[1023]=10;
b[510]=2;
}

в общем то неправильно, последний элемент массива будет а[1022] так как нумерация с нуля начинается, а так вы залазите в левую область памяти и какую переменную при этом испортите в реальном проекте большой вопрос. но компилятору пофиг, он это съест.
Roman_V
что то я замучался с этой фигней. прочитал об моей проблеме. рекомендуют разбивать прогу на модули. вот разбил. посмотрите плиз правильно или нет. Но все равно та же ошибка. MPlab 7.20. В проекте 2 файла: "temp5.c" и "p1.c". компилю- Can't find 0x6BC words for psect bigbss in segment BIGRAM
Мне надо иметь два массива по 512 байт, 140 байт и 85 байт. Остальное это переменные всякие, но объемом не больше памяти. По поводу версии компилятора разные слухи. кто-то говорит что 9.50 хуже и старые проги будут не компиляться, кто-то наоборот. фиг знает. Мне бы отлаженый пример программки на основе моего примера с описанием ныжных мне массивов. Было бы здорово!
P.S. уже правда для текущего проекта обошелся меньшей памятью, т.к. оптимизировал, но для будущего надо с FAT работать, а там бы иметь 2 массива по 512 байт неплохо. Спасибо!
Ilya_A
Цитата(Roman_V @ Apr 4 2008, 14:22) *
что то я замучался с этой фигней. прочитал об моей проблеме. рекомендуют разбивать прогу на модули. вот разбил. посмотрите плиз правильно или нет. Но все равно та же ошибка. MPlab 7.20. В проекте 2 файла: "temp5.c" и "p1.c". компилю- Can't find 0x6BC words for psect bigbss in segment BIGRAM
Мне надо иметь два массива по 512 байт, 140 байт и 85 байт. Остальное это переменные всякие, но объемом не больше памяти. По поводу версии компилятора разные слухи. кто-то говорит что 9.50 хуже и старые проги будут не компиляться, кто-то наоборот. фиг знает. Мне бы отлаженый пример программки на основе моего примера с описанием ныжных мне массивов. Было бы здорово!
P.S. уже правда для текущего проекта обошелся меньшей памятью, т.к. оптимизировал, но для будущего надо с FAT работать, а там бы иметь 2 массива по 512 байт неплохо. Спасибо!


Нужно сделать так:

Бъем прогу на 3 модуля:

temp5.c :
Код
#include <pic18.h>
//#include <pic18f4550.h>  <<--- это совсем ненужно

void MyProc(void);

unsigned char i[700];
extern char m1[512],m2[512]; //прописываем внешние массивы

void main(void){
  int y;
  for(y=0;y<700;y++)
  i[y]=9;
  MyProc();
}

void MyProc(void){
  int i;
  for(i=0;i<512;i++){
    m1[i]=2;
    m2[i]=3;
  }
  return;
}


И еще 2 файла:

file1.c :
Код
char m1[512];
void func1(void){} // Необходимо объявить хотябы одну фиктивную функию


file2.c :
Код
char m2[512];
void func2(void){} // Необходимо объявить хотябы одну фиктивную функию


Так должно работать! wink.gif


Вот прочитайте:

http://www.htsoft.com/support/faq.html#faq97
Галстук
Цитата(Илья @ Apr 4 2008, 11:45) *

Спасибо за ссылку. Действительно, надо хоть иногда читать документацию.

Вот там еще пишут:

Non-near variables that are not placed into the bss or data psects
are placed in the bigbss and bigdata psects.

Значит ли это, что если объявить переменную far, то можно уже не заботиться о длинах массивов и разбиении на модули, потому что линкер будет ее совать в какой-то bigbss (или bigdata)?
Ilya_A
Цитата(Галстук @ Apr 4 2008, 16:01) *
Значит ли это, что если объявить переменную far, то можно уже не заботиться о длинах массивов и разбиении на модули, потому что линкер будет ее совать в какой-то bigbss (или bigdata)?


Проверять надо...

Кстати сейчас специально открыл проект, в котором, в свое время сталкивался с такой проблемой, вернул все объявления в один файл. и компилятор не сругался!!! 07.gif Все откомпилировалось нормально....

P.S. пробывал на PICC18 9.50 PL3
Roman_V
Спасибо за подробности! Но я попробовал и не работает:
Error[000] : Can't find 0x6BC words for psect bigbss in segment BIGRAM
BUILD FAILED: Fri Apr 04 13:56:02 2008

Файлы сделал как вы мне дали. Включил их в проект MPLab как Source Files.
Может и правда от версии HT-PICC зависит. у меня 8.35 PL3
Ilya_A
Цитата(Roman_V @ Apr 4 2008, 17:55) *
Спасибо за подробности! Но я попробовал и не работает:
Error[000] : Can't find 0x6BC words for psect bigbss in segment BIGRAM
BUILD FAILED: Fri Apr 04 13:56:02 2008

Файлы сделал как вы мне дали. Включил их в проект MPLab как Source Files.
Может и правда от версии HT-PICC зависит. у меня 8.35 PL3


странно, всегда лечил таким образом - работало без проблем.
Roman_V
там блин пароль стоит. не пускает...
Ilya_A
Цитата(Roman_V @ Apr 4 2008, 18:23) *
там блин пароль стоит. не пускает...

Пароль в первом сообщении:

http://electronix.ru/forum/index.php?showtopic=17862


Ссылку удаляю, кто не успел - тот опоздал, извиняйте
Roman_V
Классный пароль! спасибо!
Ilya_A
Цитата(Roman_V @ Apr 4 2008, 18:30) *
Классный пароль! спасибо!


Конспирация, так сказать wink.gif Только нигде не выкладывайте этот файл, особенно без пароля smile.gif
Roman_V
Поставил, попробовал. Тоже самое:
Error[491] : can't find 0x6BC words for psect "bigbss" in segment "BIGRAM"
BUILD FAILED: Fri Apr 04 14:43:25 2008

еще стала вылазить такая фигня
Advisory[1207] : some of the command line options you are using are now obsolete
Advisory[1208] : use --help option or refer to the user manual for option details

Я убил из проекта file1.c и file2.c и сделал просто:
unsigned char i[700];
extern char m1[512],m2[512];

void main(void){
int y;
for(y=0;y<700;y++)
i[y]=9;
}

и это скомпилялось, но в отчете я не увидел использования ОЗУ больше чем 700 байт.
Data space:
RAM used 0h ( 0) of 400h bytes ( 0.0%)
BIGRAM used 2BCh ( 700) of 400h bytes ( 68.4%)
COMRAM used 0h ( 0) of 60h bytes ( 0.0%)
NVRAM used 0h ( 0) of 100h bytes ( 0.0%)
External data memory:
None available

А Если убрать Extern, то не компиляется и ругается так же на
Сan't find 0xABC words for psect "bigbss" in segment "BIGRAM"
Ilya_A
Цитата(Roman_V @ Apr 4 2008, 18:47) *
еще стала вылазить такая фигня
Advisory[1207] : some of the command line options you are using are now obsolete
Advisory[1208] : use --help option or refer to the user manual for option details


На это можете не обращать внимание. В принципе это вообще отключаеться в настройках компилятора


Сейчас создам проет и сам попробую
dac
еще раз повоторюсь - ставьте 9,50пл3 в 8,35 был этот глюк

и имхо если проект в одном файле лучше все переменные включая массивы определять как static
Roman_V
вот проект MPlab что я сделал. Может подключаю файлы не туда, не так. Уж прмо чувствую очень тупым себя. У вас работает, а я туплю.
dac
файл picc-18.ini

Код
[18F2550]
MAKE=MICROCHIP
ARCH=PIC18
PROCID=2550
ROMSIZE=8000
RAMSIZE=400
COMMON=00-5F
ICD2ROM=7DC0-7FFF
ICD2RAM=3F4-3FF
PERIPH=USBRAM@400-7FF
PERIPH=BOOTROM@0-7FF
EEPROMSIZE=100
FLASH_EW=40,20
ERRATA=FASTINTS
INSTR=EXTENDED

прописан RAMSIZE=400 (т.е. 1024 байта)
может надо попробовать прописать 800, но чем черевато не знаю
Roman_V
прописал - скомпилялось. НО! дело в том что компилер в сводной таблице имеет:
Data space:
RAM used 0h ( 0) of 800h bytes ( 0.0%)
BIGRAM used 800h ( 2048) of 800h bytes (100.0%)
COMRAM used 0h ( 0) of 60h bytes ( 0.0%)
NVRAM used 0h ( 0) of 100h bytes ( 0.0%)

Что есть RAM и BIGRAM? это сейчас там после исправления стоит 800, а было 400h. Но вдруг RAM+BIGRAM=2048? Щас много нашел по проблеме, все говорят разбей на модули, но ничего конкретного. У кого-то даже работает char a[1536]. Странно. Что-то не то делаем.
dac
и еще в даташите в главе по организации памяти написано, что банки с 4 по 7 т.е выше 1к используется под буфер usb и когда он задействован нельзя там распологать переменные. наверное поэтому доступ к нему закрыт

Цитата(Roman_V @ Apr 4 2008, 15:15) *
Что есть RAM и BIGRAM? это сейчас там после исправления стоит 800, а было 400h. Но вдруг RAM+BIGRAM=2048? Щас много нашел по проблеме, все говорят разбей на модули, но ничего конкретного. У кого-то даже работает char a[1536]. Странно. Что-то не то делаем.


не с чем то другим связано, я тоже сначала так подумал, возможно RAM это внешняя память? или еще что-то. в мануале сходу не нашел
Roman_V
В даташите сказано что пользоваться этим ОЗУ можно даже если и USB включен, но только не гарантируют сохранность данных этого ОЗУ. Я отключал USBEN=0, пофигу. Да и компиляться должно полюбому, потому что это аппаратная вещь. То бишь потом с этим ОЗУ могут быть проблемы, но компилятор все равно считает эту область ОЗУ. Вот ищу и ничего конкретного не нашел...
Ilya_A
Цитата(dac @ Apr 4 2008, 19:21) *
и еще в даташите в главе по организации памяти написано, что банки с 4 по 7 т.е выше 1к используется под буфер usb и когда он задействован нельзя там распологать переменные. наверное поэтому доступ к нему закрыт

Да проблема в этом. На других процах компилируется нормально
Roman_V
пробовал PIC18F4520 - тоже самое
Error[491] : can't find 0x6BC words for psect "bigbss" in segment "BIGRAM"
BUILD FAILED: Fri Apr 04 15:44:32 2008


сравнил в файле picc-18.ini мой ПИК с другими и выясняется что RAMSIZE соответствует размеру ОЗУ ПИКа. А в 2550 оно стоит 1 кб. Получается что вы правильно заметили что проблема в этом. Делаю выводы: Если в даташите сказано что я могу использовать это ОЗУ даже при включенном USB (тут ответственность за данные на мне), то я могу смело увеличить константу RAMSIZE=800 в ini файле и все будет правильно. Все равно как то криво. Не уж то разработчики запретили использовать эту область ОЗУ из-за того что пользователь может не выключив USB работать с этой ОЗУ? Не верю! Значит просто глюк? тоже как то видами писано... Попробую все равно...
Галстук
Цитата(Roman_V @ Apr 4 2008, 16:22) *
сравнил в файле picc-18.ini мой ПИК с другими и выясняется что RAMSIZE соответствует размеру ОЗУ ПИКа. А в 2550 оно стоит 1 кб. Получается что вы правильно заметили что проблема в этом.

Не уж то разработчики запретили использовать эту область ОЗУ из-за того что пользователь может не выключив USB работать с этой ОЗУ? Не верю! Значит просто глюк? тоже как то видами писано... Попробую все равно...

Это они видно так осторожничали, не знали, что с USB делать и просто запретили работать загрузчику.

В 9.50 уже хватились, что еще есть 1К и для того же пика добавили в ini строчку про USB.

PERIPH=USBRAM@400-7FF

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