Jump to content

    

проблема с очередями

Recommended Posts

addi II

Здравствуйте!
Не могу разобраться с очередями.
Есть проект в нем 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 */
  }
}

 

Share this post


Link to post
Share on other sites

MrBearManul
1 час назад, addi II сказал:

т.е в дебаге останавливается на вайле этой функции

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

Share this post


Link to post
Share on other sites

juvf

почему напрочь отсутствуют проверки? экономия памяти?

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
}

 

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.