addi II 1 30 апреля, 2021 Опубликовано 30 апреля, 2021 · Жалоба Здравствуйте! Не могу разобраться с очередями. Есть проект в нем freertos и вместо тасков - очереди Я пытаюсь добавить еще одну очередь но возникает ошибка(зависаю в xQueueReceive) Тогда я пытаюсь в уже существующей очереди сделать добавление и ... void startUartTx(void *argument) { UART_HandleTypeDef* uart = uartM3g; osMessageQueueId_t qu = quMsgM3gHandle; struct netbuf *buffer; err_t err; /* Infinite loop */ for(;;) { MessageNode msgNode; xQueueReceive(qu, &msgNode, portMAX_DELAY); vPortEnterCritical(); HAL_UART_Transmit(uart, (uint8_t*)msgNode.message, msgNode.size, 1000); //xQueueSend(qu, &msgNode, portMAX_DELAY); buffer = netbuf_new(); //netbuf_alloc(buffer,sizeof(msgNode)); netbuf_alloc(buffer,5); //netbuf_ref(buf2, data, len); buffer->p->payload = msgNode.message; buffer->p->len = 5;//msgNode.size; err = netconn_write(conn, buffer->p->payload, buffer->p->len, NETCONN_COPY);// NETCONN_DONTBLOCK); netbuf_delete(buffer); msg_free(&msgNode); vPortExitCritical(); osDelay(1); // vTaskResume(TCPTxHandle); } } вылетает на buffer->p->len = 5;//msgNode.size; т.е в дебаге останавливается на вайле этой функции void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ struct { uint32_t r0; uint32_t r1; uint32_t r2; uint32_t r3; uint32_t r12; uint32_t lr; uint32_t pc; uint32_t psr; } *stack_ptr; // Указатель на текущее значение стека(SP) asm( "TST lr, #4 \n" // Тестируем 3ий бит указателя стека(побитовое и) "ITE EQ \n" // Значение указателя стека имеет бит 3? "MRSEQ %[ptr], MSP \n" // Да, сохраняем основной указатель стека "MRSNE %[ptr], PSP \n" // Нет, сохраняем указатель стека процесса : [ptr] "=r" (stack_ptr) ); /* USER CODE END HardFault_IRQn 0 */ while (1) { /* USER CODE BEGIN W1_HardFault_IRQn 0 */ /* USER CODE END W1_HardFault_IRQn 0 */ } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 30 апреля, 2021 Опубликовано 30 апреля, 2021 · Жалоба 1 час назад, addi II сказал: т.е в дебаге останавливается на вайле этой функции Добавьте вывод значений регистров, чтобы расшифровать HardFault. Но, скорее всего, у вас работа с неправильным указателем, переполнение стэка и что-то подобное. Мой опыт говорит о проблемах с памятью, как первопричиной. Но более полный ответ дать можно только получив вывод регистров, и находясь в дизассемблере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 30 апреля, 2021 Опубликовано 30 апреля, 2021 · Жалоба Может netbuf_new() вернула что-то фекальное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 5 мая, 2021 Опубликовано 5 мая, 2021 · Жалоба почему напрочь отсутствуют проверки? экономия памяти? buffer = netbuf_new(); //netbuf_alloc(buffer,sizeof(msgNode)); if(buffer != 0) { void *p = netbuf_alloc(buffer,5); //netbuf_ref(buf2, data, len); if(p != 0) { buffer->p->payload = msgNode.message; buffer->p->len = 5;//msgNode.size; } else { //NULL if no memory could be allocated } } else { //NULL on lack of memory } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться