同等优先级任务 轮流的享有相同的CPU时间 (可设置),叫时间片 ,在FreeRTOS中,一个时间片 就等于SysTick中断周期 ,所以说时间片大小 取决于滴答定时器中断频率 运行完Task1一个时间片后,切换到Task2,Task2运行完一个时间片后,切换到Task3运行 假设Task3运行到一半时,Task3被阻塞 (系统延时或等待信号量等)了,此时直接切换 到Task1 实验设计:三个任务:start_task、task1、task2,其中task1和task2优先级相同均为2。为了使得现象明显,将抵达定时器的中断频率设置为50ms一次,即一个时间片50ms 注意辨别FreeRTOS自带延时函数和系统延时函数的区别,使用FreeRTOS延时函数 时,会阻塞任务,从而直接运行下一任务 ,系统延时函数会直接等待结束  # define  configUSE_TIME_SLICING 					1 # define  configUSE_PREEMPTION 					1 # define  configSUPPORT_DYNAMIC_ALLOCATION 		1 # define  configTICK_RATE_HZ 						20 # define 	START_TASK_STACK_SIZE  								128 # define 	START_TASK_PRIO 										1 ; 							
# define 	TASK1_STACK_SIZE  									128 # define 	TASK1_PRIO 											2 ; 								
# define 	TASK2_STACK_SIZE  									128 # define 	TASK2_PRIO 											2 ; 								
void  task1 (  void  *  pvParameters ) 
{ 
		uint32_t  task1_num =  0 ; 
		while ( 1 ) 
		{ 
			taskENTER_CRITICAL ( ) ; 
			printf ( "%d\r\n" , ++ task1_num) ; 
			delay_ms ( 10 ) ; 
			taskEXIT_CRITICAL ( ) ; 
		} 
} 
void  task2 (  void  *  pvParameters ) 
{ 
		uint32_t  task2_num =  0 ; 
		while ( 1 ) 
		{ 
			taskENTER_CRITICAL ( ) ; 
			printf ( "%d\r\n" , ++ task2_num) ; 
			delay_ms ( 10 ) ; 
			taskEXIT_CRITICAL ( ) ; 
		} 
} 
void  Start_task (  void  *  pvParameters ) 
{ 
		taskENTER_CRITICAL ( ) ; 
		
		xTaskCreate ( task1, 
					"task1" , 
					TASK1_STACK_SIZE, 
					NULL , 
					TASK1_PRIO, 
					& task1_handle
					) ; 
		
		xTaskCreate ( task2, 
					"task2" , 
					TASK2_STACK_SIZE, 
					NULL , 
					TASK2_PRIO, 
					& task2_handle
					) ; 
		vTaskDelete ( start_task_handle) ; 
		
		taskEXIT_CRITICAL ( ) ; 
} 
void  freertos_demo ( ) 
{ 
		xTaskCreate ( Start_task, 
					"Start_task" , 
					START_TASK_STACK_SIZE, 
					NULL , 
					START_TASK_PRIO, 
					& start_task_handle
					) ; 
		vTaskStartScheduler ( ) ; 
}