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

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


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. Где под конец и должен умереть. Но нет, он остаётся в ОЗУ...

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

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

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.

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

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

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

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

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

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

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

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

#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 пользователей онлайн

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