【FreeRTOS】基于STM32F103x笔记03---空闲任务及其钩子函数

目录

一、空闲任务

二、空闲任务的钩子函数

2.1 使用限制

2.2 使用的前提

2.3 使用实例


一、空闲任务

主要作用是释放被删除的任务的内存
程序的任务都是事件驱动,平时大部分时间处于阻塞状态。有可能我们自己创建的所有任务都无法执行,但是调度器必须能找到一个可以运行的任务。
所以,我们要提供空闲任务。在使用 vTaskStartScheduler() 函数来创建、启动调度器
时,这个函数内部会创建空闲任务: 空闲任务优先级为0 :它不能阻碍用户任务运行
空闲任务要么处于就绪态,要么处于运行态,永远不会阻塞。
要注意的是:如果使用 vTaskDelete() 来删除任务,那么你就要确保空闲任务有机会执行,否则就
法释放被删除任务的内存。
我们可以添加一个空闲任务的钩子函数 (Idle Task Hook Functions),空闲任务的循环没执行一次,就会调用一次钩子函数。钩子函数的作用有这些:
执行一些低优先级的、后台的、需要连续执行的函数
测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任
务占据的时间,就可以算出处理器占用率。
让系统进入省电模式:空闲任务能被执行就意味着没有重要的事情要做,当然可以进入省电模式
了。

二、空闲任务的钩子函数

2.1 使用限制

  • 不能导致空闲任务进入阻塞状态、暂停状态
  • 如果你会使用 vTaskDelete() 来删除任务,那么钩子函数要非常高效地执行。如果空闲任务移植卡在钩子函数里的话,它就无法释放内存。

2.2 使用的前提

FreeRTOS\Source\tasks.c 中,可以看到如下代码(3483行位左右),所以前提就是:
把这个宏定义为 1 confifigUSE_IDLE_HOOK
实现 vApplicationIdleHook 函数
 #if ( configUSE_IDLE_HOOK == 1 )
            {
                extern void vApplicationIdleHook( void );

                /* Call the user defined function from within the idle task.  This
                 * allows the application designer to add background functionality
                 * without the overhead of a separate task.
                 * NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,
                 * CALL A FUNCTION THAT MIGHT BLOCK. */
                vApplicationIdleHook();
            }

2.3 使用实例

void Task2Function(void * param);

/*-----------------------------------------------------------*/
static int task1flagrun = 0;
static int task2flagrun = 0;
static int taskidleflagrun = 0;

void Task1Function(void * param)
{
	TaskHandle_t xHandleTask2;
	BaseType_t xReturn;
	
	while (1)
	{
		task1flagrun = 1;
		task2flagrun = 0;
		taskidleflagrun = 0;
		printf("1");
		xReturn = xTaskCreate(Task2Function, "Task2", 1024, NULL, 2, &xHandleTask2);
		if (xReturn != pdPASS)
			printf("xTaskCreate err\r\n");
		//vTaskDelete(xHandleTask2);
			
	}
}

void Task2Function(void * param)
{
	while (1)
	{
		task1flagrun = 0;
		task2flagrun = 1;
		taskidleflagrun = 0;
		printf("2");
		//vTaskDelay(2);
		vTaskDelete(NULL);
	}
}

void vApplicationIdleHook( void )
{
	task1flagrun = 0;
	task2flagrun = 0;
	taskidleflagrun = 1;	
	printf("0");
}


/*-----------------------------------------------------------*/

int main( void )
{
	TaskHandle_t xHandleTask1;
		
#ifdef DEBUG
  debug();
#endif

	prvSetupHardware();

	printf("Hello, world!\r\n");

	xTaskCreate(Task1Function, "Task1", 100, NULL, 0, &xHandleTask1);

	/* Start the scheduler. */
	vTaskStartScheduler();

	/* Will only get here if there was not enough heap space to create the
	idle task. */
	return 0;
}

你可能感兴趣的:(【RTOS笔记】,stm32,嵌入式硬件,linux,单片机)