在上传这篇文章的时候,同时也上传了代码,欢迎下载!
RTOS中的延时是在需要延时的时间内任务放弃CPU的使用权,超过延时时间后重新获得CPU的使用权。叫做:阻塞延时。
**空闲任务是在启动调度器后创建的,是CPU空闲时候运行的,是优先级最低的。空闲任务主要做一些清理内存的的任务。**空闲任务是不允许阻塞的。
如何实现空闲任务?
1.在main.c定义空闲任务栈。
首先在freeRTOS中定义空闲任务栈最小的任务栈大小(单位是 :字):
#define configMINIMAL_STACK_SIZE ((unsigned short) 128) //单位是 字
然后在main.c中获取空闲任务的内存:
// 获取空闲任务的内存
StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
2.main.c中定义空闲任务的任务控制块。
TCB_t IdleTaskTCB;
Idle 是空闲的意思。
3.在task.c中定义空闲任务函数主体。
#define portTASK_FUNCTION(prvIdleTask, pvParameters) void vFunction(void *pvParameters)
static portTASK_FUNCTION(prvIdleTask, pvParameters)
{
// 禁止编译的警告
(void)pvParameters;
for(;;)
{
// 空闲任务暂时什么什么都不做
}
}
4.在task.c的调度器函数中创建空闲任务。
void vTaskStartScheduler(void) // 调度器函数
{
// 创建空闲任务开始
TCB_t *pxIdleTaskTCBBuffer = NULL; // 用于指向空闲任务控制块
StackType_t *pxIdleTaskStackBuffer = NULL; // 用于空闲任务栈起始地址
uint32_t ulIdleTaskStackSize;
// 获取空闲任务的内容
vApplicationGetIdleTaskMemory(&pxIdleTaskTCBBuffer,
&pxIdleTaskStackBuffer,
&ulIdleTaskStackSize
);
xIdleTaskHandle = xTaskCreateStatic((TaskFunction_t)prvIdleTask, //任务入口
(char *)"IDLE", //任务名称,字符串形式
(uint32_t)ulIdleTaskStackSize, //任务栈大小,单位为字
(void *)NULL, // 任务形参
(StackType_t *)pxIdleTaskStackBuffer, // 任务栈起始地址
(TCB_t *)pxIdleTaskTCBBuffer //任务控制块
);
// 将任务添加到就绪列表
vListInsertEnd(&(pxReadyTasksLists[0]),&(((TCB_t *)pxIdleTaskTCBBuffer)->xStateListItem));
// 创建任务函数结束
// 手动指定第一个运行的任务
pxCurrentTCB = &Task1TCB;
// 启动调度器
if(xPortStartScheduler() != pdFALSE)
{
// 调度器启动成功,否则返回,即不会来到这里
}
}
在main.c中定义:
void vApplicationGetIdleTaskMemory(TCB_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize
)
{
*ppxIdleTaskStackBuffer = &IdleTaskTCB;
*ppxIdleTaskStackBuffer = IdleTaskStack;
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
在task.c中声明空闲任务的句柄;
static TaskHandle_t xIdleTaskHandle = NULL;
并且在task.c中声明:
extern void vApplicationGetIdleTaskMemory(TCB_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize
);
在task.c中声明:
#define portTASK_FUNCTION(vFunction,pvParameters) void vFunction(void *pvParameters)
写函数:
//空闲任务就是在这个函数中实现。
static portTASK_FUNCTION(prvIdleTask, pvParameters)
{
// 禁止编译的警告
(void)pvParameters;
for(;;)
{
// 空闲任务暂时什么什么都不做
}
}
注意声明的位置。我写代码的时候很多次因为声明的位置上不正确而报错。
如果有错误,欢迎批评指正!
欢迎交流学习!
完。