|
выделение массива большого размера |
|
|
|
Feb 19 2011, 12:51
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 23-12-10
Пользователь №: 61 831

|
Есть схемка не большая которая с каждым тактом генерирует 8192 раза нолик или единичку, эта схемка подключена к микроконтроллеру PIC18F4620, задача на МК запомнить эти 8192 бита(ну и потом передать по сети, эту задачу еще не решал). Вообщем пишу программку под МК и столкнулся с проблемой. Вот код: Код #include <htc.h> #include "delay.c" #define SIZE 8192
void main(void) { int pMap[SIZE]; //int *pMap = new int[SIZE]; такое в С++ у меня прокатывало TRISA = 0xff; TRISB = 0x00; for(int i=1;i<=SIZE;i++) { DelayMs(250); pMap[i]=RA0; } } У меня биты приходят на 0й пин порта А. Следовательно, я сделал массив размером 8192 и в цикле тупо его заполняю. Но проблема в том что когда компилирую получаю вот такое: Error [1253] C:\Program Files\HI-TECH Software\PICC-18\PRO\9.65\sources\ftneg.c; 20. could not find space (16394 bytes) for auto/param block Error [1253] C:\Program Files\HI-TECH Software\PICC-18\PRO\9.65\sources\ftneg.c; 20. could not find space (16394 bytes) for auto/param block Не хватает места для выделения такого объема, как быть? И еще вопрос, фактически каждый элемент массива нолик или единичка, можно ли как-то битовый массив создать а не intовый?
Сообщение отредактировал george carpenter - Feb 19 2011, 12:53
|
|
|
|
|
Feb 19 2011, 13:36
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 23-12-10
Пользователь №: 61 831

|
С charами работа  не пойдет  , мне потом нужно будет подсчитать там кое-что. В принципе, массив intовый пусть остается только как его выделить тогда?
|
|
|
|
|
Feb 19 2011, 15:04
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 23-12-10
Пользователь №: 61 831

|
Решил вот так, сразу писать в eeprom: Код #include <htc.h> #include "delay.c" #define SIZE 8192
void main(void) { int pMap[SIZE]; //bdata int pMap[SIZE]; TRISA = 0xff; TRISB = 0x00; for(int i=1;i<=SIZE;i++) { DelayMs(250); eeprom_write(i,RA0); } while(1) { } } Единственное только, хочу удостоверится, что мой цикл правильно заносит значения, а как только?!?? Не выведу же я по очереди все на ножку микросхемы
Сообщение отредактировал george carpenter - Feb 19 2011, 15:12
|
|
|
|
|
Feb 19 2011, 18:31
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 23-12-10
Пользователь №: 61 831

|
Воистину странные вещи, написал просто вот такие строки: Код void main(void) { TRISA = 0xff; TRISB = 0x00;
eeprom_write(0x0A,3);
if (eeprom_read (0x0A) == 3) { RB0=0; } while(1) { } } Если бы неправильно работало то нолик бы на RB0 не выдавался, значит в память заносится, и всё работает. Однако идем в отладчик и смотрим EEPROM. И вот что видим
Сообщение отредактировал george carpenter - Feb 19 2011, 18:32
|
|
|
|
|
Feb 20 2011, 11:24
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 23-12-10
Пользователь №: 61 831

|
Отладил те две программки. Вот эта Код void main(void) { TRISA = 0xff; TRISB = 0x00;
eeprom_write(0x0A,3);
if (eeprom_read (0x0A) == 3) { RB0=0; } while(1) { } } отрабатывает всё хорошо, в Watch заносится в EEDATA и в EEADR, то есть в память пишет я так понимаю, почему в окне ЕЕPROM ничего нет непонятно, может саму схему неправильно подключил. А вот этот кусок Код void main(void) { int pMap[SIZE]; //bdata int pMap[SIZE]; TRISA = 0xff; TRISB = 0x00; for(int i=1;i<=SIZE;i++) { DelayMs(250); eeprom_write(i,RA0); } while(1) { } } тупо не считывается с ножки RA0 значение, пробовал просто его в переменную считать int a = RA0; не получается. Что не так?!
|
|
|
|
|
Feb 20 2011, 15:00
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 23-12-10
Пользователь №: 61 831

|
Да нет не на месяц, просто нужно было хранить большое количеством элементов массива, а не получалось выделить. А ничего что программа под контроллер  например у меня bit_array_t *ba1, *ba2; не компилируется! С другой стороны пусть даже и по 1 байту на 1 бит, фиг с ним, но при комплияции пишет что задействовано Program space used 86h ( 134) of 10000h bytes ( 0.2%) Data space used FAh ( 250) of F80h bytes ( 6.3%) А где остальное? И чего ему тогда не хватает для создания большого массива?
Сообщение отредактировал george carpenter - Feb 20 2011, 13:39
|
|
|
|
|
Feb 20 2011, 15:10
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(george carpenter @ Feb 20 2011, 18:00)  Да нет не на месяц, просто нужно было хранить большое количеством элементов массива, а не получалось выделить. А ничего что программа под контроллер  например у меня bit_array_t *ba1, *ba2; не компилируется! С другой стороны пусть даже и по 1 байту на 1 бит, фиг с ним, но при комплияции пишет что задействовано Program space used 86h ( 134) of 10000h bytes ( 0.2%) Data space used FAh ( 250) of F80h bytes ( 6.3%) А где остальное? И чего ему тогда не хватает для создания большого массива? Судя потомо, что вы пишете у вас в распоряжении 64 кБ eeprom + 4 кБ ram. Соответственно никаким макаром выделить 8 кБ под массив в ram не удастся. Bitarray требует, соответственно, 1/8 от этой величины + еще чего то, т.е. 1 кБ - проблем нет. Что у вас там не компилируется - надо посмотреть. Компиляторы под PIC вещь слегка в себе. Ну вы уж сами разберитесь, что к чему.
|
|
|
|
|
Feb 20 2011, 16:11
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 23-12-10
Пользователь №: 61 831

|
Ну не выход же тулить отдельно микросхему RAM  Потом замучаюсь писать программу чтобы оттуда доставать данные. А пишу я под PIC18F4620 Code:64K, Data:3968B, 1K EEPROM  С другой стороны, вот я подружился как работать с отдельным битом, мне нужно 8192 бита, а могу выделить только максимум 250 элементов массива даже если в каждом буду все 8мь бит не катит  Может как-то с указателями можно выкрутиться, не силен в них
Сообщение отредактировал george carpenter - Feb 20 2011, 16:26
|
|
|
|
|
Feb 20 2011, 17:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(george carpenter @ Feb 20 2011, 19:11)  Ну не выход же тулить отдельно микросхему RAM  Потом замучаюсь писать программу чтобы оттуда доставать данные. А пишу я под PIC18F4620 Code:64K, Data:3968B, 1K EEPROM  С другой стороны, вот я подружился как работать с отдельным битом, мне нужно 8192 бита, а могу выделить только максимум 250 элементов массива даже если в каждом буду все 8мь бит не катит  Может как-то с указателями можно выкрутиться, не силен в них  Вы лучше потратьте немного времени на то, чтобы понять кто и зачем у вас ест память. Сколько выделено по стек, есть ли heap под динамическую память и нужна ли она вам. Где все задается/определяется (скорее всего в startup файле, или настройках проекта). Научитесь всем этим управлять. Тогда будет точно понятно, чем же вы реально располагаете и как решать свою задачу. Пока же вы методически не правильно действуете - методом тыка.
|
|
|
|
|
Feb 20 2011, 17:59
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 23-12-10
Пользователь №: 61 831

|
Ну просмотрел я настройки проекта там для стека и кучи указаны Specific size и всё. И че мне это даст? И кто вообще сказал что у меня память кто-то ест?
|
|
|
|
|
Feb 20 2011, 18:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(george carpenter @ Feb 20 2011, 20:59)  Ну просмотрел я настройки проекта там для стека и кучи указаны Specific size и всё. И че мне это даст? И кто вообще сказал что у меня память кто-то ест? Значит надо понять, что это за Specific size. Он же где задается? Под словом "ест", кроется тот факт, что кто-то (проект, startup со своими Specific size) чего-то резервирует для своих/пользовательских нужд. Стек вам нужен? Нужен. Там лежат локальные переменные. Вопрос в каком объеме нужен? Куча (heap) для динамической памяти. Может нужна, может нет. От вас зависит - пользуете malloc/free или и без них чудесно живется. Под нее может быть тоже выделяется место. Все это (стек и куча) там же, где и вам нужно, в RAM. Судя по тому, что больше 512 байт вам массив не объявить, под стек и кучу выделено не мало. Или может вы еще какие массивы понаобъявляли? Есть такой чудесный файл с расширением map. В нем вам линкер все честно расскажет про то, что, куда и сколько он положил/разместил. Почитайте его, он текстовой.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|