Перейти к содержанию

Данные массива(указателя) передаваемые в функцию остаются в ОЗУ


DarkDigger

Рекомендуемые сообщения

Здравствуйте, есть функция, принимающая указатель (отправка данных в сеть,через w5500):

void w5500_send_array(unsigned int addr, unsigned char bsb,  char *data, unsigned char count){
	unsigned char cont_phase=0;   //фаза контроля
	SPI_PORT&=~(1<<SPI_SS);       //вкл w5500
	SPDR = msb_of_int(addr);
    while(!(SPSR&(1<<SPIF)));
    SPDR=lsb_of_int(addr);
    while(!(SPSR&(1<<SPIF)));
    cont_phase=(bsb<<3)|(1<<2);
    SPDR=cont_phase;
    while(!(SPSR&(1<<SPIF)));
    for (unsigned char i=0; i<count; i++){
        SPDR=data[i];
        while(!(SPSR&(1<<SPIF)));
    }

    SPI_PORT|=(1<<SPI_SS);
}

вызывает её вот эта фунцция:

void w5500_tx(unsigned char socket, char *text, unsigned char count){
	unsigned int addr=0;
	unsigned char sock_bsb=0;
	sock_bsb=socket*4+1;
	addr=(w5500_get(0x24,sock_bsb)<<8)|w5500_get(0x25,sock_bsb); //читаем Sn_TX_WR
	w5500_send_array(addr,(socket*4+2),text,count);
	w5500_send(0x24,sock_bsb, msb_of_int(addr+count));
	w5500_send(0x25,sock_bsb, lsb_of_int(addr+count));
	w5500_send(0x01,sock_bsb, SEND);
}

В тексте программы, отправку данных осуществляю с помощью вызова функции:

w5500_tx(0,"Blablabla\n\r",11); //пример

Массив "Blablabla\n\r" отправляется сначала в функцию w5500_tx затем в w5500_send_array. Где под конец и должен умереть. Но нет, он остаётся в ОЗУ...

Я понимаю, что делаю что-то не так. Если много текста необходимо отправить в сеть, ОЗУ просто не хватает. Как по завершению передачи данных освободить память?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

9 минут назад, DarkDigger сказал:

он остаётся в ОЗУ

Как это было выяснено?

 

9 минут назад, DarkDigger сказал:

Если много текста необходимо отправить в сеть, ОЗУ просто не хватает

Много - это сколько? Ваша функция в принципе не умеет отправлять больше 255 байт. А у самого W5500 ограничение 1024 байт на одну посылку.

 

w5500_send(0x24,sock_bsb, msb_of_int(addr+count));
w5500_send(0x25,sock_bsb, lsb_of_int(addr+count));

Нафига такой изврат делать? Там же автоинкрементен адреса. Да и msb_of_int(addr+count) заменяется (addr+count)>>8. Аналогично для lsb.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

1 час назад, DarkDigger сказал:

w5500_tx(0,"Blablabla\n\r",11); //пример

Здесь неявно создается массив с непонятной областью видимости. Вероятно компилятор располагает его в глобальной области. 

Прндлагаю жаннвй массив  создавать явно его обрабатывать.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

3 часа назад, BARS_ сказал:

Как это было выяснено?

Выхлопом компилятора. И глюками, когда компилятор говорил что память почти всё...

2 часа назад, dasZebra сказал:

 PS. Это банальная ситуация с утечкой памяти.

Можно ли как-то освободить эту память?

Ссылка на комментарий
Поделиться на другие сайты

Создай массив, засунь в него данные, передай массив в функцию, после отработки функции уничтожь массив. Либо положи массив во флеш, а не в ОЗУ. Можно его вообще глобальным сделать и использовать чисто для передачи данных в визнет.

Ссылка на комментарий
Поделиться на другие сайты

Если кому интересно:

необходимо подключить библиотеку

#include <avr/pgmspace.h>

создавать глобальные переменные вида:

const char str_1[] PROGMEM="Password: ";

копировать строку в озу

strcpy_P(buf, str_2);

и работать уже с buf....

 

Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, DarkDigger сказал:

Если кому интересно:

Никому не интересно т.к. эта инфа древний как мамонт

Занесенный массив в память процу не зачем очищать . Просто на его место в будущем запишется другая информация

Если вы только не нам..и с компилятором

Все остальное ваши влажные фантазии

Одна из причин когда память не будет освобождаться - это возможно дальнейшее использование данного массива по программе - но это как бы ваша ошибка а не "злостного компилятора и мозга МК ":D

Изменено пользователем hasl
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, BARS_ сказал:

О чем я и говорил, засунуть массив во флеш...

Никогда не сталкивался с подобным, не знал как это сделать. За направление спасибо.

1 час назад, hasl сказал:

Просто на его место в будущем запишется другая информация

Нет, не запишется. Проверенно на отладке.

 

1 час назад, hasl сказал:

Все остальное ваши влажные фантазии

С Вами всё в порядке?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...