Подскажите пожалуйста как на atmega8a можно изменить размер переменной.
например для временно хранения uart данных. они могут быть как 20 байт так и 2 кб.
roboforum.ruТехнический форум по робототехнике. |
|
|
var
data: array of array of byte;
...
begin
setlength(data,2);
setlength(data[0],4);
setlength(data[1],10);
setlength(data[2],7);
....
setlength(data,0); // очищаем
// и т.д.
=DeaD= писал(а):Заведите массив и работайте с указателями в нём
у меня в голове такая идея и крутиться, одно но, надо за ранее занять все место под это дело при условии что я не знаю сколько оно будет занимать. в CodeVisionAVR есть либка с функциями malloc, free, realoc, но как с ними работать вообще понять не могу, много теории на http://avr-libc.narod.ru/malloc.htmlAngel71 писал(а):небольшой объём внутренней памяти при необходимости скрашивается возможностью подключения внешней.
хз, что за зверь такой этот codeavr, есть ли там всякие malloc, free, realoc и прочие. нужна 1 переменная для хранения размерности массива и собственно сам одномерный массив максимальной длины для хранения данных. максимальной - это или необходимый максимум для хранения этих данных, если заранее известно или максимум, что есть в меге с учётом стека и минимизации всяких финтов с рекурсией и прочим. изначально размерность 0. создаём первый элемент, переменной +1. нужно допцустим 5 байт, вот в первую ячейку заносите 5, следующие 5 ячеек собственно данные (можно и инициализировать нулями при желании). теперь допустим нужно создать размеров в 10 байт. создаём второй элемент, опять добавляя +1 к переменной. в 7ю ячейку заносите 10, сл. 10 ячеек будут данные.
n = 2
m содержит такую последовательность байт (на всякий, в скобках адрес) [0]5 [1]0[2]0[3]0[4]0[5]0 [6]10[7]0[8]0[9]0[10]0[11]0[12]0[13]0[14]0[15]0[16]0
надо вам с чем-то произвести какие-то операции, пробежались по массиву и получили два адреса (адреса в памяти или индексы массива), затем работаете с этими данными по указателям или индексам массива. если вы создаёте размерности только один раз в самом начале это одно. но если во время работы захотите уменьшить или увеличить размер любого из елементов, придётся дописать ещё пару простенький ф-ий. переменную с инфой о размере массива можете не делать, эту инфу можно хранить в первой ячейке. как вам удобней.
вариант дубовый, но рабочий. без понимания какая у вас задача в общем и без знания с какими объёмами данных будете работать другое сами придумывайте. и +1, контроллер это не настольный комп, даже если докинуть внешней памяти. как минимум это трата тактов на работу с ней.
eeprom unsigned char i;
unsigned char tmp;
...
void main(void){
...
tmp =30;
while(1){
i= tmp;
}
...
#include <stdlib.h>
void * operator new(size_t size);
void operator delete(void * ptr);
#pragma once
#include "../devSettings.h"
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
#define MAX_CIRCULAR_BUFFER 0x20 //максимальный кольцевой буфер для протокола
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Реализация кольцевого буфера *
* //------------------------------------------------------------------------------------*
*///
class
AFIFO
{
public:
AFIFO();
bool push_back(const BYTE data);//Запихнем данные в конец очереди
BYTE pop_front();//Вытащим данные из начала очереди
void clear();//очистить очередь
int count()const; //количество элементов в буфере
private:
BYTE m_buffer[MAX_CIRCULAR_BUFFER];
int m_indexBegin;//указатель на начало очереди
int m_indexEnd;//указатель на конец очереди
int m_count;//количество элементов
};
#include "devFIFO.h"
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Constructor *
* //------------------------------------------------------------------------------------*
*///
AFIFO :: AFIFO()
:
m_indexBegin(0),
m_indexEnd(0),
m_count(0)
{
}
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // очистить очередь *
* //------------------------------------------------------------------------------------*
*///
void AFIFO :: clear()
{
m_indexBegin = 0;
m_indexEnd = 0;
m_count = 0;
}
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Запихнем данные в конец очереди *
* //------------------------------------------------------------------------------------*
*///
bool AFIFO :: push_back(const BYTE data)
{
if (m_count < MAX_CIRCULAR_BUFFER)
{
m_buffer[m_indexEnd] = data;
m_indexEnd++;
m_count++;
if (m_indexEnd == MAX_CIRCULAR_BUFFER)
{
m_indexEnd = 0;
}
return true;
}
return false;
}
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Вытащим данные из начала очереди *
* //------------------------------------------------------------------------------------*
*///
BYTE AFIFO :: pop_front()
{
if (m_count > 0)
{
BYTE data = m_buffer[m_indexBegin];
m_buffer[m_indexBegin] = 0;
m_indexBegin++;
m_count--;
if (m_indexBegin == MAX_CIRCULAR_BUFFER)
{
//вышли за пределы буфера
m_indexBegin = 0;
}
return data;
}
//ошибка, нет данных для чтения
return 0;
}
//---------------------------------------------------------------------------------------
/* //===================================================================================*
* // *
* // Количество элементов в буфере *
* //------------------------------------------------------------------------------------*
*///
int AFIFO :: count() const
{
return m_count;
}
//---------------------------------------------------------------------------------------
main()
{
AFIFO bufRead;
/* заносим данные в обработчке прерывания на приход новых данных
*/
bufRead.push_back(34);
bufRead.push_back(12);
bufRead.push_back(0xFF);
////
/* в галвном цикле/потоке вытаскиваем неспешно пришедшие данные
*/
int data = bufRead.pop_front();
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13