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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> выделение массива большого размера
george carpenter
сообщение Feb 19 2011, 12:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 19 2011, 13:28
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Код
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??? Не знал...
Go to the top of the page
 
+Quote Post
george carpenter
сообщение Feb 19 2011, 13:36
Сообщение #3


Участник
*

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



С charами работа sm.gif не пойдет sm.gif, мне потом нужно будет подсчитать там кое-что. В принципе, массив intовый пусть остается только как его выделить тогда?
Go to the top of the page
 
+Quote Post
george carpenter
сообщение Feb 19 2011, 15:04
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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)
    {
    }
}


Единственное только, хочу удостоверится, что мой цикл правильно заносит значения, а как только?!?? Не выведу же я по очереди все на ножку микросхемы sm.gif

Сообщение отредактировал george carpenter - Feb 19 2011, 15:12
Go to the top of the page
 
+Quote Post
george carpenter
сообщение Feb 19 2011, 18:31
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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. И вот что видим blink.gif

Сообщение отредактировал george carpenter - Feb 19 2011, 18:32
Go to the top of the page
 
+Quote Post
Danis
сообщение Feb 19 2011, 19:17
Сообщение #6


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



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


С помощью CRC16 например


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
george carpenter
сообщение Feb 19 2011, 19:29
Сообщение #7


Участник
*

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



Если открыть тут ссылку, что я дал, тот в отладчике, вообще не видно чтобы что-то в EEPROM заносилось sm.gif
Go to the top of the page
 
+Quote Post
george carpenter
сообщение Feb 20 2011, 11:24
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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; не получается. Что не так?!
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 20 2011, 11:43
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



С ума сойти, для хранения бита - целый байт! А eeprom, он что бесконечно может переписываться? Или вы делаете устройство на пару месяцев?

Посмотрите, например, тут: http://michael.dipperstein.com/bitlibs/#bitarray ( bitarray-0.3.zip).
Go to the top of the page
 
+Quote Post
george carpenter
сообщение Feb 20 2011, 15:00
Сообщение #10


Участник
*

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



Да нет не на месяц, просто нужно было хранить большое количеством элементов массива, а не получалось выделить.

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

А где остальное? И чего ему тогда не хватает для создания большого массива?

Сообщение отредактировал george carpenter - Feb 20 2011, 13:39
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 20 2011, 15:10
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(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 вещь слегка в себе. Ну вы уж сами разберитесь, что к чему.
Go to the top of the page
 
+Quote Post
george carpenter
сообщение Feb 20 2011, 16:11
Сообщение #12


Участник
*

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



Ну не выход же тулить отдельно микросхему RAM sm.gif Потом замучаюсь писать программу чтобы оттуда доставать данные. А пишу я под PIC18F4620 Code:64K, Data:3968B, 1K EEPROM sm.gif

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

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

Сообщение отредактировал george carpenter - Feb 20 2011, 16:26
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 20 2011, 17:31
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(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 файле, или настройках проекта). Научитесь всем этим управлять. Тогда будет точно понятно, чем же вы реально располагаете и как решать свою задачу.

Пока же вы методически не правильно действуете - методом тыка.
Go to the top of the page
 
+Quote Post
george carpenter
сообщение Feb 20 2011, 17:59
Сообщение #14


Участник
*

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



Ну просмотрел я настройки проекта там для стека и кучи указаны Specific size и всё. И че мне это даст? И кто вообще сказал что у меня память кто-то ест?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 20 2011, 18:46
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 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. В нем вам линкер все честно расскажет про то, что, куда и сколько он положил/разместил. Почитайте его, он текстовой.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th June 2025 - 17:43
Рейтинг@Mail.ru


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