Jump to content

    
Sign in to follow this  
Skaf

Посимвольный прием строки неизвестной длинны

Recommended Posts

Необходимо осуществлять прием данных неизвестной длинны. Работаю на AVR в режиме жесткой экономии памяти. Поэтому не хотелось бы выделять буфер размером как максимально возможная длинна строки.

 

Сначала я сделал так

 

char * Buffer;

void add_char(u8_t c){

u8_t size = sizeof(Buffer);

realloc(Buffer, size+1);
Buffer[size] = c;

}

 

Но такой подход почему-то не работает. Какие еще есть варианты?

 

PS. AVR GCC

Share this post


Link to post
Share on other sites

Брр..

char * Buffer;

является указателем, а не массивом... Если вы хотите использовать указатель на массив, то проинициализируйте массив также:)

    int  array[16];
    int *ptr;
    ptr =  array;

 

P.S. Вообще код странный и неправильный.. Используйте буферы, так проще..

Edited by Savrik

Share this post


Link to post
Share on other sites
Но такой подход почему-то не работает. Какие еще есть варианты?

Ко всему предыдущему самое главное - абсолютное отсутствие представления о возможностях менеджера памяти :( - на строку памяти жалко, а отдать здоровый кусок менеджеру и затем через заднепроходное отверстия порциями (причем далеко не байтовыми) получать и при этом ввиду отсутствия дефрагментации иметь гарантированные проблемы - это типа "нормально"......

Share this post


Link to post
Share on other sites

Ну так потому я и здесь, чтобы научиться )) по-моему нормальный процесс

 

Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?

Share this post


Link to post
Share on other sites
Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?

Выделять буферы в процессе работы :laughing: ...

А.Робинс "Linux программирование в примерах"... Там есть один пример - чтение строки произвольной длинны... Linux-не Linux, но видно как это делают... Конечно придется работать с динамической памятью... Кстати, в самом Linux'е есть готовые системные вызовы - getline(); getdelim(); .

Share this post


Link to post
Share on other sites
Ну так потому я и здесь, чтобы научиться )) по-моему нормальный процесс

Тогда задавайте вопросы ОБДУМАННО.

Вобщем способа лучше, чем выделить буфер фиксированной длинны нет?

Не имею понятия какую задачу Вы собираетесь решать. Думайте сами. Может и менеджер памяти выдающий память для полного фрейма много правильнее для Вашего случая, но то, что побайтный realloc есть полное безумие, это точно.

Кстати в самом Linux'е есть готовые системные вызовы.

Кстати, об AVR - там нет и не будет ни линукса, на хотя-бы возможности создать сколь-нибудь функциональный менеджер памяти. Да и и столько ресурсов, что-бы выбросить их на монстральнейшие системные вызовы с линуксовом стиле и близко нет.

Share this post


Link to post
Share on other sites
Кстати, об AVR - там нет и не будет ни линукса, на хотя-бы возможности создать сколь-нибудь функциональный менеджер памяти. Да и и столько ресурсов, что-бы выбросить их на монстральнейшие системные вызовы с линуксовом стиле и близко нет.

:biggrin: Та я это знаю. Просто вдруг кто-то через поисковик найдет тему и ему будет нужно именно это... :laughing:

Share this post


Link to post
Share on other sites

Функциональность устойства проста. Подключается к Ethernet через ENC28J60, TCP/IP стек- uIP. Должно отвечать на пинги. Дрыгать ножками по команде с телнета, считывать состояние других ножек, принимать новую прошивку, самопрошиваться. Настраиваться по телнету. Телнет передает посимвольно данные. Поэтому и стоит задача приема данных посимвольно.

Share this post


Link to post
Share on other sites

Писать строку в дополнительный стек, растущий навстречу основному, вплоть до пересечения и краха системы :rolleyes:

Share this post


Link to post
Share on other sites

тогда зачем Вам городить непонятные конструкции? всякие данные к устройству есть команда, а команда есть конечное количество символов. Получили команду - обработали - очистили буфер. Определить максимально возможную длину команды будет несложно

Share this post


Link to post
Share on other sites
....

Ну а теперь попробуйте объяснить, прежде всего самому себе, с кем из помянутых выше задач Вы собрались динамически делить память??!!

 

P.S.

В вопросе о вытаскивании себя за волосы перепрошивки самого себя по TCP/IP Вы полагаю, плаваете еще больше.

P.P.S.

Выбор железа видимо делался исключительно исключительно с целью спонсировать сразу двух производителей восьмибитовиков и для упражнений в "режиме жесткой экономии памяти"?

Share this post


Link to post
Share on other sites

Выделите буфер на максимальную длину токена. А дальше - пусть Ваш девайс хоть Гамлета читает посимвольно. Это будет задача на другом уровне - кому и сколько локальных переменных требуется.

Share this post


Link to post
Share on other sites

>>В вопросе о вытаскивании себя за волосы перепрошивки самого себя по TCP/IP Вы полагаю, плаваете еще больше.

 

Это Вопрос не этого топика. Но uIP в место для бутлоадера ну никак не влезет. Предпологается прием прошивки, запись ее во внешнюю EEPROM, потом саморебут и старт бетлоадера, прошивающего МК прошивкой из внешнего EEPROM.

Share this post


Link to post
Share on other sites

Возьмите уже ARM наконец!

Ага, можно и с Ethernet PHY на борту и человеческим кол-вом памяти.

А потом посчитайте по деньгам и поймите наконец, что пошли неправильным путём изначально :)

 

Манипуляции Ваши с внешним EEPROM тоже достаточно "интересны" :)))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this