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

LwIP это потенциально опасное ПО или нет?

struct netconn *newconn;

тут мы фактически выделили память под структуру типа netconn

Нет, ничего не выделили. Создали локальный указатель на структуру данного типа.

Поделиться сообщением


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

Поясню как это все работает :

struct netconn *newconn;

тут мы фактически выделили память под структуру типа netconn (ее описание см. тут же в этой теме), а далее тут передаем:

sys_arch_mbox_fetch(&conn->acceptmbox, (void **) &newconn, 0);

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

struct netconn *newconn; - это не выделение памяти под структуру, это объявление указателя на структуру.

Вот для того, чтобы понять разницу между объектом и указателем на него, Вам и стоит открыть учебник.

Никаких копирований содержимого структуры там не может происходить. sys_arch_mbox_fetch просто сохраняет в newconn указатель на некий экземпляр структуры struct netconn (либо сохраняет там NULL). Где этот экземпляр находится, из этого кода неясно. Он может находиться как в динамической памяти так и в статической и даже в автоматической (на стеке). Это узнать можно только смотря код sys_arch_mbox_fetch.

Поделиться сообщением


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

...Где этот экземпляр находится, из этого кода неясно. Он может находиться как в динамической памяти так и в статической и даже в автоматической (на стеке). Это узнать можно только смотря код sys_arch_mbox_fetch.

u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)
{
    void *dummyptr;
    portTickType StartTime, EndTime, Elapsed;

    StartTime = xTaskGetTickCount();

    if (msg == NULL)
    {
        msg = &dummyptr;
    }

    if (timeout != 0)
    {
        if ( pdTRUE == xQueueReceive(*mbox, &(*msg), timeout / portTICK_RATE_MS))
        {
            EndTime = xTaskGetTickCount();
            Elapsed = (EndTime - StartTime) * portTICK_RATE_MS;

            return (Elapsed);
        }
        else // timed out blocking for message
        {
            *msg = NULL;

            return SYS_ARCH_TIMEOUT;
        }
    }
    else // block forever for a message.
    {
        while ( pdTRUE != xQueueReceive(*mbox, &(*msg), portMAX_DELAY))
        {
        } // time is arbitrary
        EndTime = xTaskGetTickCount();
        Elapsed = (EndTime - StartTime) * portTICK_RATE_MS;

        return (Elapsed); // return time blocked TODO test
    }
}

Тут параметр - timeout передается равным нулю напоминаю. Вообще все это по-хорошему если, то переписать/переделать нужно. А Вы вообще этот NetConn используете? Или кто из зала тут использует? Если посмотреть, то получается что тут по приходу коннекта снаружи, мы получаем из очереди сообщений ОС (xQueueReceive) всю структуру - копированием по указателю в выделенный для этого буфер (т.е по указателю newconn находится выделенный буфер). То что мне нужно учебники читать и в школу идти - это понятно, только не надо это в каждом посту писать. Расслабьтесь. Я вот терплю своих реально спиногрызов же сейчас и пытаюсь их уложить спать (сейчас время). :1111493779: Посмотрите свысока на ученика более спокойно.

 

...

Никаких копирований содержимого структуры там не может происходить. sys_arch_mbox_fetch просто сохраняет в newconn указатель на некий экземпляр структуры struct netconn (либо сохраняет там NULL)...

Еще раз коротко поясню (по-моему мнению конечно): там, дальше используется функция ОС (FreeRTOS тут ясень пень) получения элемента из очереди сообщений - функция xQueueReceive. С одновременным удалением этого элемента из очереди. В эту функцию мы должны в 1-ом параметре передать дескриптор очереди, во 2-м параметре передается указатель на область памяти куда будет скопирован элемент, а в третьем параметре передается время ожидания появления этого элемента в очереди (время блокирования задачи) - если этот параметр равен portMAX_DELAY, то ждем бесконечно долго. Я сейчас должен пойти на базар чтобы купить смеситель/гибкий шланг взамен неисправных и меня наверно час 2-3 не будет - поэтому тут еще раз пояснил и дополнил сейчас на всякий случай. Спасибо.

Поделиться сообщением


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

этот NetConn используете? Или кто из зала тут использует? Если посмотреть, то получается что тут по приходу коннекта снаружи, мы получаем из очереди сообщений ОС (xQueueReceive) всю структуру - копированием по указателю в выделенный для этого буфер (т.е по указателю newconn находится выделенный буфер). То что мне нужно учебники читать и в школу идти - это понятно, только не надо

Опять 25..... :twak:

Ещё раз: из кода ясно видно, что xQueueReceive() записывает в *msg указатель (дважды выделить!!!) на некую структуру в памяти, но не саму структуру. Никаких копирований структур она не делает и в принципе делать не может, так как даже не знает размера объекта, на который указывает возвращаемый ею указатель (она возвращает указатель типа void *). xQueueReceive() без разницы тип и размер данных, на которые она указывает, для мэйлбоксов это и не нужно. Возвращается просто указатель! Указатель - это просто переменная размера sizeof(int) (обычно), это просто одно число.

Т.е. - после возврата из sys_arch_mbox_fetch(), в вызывающей функции, переменная newconn будет равна полученному из xQueueReceive() указателю (если конечно xQueueReceive() вернула true).

Поделиться сообщением


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

Опять 25..... :twak:

...

Указатель так указатель. Что веткой драться то. И еще толстой такой веткой. Нет чтобы потоньше веточка, а то дубинка какая-то. И в самом деле - это ведь просто переменная указателя на какую-то без разницы даже какую память. Что я так зациклился на том что и память куда он показывает обязательно должна быть уже тут сразу заполнена и показывать на готовую структуру на выходе. На выходе то она готовая может быть (или сам указатель равен NULL), но не на этом шаге она заполняется. А заполняется она в другом месте программы. Меня просто с толку сбил механизм работы этой очереди и все прицепился, что при получении элемента из очереди будет происходить копирование в выделенный буфер содержимого. Копирование просто указателя на то место в памяти где они (структуры) появляются. И даже думал почему так непродуктивно работает это? Туда-сюда данные копируются с одного места в другое. Надо бы посмотреть как там все это происходит. В какой части памяти все это пишется. И какая память и т.п. А Вы вообще NetConn API используете? Что-нибудь хорошего плохого можете о нем сказать? Я кстати купил для ванной запчасти. Еще и дома успели поспорить по поводу одежды и пр. А у Вас как дела вообще?

 

... для мэйлбоксов это и не нужно....

Еще вот позанудствую насчет слова мэйлбокс - это же в дословном переводе как "очередь сообщений" переводится? Так ведь? Так же проще понимать. Или все-таки это не "очередь сообщений" в данном случае, а что-то необычное тут?

Поделиться сообщением


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

Опять я ошибся и перепутал - не "очередь сообщений", а "буфер сообщений" (про него изначально думал) Так переводится это словосочетание тут вроде. Так же легче понимать.

Поделиться сообщением


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

Поясню как это все работает :

struct netconn *newconn;

тут мы фактически выделили память под структуру типа netconn (ее описание см. тут же в этой теме), а далее тут передаем:

sys_arch_mbox_fetch(&conn->acceptmbox, (void **) &newconn, 0);

мы ждем прихода элемент в очередь сообщений и как оно там появится, то его содержимое будет скопировано в выделенный буфер под него т.е. по указателю newconn будет скопирована вся такая структура (ее описание см. тут в этой теме). А функция sys_arch_mbox_fetch эта обертка под получение этого элемента очереди в ОС. А насчет ядра и серии - да я очень грубо ошибся и не пойму как такое слово мог написать. Ядро конечно это. Еще какие ошибки у меня тут есть?? Мне значит тогда совсем закопаться и в школу пойти так да? Вот я сижу-пишу как дурак эти строчки, чего-то доказываю, а двое спиногрызов (дети) реально в этот момент меня задалбливают. :cranky: Один со своими машинками лезет, а другая чем-то недовольна и кричит громко в ответ.

 

Чукча не читатель, чукча писатель?

 

Извините, но очевидно, все что вам писали выше прошло мимо и вы продолжаете писать полную ерунду. Какой lwip, о чем вы? Берите учебник "с для чайников" и начинайте с самых азов, hello world итд

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...