“undefined reference to “task_xxx“ ———FreeRTOS xTaskhHandle

我使用STM32CUBEIDE的FreeRTOS ,但是没有使用它生成代码的CMSIS 的API ,我使用的是xTaskhandle , 当我对所有任务做好定义编译之后,问题就出现了
在这里插入图片描在这里插入图片描述述

 出现这个问题就是,你的任务在前面做了声明,但是没有对任务进行定义,这提示你需要在后面做定义。
* USER CODE BEGIN 0 */
///*********** QUEUE HANDLER***********/
xQueueHandle St_Queue_Handler;
//
///*********** Task HANDLER***********/
xTaskHandle Sender1_Task_Handler;
xTaskHandle Sender2_Task_Handler;
xTaskHandle Receive_Task_Handler;
//
///********** Task FUNTION ************/
void Sender1_Task(void  *argment);
void Sender2_Task(void  *argment);
void Receive_Task(void  *argment);
//
typedef struct
{
	char *str;
	int counter;
	uint16_t large_value;
}my_struct;

int dex1;
int dex2;
/* USER CODE END 0 */
/* USER CODE BEGIN 4 */
void Sender1_Task(void  *argment)
{
	my_struct *ptrostruct;

	uint32_t TickDelay = pdMS_TO_TICKS(2000);  // millisecond class
	while(1)
	{
		 char *str = "Entered SENDER1_Task \n";
		 HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
     /********** ALOOCATE MEMORY TO THE PTR ***********/
		 ptrostruct = pvPortMalloc(sizeof(my_struct));
		 /********** LODA THE DATA ****************/
		 ptrostruct->counter = 1+dex1;
		 ptrostruct->large_value = 1000*dex1;
		 ptrostruct->str = "HELLO FROM SENDER 1\n";

		 /********* send  to the queue ***********/
		 if(xQueueSend(St_Queue_Handler,&ptrostruct,portMAX_DELAY) == pdPASS)
		 {
			 char *str2 = "Successfully sent the to the Queue \n\r";
			 HAL_UART_Transmit(&huart2, (uint8_t *)str2, strlen(str2), HAL_MAX_DELAY);
		 }
		 dex1 = dex1+1;
		 vTaskDelay(TickDelay);
	}
}

void Sender2_Task(void  *argment)
{
	my_struct *ptrostruct;

	uint32_t TickDelay = pdMS_TO_TICKS(2000);  // millisecond class
	while(1)
	{
		 char *str = "Entered SENDER2_Task \n";
		 HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
     /********** ALOOCATE MEMORY TO THE PTR ***********/
		 ptrostruct = pvPortMalloc(sizeof(my_struct));
		 /********** LODA THE DATA ****************/
		 ptrostruct->counter = 1+dex2;
		 ptrostruct->large_value = 2000+200*dex2;
		 ptrostruct->str = "HELLO FROM SENDER 2\n";

		 /********* send  to the queue ***********/
		 if(xQueueSend(St_Queue_Handler,&ptrostruct,portMAX_DELAY) == pdPASS)
		 {
			 char *str2 = "Successfully sent the to the Queue \n\r";
			 HAL_UART_Transmit(&huart2, (uint8_t *)str2, strlen(str2), HAL_MAX_DELAY);
		 }
		 dex2 = dex2+1;
		 vTaskDelay(TickDelay);
	}
}


void Receive_Task(void *argment)
{
	my_struct *Rptrostruct;
	uint32_t TickDelay = pdMS_TO_TICKS(3000);
	char *ptr;
	while(1)
	{
		 char *str = "Entered Receive_Task \n";
		 HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
		 /********* Receive  to the queue ***********/
		 if(xQueueReceive(St_Queue_Handler, &Rptrostruct, portMAX_DELAY) == pdPASS)
		 {
       ptr = pvPortMalloc(100*sizeof(char));
       sprintf(ptr,"Rceive from QUUE:  Rptrostruct = %d\n  Rptrostruct = %d\n  Rptrostruct = %s",Rptrostruct->counter,Rptrostruct->large_value,Rptrostruct->str);
       HAL_UART_Transmit(&huart2, (uint8_t *)ptr, strlen(ptr), HAL_MAX_DELAY);

       vPortFree(ptr);   //free the string memory
		 }
		 vPortFree(Rptrostruct);  //free the structure memory
		 vTaskDelay(TickDelay);
	}
}
/* USER CODE END 4 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MicroPython-ESP32 中,使用 `task_create()` 函数可以创建一个新的任务。该函数的原型如下: ```c TaskHandle_t task_create(void (*task)(void *arg), const char *name, uint16_t stack_size, void *params, uint8_t priority, TaskHandle_t *handle); ``` 参数说明: - `task`:指向任务函数的指针,该任务函数的参数是一个指向 void 的指针,返回值是 void。 - `name`:任务的名称,可以是一个字符串。 - `stack_size`:任务的堆栈大小,以字节为单位。 - `params`:传递给任务函数的参数,可以是一个指向 void 的指针。 - `priority`:任务的优先级,取值范围是 0 到 configMAX_PRIORITIES-1,其中 configMAX_PRIORITIES 是 FreeRTOS 配置中指定的最大优先级数。 - `handle`:指向任务句柄的指针,用于接收任务句柄。 任务创建成功后,会返回一个任务句柄,可以使用该句柄来操作该任务。 下面是一个示例代码,演示了如何创建一个简单的任务: ```python import _thread def task_func(arg): print(arg) _thread.start_new_thread(task_func, ("Hello, world!",)) ``` 在这个示例中,我们使用 `_thread.start_new_thread()` 函数来创建一个新的任务。该函数接受两个参数:任务函数和参数。任务函数需要是一个可调用的对象,参数可以是任意类型的对象。在这个例子中,我们创建了一个名为 `task_func` 的函数,并向它传递了一个字符串参数 "Hello, world!"。函数内部简单地打印了该参数。 由于 Python 的 GIL 限制,MicroPython-ESP32 中的线程是伪线程(pseudo-thread),实际上是通过 FreeRTOS 实现的任务。因此,使用 `_thread.start_new_thread()` 函数来创建任务,实际上就是调用了 FreeRTOS 的 `task_create()` 函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值