Цитата(jcxz @ Apr 10 2016, 13:32)

...Где этот экземпляр находится, из этого кода неясно. Он может находиться как в динамической памяти так и в статической и даже в автоматической (на стеке). Это узнать можно только смотря код 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 находится выделенный буфер). То что мне нужно учебники читать и в школу идти - это понятно, только не надо это в каждом посту писать. Расслабьтесь. Я вот терплю своих реально спиногрызов же сейчас и пытаюсь их уложить спать (сейчас время).

Посмотрите свысока на ученика более спокойно.
Цитата(jcxz @ Apr 10 2016, 13:32)

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