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

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

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

 

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


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

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

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

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

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


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

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

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
}

 

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


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

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

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

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

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

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

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

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

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

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