【FreeRTOS 任务】任务创建及运行

普通任务创建及运行,参阅安富莱电子demo

/*
*********************************************************************************************************
*	函 数 名: vTaskTaskUserIF
*	功能说明: 接口消息处理,这里用作LED闪烁	
*	形    参: pvParameters 是在创建该任务时传递的形参
*	返 回 值: 无
*   优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
*********************************************************************************************************
*/
static void vTaskTaskUserIF(void *pvParameters)
{
    
    
    while(1)
    {
    
    
		vTaskDelay(100);
	}
}


int main(void)
{
    
    
	/* 
	  在启动调度前,为了防止初始化STM32外设时有中断服务程序执行,这里禁止全局中断(除了NMI和HardFault)。
	  这样做的好处是:
	  1. 防止执行的中断服务程序中有FreeRTOS的API函数。
	  2. 保证系统正常启动,不受别的中断影响。
	  3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。
	  在移植文件port.c中的函数prvStartFirstTask中会重新开启全局中断。通过指令cpsie i开启,__set_PRIMASK(1)
	  和cpsie i是等效的。
     */
	__set_PRIMASK(1);  
	
	/* 任务创建 */
   xTaskCreate( vTaskTaskUserIF,   		 /* 任务函数  */
	            "vTaskUserIF",     		 /* 任务名    */
	            512,               		 /* 任务栈大小,单位word,也就是4字节 */
	            NULL,              		 /* 任务参数  */
	            1,                 		 /* 任务优先级*/
	            &xHandleTaskUserIF ); 	 /* 任务句柄  */
	            
    /* 启动调度,开始执行任务 */
    vTaskStartScheduler();
	/* 
	  如果系统正常启动是不会运行到这里的,运行到这里极有可能是用于定时器任务或者空闲任务的
	  heap空间不足造成创建失败,此要加大FreeRTOSConfig.h文件中定义的heap大小:
	  #define configTOTAL_HEAP_SIZE	      ( ( size_t ) ( 17 * 1024 ) )
	*/
	while(1);
}

STM32CubeMX 下任务创建及运行

/* Private variables ---------------------------------------------------------*/
//任务句柄
osThreadId defaultTaskHandle;
/* USER CODE BEGIN PV */


/* USER CODE BEGIN 4 */
void Task01(void const * argument)
{
    
    
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    
    
	HAL_UART_Transmit(&huart1,"Task01\r\n",strlen("Task01\r\n"),1000);
    osDelay(500);
  }
  /* USER CODE END 5 */
}
/* USER CODE END 4 */

int main(void)
{
    
    
  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */

  /* 参数说明:任务名字(可以根据情况自己定义),任务函数体,优先级,实例,任务堆长度 */
  /* STM32CubeMX 生成的代码默认优先级7个,可以手动调整,优先级数越小,优先等级越小 */
  /*
	//STM32CubeMX 生成的代码枚举
	typedef enum  {
	  osPriorityIdle          = -3,          ///< priority: idle (lowest)		//实际对应0
	  osPriorityLow           = -2,          ///< priority: low					//实际对应1
	  osPriorityBelowNormal   = -1,          ///< priority: below normal	    //实际对应2
	  osPriorityNormal        =  0,          ///< priority: normal (default)	//实际对应3
	  osPriorityAboveNormal   = +1,          ///< priority: above normal		//实际对应4
	  osPriorityHigh          = +2,          ///< priority: high				//实际对应5
	  osPriorityRealtime      = +3,          ///< priority: realtime (highest)	//实际对应6
	  osPriorityError         =  0x84        ///< system cannot determine priority or thread has illegal priority	
	} osPriority;
	
	//通过 makeFreeRtosPriority 函数将 STM32CubeMX 生成的代码枚举转换成实际对应的优先级
	static unsigned portBASE_TYPE makeFreeRtosPriority (osPriority priority)
	{
	  unsigned portBASE_TYPE fpriority = tskIDLE_PRIORITY;
	  
	  if (priority != osPriorityError) {
	    fpriority += (priority - osPriorityIdle);
	  } 
	  return fpriority;
	}
*/
  osThreadDef(Task01, Task01, osPriorityAboveNormal, 0, 128);
  /* 参数说明:生成任务结构体的地址取值宏, 任务参数*/
  defaultTaskHandle = osThreadCreate(osThread(Task01), NULL);
  /* USER CODE END RTOS_THREADS */

  /* Start scheduler */
  osKernelStart();
}

猜你喜欢

转载自blog.csdn.net/shileiwu0505/article/details/114485788