Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: выделение массива большого размера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
george carpenter
Есть схемка не большая которая с каждым тактом генерирует 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овый?
_Pasha
Код
char pmap[SIZE/8];
for(int i=0;i<SIZE;++i)
    {
        DelayMs(250);
        if(RA0)  pMap[i>>3] |= 1<<(i & 7);
        else pMap[i>>3] &= ~(1<<(i & 7));
    }

Хотя бы так. Хотя, тоже не шарман. maniac.gif <- Это на всякий случай sm.gif
А что, HI-TECH позволяет for в стиле гну99??? Не знал...
george carpenter
С charами работа sm.gif не пойдет sm.gif, мне потом нужно будет подсчитать там кое-что. В принципе, массив intовый пусть остается только как его выделить тогда?
george carpenter
Решил вот так, сразу писать в 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)
    {
    }
}


Единственное только, хочу удостоверится, что мой цикл правильно заносит значения, а как только?!?? Не выведу же я по очереди все на ножку микросхемы sm.gif
george carpenter
Воистину странные вещи, написал просто вот такие строки:
Код
void main(void)
{
    TRISA = 0xff;
    TRISB = 0x00;

    eeprom_write(0x0A,3);

    if (eeprom_read (0x0A) == 3)
    {
        RB0=0;
    }
    
    while(1)
    {
    }
}

Если бы неправильно работало то нолик бы на RB0 не выдавался, значит в память заносится, и всё работает. Однако идем в отладчик и смотрим EEPROM. И вот что видим blink.gif
Danis
Цитата(george carpenter @ Feb 19 2011, 18:04) *
Единственное только, хочу удостоверится, что мой цикл правильно заносит значения, а как только?!?? Не выведу же я по очереди все на ножку микросхемы sm.gif


С помощью CRC16 например
george carpenter
Если открыть тут ссылку, что я дал, тот в отладчике, вообще не видно чтобы что-то в EEPROM заносилось sm.gif
george carpenter
Отладил те две программки.
Вот эта
Код
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; не получается. Что не так?!
sergeeff
С ума сойти, для хранения бита - целый байт! А eeprom, он что бесконечно может переписываться? Или вы делаете устройство на пару месяцев?

Посмотрите, например, тут: http://michael.dipperstein.com/bitlibs/#bitarray ( bitarray-0.3.zip).
george carpenter
Да нет не на месяц, просто нужно было хранить большое количеством элементов массива, а не получалось выделить.

А ничего что программа под контроллер laughing.gif например у меня 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%)

А где остальное? И чего ему тогда не хватает для создания большого массива?
sergeeff
Цитата(george carpenter @ Feb 20 2011, 18:00) *
Да нет не на месяц, просто нужно было хранить большое количеством элементов массива, а не получалось выделить.

А ничего что программа под контроллер laughing.gif например у меня 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 вещь слегка в себе. Ну вы уж сами разберитесь, что к чему.
george carpenter
Ну не выход же тулить отдельно микросхему RAM sm.gif Потом замучаюсь писать программу чтобы оттуда доставать данные. А пишу я под PIC18F4620 Code:64K, Data:3968B, 1K EEPROM sm.gif

С другой стороны, вот я подружился как работать с отдельным битом, мне нужно 8192 бита, а могу выделить только максимум 250 элементов массива даже если в каждом буду все 8мь бит не катит sad.gif

Может как-то с указателями можно выкрутиться, не силен в них sm.gif
sergeeff
Цитата(george carpenter @ Feb 20 2011, 19:11) *
Ну не выход же тулить отдельно микросхему RAM sm.gif Потом замучаюсь писать программу чтобы оттуда доставать данные. А пишу я под PIC18F4620 Code:64K, Data:3968B, 1K EEPROM sm.gif

С другой стороны, вот я подружился как работать с отдельным битом, мне нужно 8192 бита, а могу выделить только максимум 250 элементов массива даже если в каждом буду все 8мь бит не катит sad.gif

Может как-то с указателями можно выкрутиться, не силен в них sm.gif


Вы лучше потратьте немного времени на то, чтобы понять кто и зачем у вас ест память. Сколько выделено по стек, есть ли heap под динамическую память и нужна ли она вам. Где все задается/определяется (скорее всего в startup файле, или настройках проекта). Научитесь всем этим управлять. Тогда будет точно понятно, чем же вы реально располагаете и как решать свою задачу.

Пока же вы методически не правильно действуете - методом тыка.
george carpenter
Ну просмотрел я настройки проекта там для стека и кучи указаны Specific size и всё. И че мне это даст? И кто вообще сказал что у меня память кто-то ест?
sergeeff
Цитата(george carpenter @ Feb 20 2011, 20:59) *
Ну просмотрел я настройки проекта там для стека и кучи указаны Specific size и всё. И че мне это даст? И кто вообще сказал что у меня память кто-то ест?


Значит надо понять, что это за Specific size. Он же где задается?

Под словом "ест", кроется тот факт, что кто-то (проект, startup со своими Specific size) чего-то резервирует для своих/пользовательских нужд. Стек вам нужен? Нужен. Там лежат локальные переменные. Вопрос в каком объеме нужен?

Куча (heap) для динамической памяти. Может нужна, может нет. От вас зависит - пользуете malloc/free или и без них чудесно живется. Под нее может быть тоже выделяется место. Все это (стек и куча) там же, где и вам нужно, в RAM. Судя по тому, что больше 512 байт вам массив не объявить, под стек и кучу выделено не мало. Или может вы еще какие массивы понаобъявляли?

Есть такой чудесный файл с расширением map. В нем вам линкер все честно расскажет про то, что, куда и сколько он положил/разместил. Почитайте его, он текстовой.
Aqualion
Цитата(george carpenter @ Feb 20 2011, 19:11) *
Ну не выход же тулить отдельно микросхему RAM sm.gif Потом замучаюсь писать программу чтобы оттуда доставать данные. А пишу я под PIC18F4620 Code:64K, Data:3968B, 1K EEPROM sm.gif

С другой стороны, вот я подружился как работать с отдельным битом, мне нужно 8192 бита, а могу выделить только максимум 250 элементов массива даже если в каждом буду все 8мь бит не катит sad.gif

Может как-то с указателями можно выкрутиться, не силен в них sm.gif


Как вариант задать массив в 1024 байт, а при приеме сначала записывать по 8 бит в временную 8-битную переменную и через каждые принятые 8 бит скидывать эту временную переменную в массив.
_Pasha
Цитата(george carpenter @ Feb 19 2011, 16:36) *
С charами работа sm.gif не пойдет sm.gif, мне потом нужно будет подсчитать там кое-что. В принципе, массив intовый пусть остается только как его выделить тогда?

Все-таки, проясните плз эту светлую мысль. А то муки творчества непонятны совершенно
sergeeff
Цитата(george carpenter @ Feb 20 2011, 20:59) *
Ну просмотрел я настройки проекта там для стека и кучи указаны Specific size и всё. И че мне это даст? И кто вообще сказал что у меня память кто-то ест?


Знаете, есть очень хороший метод - моделирование. У вас же перед глазами PC? Ну и напишите на нем свою программу, для начала. А потом, шаг за шагом, поймите, где чего сколько и за чем. Когда все будет работать и не будет бездумно жрать ресурсы, перенесете в свой embedded проект. Сэкономите кучу времени.
george carpenter
В принципе я решил всё проще, забыл оповестить sm.gif Поскольку как оказалось в этом контроллере банки памяти размером по 255 байт, то выделяю четко массив charов 1024 элемента, но в банке отличным от нулевого, то есть static bank2 char map[1024]; А потом с помощью написанных мною функций обращаюсь к каждому элементу массива и с помощью лог. операций работаю с битами, итого 1024*8=8192 бита в одном банке sm.gif

Кстати настройки MPLAB тут не причем!
sergeeff
Цитата(george carpenter @ Mar 5 2011, 00:54) *
В принципе я решил всё проще, забыл оповестить


Вы не обижайтесь, но в вашем самом первом сообщении в цикле стоит wait на 250 мс. Это означает, что процессор у вас ни хрена не делает, а только чего-то складирует про запас (с которым все проблемы). А что, если напрячь инженерную голову, нельзя по ходу чего-нибудь полезное делать, и складировать (а может и нет) уже это полезное? 250 мс - это просто до фига времени.
george carpenter
Вы тоже не обижайтесь sm.gif но уже догадался давно сделать обработку по прерыванию не ожидая 250мс.
sergeeff
Цитата(george carpenter @ Mar 5 2011, 10:47) *
Вы тоже не обижайтесь sm.gif но уже догадался давно сделать обработку по прерыванию не ожидая 250мс.


Дело не в ожидании 250 мс, что вы со своими данными делаете в промежутках между прерываниями? Похоже, ничего. А нельзя ли вашу обработку вести по мере поступления данных? Скорее всего, возможно. Надо только подумать и "в компьютер поиграть".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.