3. 任务
3.1 任务定义:任务是一个可执行的程序单元。
3.2 任务特性:动态性,独立性,并发性
3.1.1 动态性:CPU资源并没有一直占用。与裸机的程序模块本质的区别。
1)就绪态(等待CPU)
2)运行态(占用CPU)
3)等待态(释放CPU)
3.1.2 独立性:
1)单独的个体。逻辑上与其他可执行程序单元(task,isr)平等。
3.1.3 并发性:
1)感觉每个任务都拥有自己的CPU资源
2)单CPU系统不可能是真正的并发,因为同一时间只能有一个程序单元运行,故为伪并发
3.3 任务分类:单次执行的任务,周期执行的任务,事件触发的任务。
3.3.1 单次执行的任务:
1)任务创建后只执行一次,执行结束后立即将自己删除。
2)举例一:启动任务
void main(void)
{
OSInit();
OSTaskCreat(StartTask, NULL, &StartTaskStk[TASK_STK_SIZE - 1], 1);
OSStart();
}
void StartTask(void * pdata)
{
初始化硬件资源 //中断、时钟、外设
创建各任务 //采集任务、处理任务、显示任务、通讯任务等
创建各种通讯工具 //信号量、消息邮箱、消息队列、事件标志组等
删除自己 //OSTaskDel()
}
【批注】创建启动任务后删除,浪费了系统资源,故一般初始化工作交给一个有实质的用户任务来完成。
3)举例二:按键任务检测到发送按键、则创建发送任务,发送任务执行完成在删除自己
【批注】该任务对实时性要求不高,且该任务为孤立任务(与其他任务没有行为同步、资源同步),否则容易出异常。
3.3.2 周期执行的任务
1)举例一:
void StartTask(void * pdata)
{
初始化
while (1) {
任务实体代码
调用系统延时函数 //OSTimeDlyHMSM();或者OSTimeDly();
}
}
2)用于执行周期远大于系统节拍时间。
3)若执行周期只要一个或几个系统节拍,故该任务功能可以发到节拍钩子函数OSTimeTickHook()去做。
4)若执行周期小于系统节拍或不是系统节拍的整数倍,则该任务功能可以放到定时中断去做。
【批注】多任务系统中,用户任务必须至少一次调用系统服务函数接口,否则低优先级则无法得到运行的机会(高优先级可以通过中断触发后重新任务调度而得到运行)。
3.3.3 事件触发的任务
1)举例一:
void StartTask(void * pdata)
{
初始化
while (1) {
获取事件函数 //等待信号量、消息邮箱、消息队列、事件标志组等
任务实体代码
}
}
2)获取事件函数,因获取不到事件而挂起进入等待状态,例如:信号类:OSSemPend(Sem, 0, &err); 消息类:OSMboxPend(Mbox, 0, &err);
3)该事件由其他可执行程序单元(task、isr)发送,例如:OSSemPost(Sem);
KUI 20170917
3.1 任务定义:任务是一个可执行的程序单元。
3.2 任务特性:动态性,独立性,并发性
3.1.1 动态性:CPU资源并没有一直占用。与裸机的程序模块本质的区别。
1)就绪态(等待CPU)
2)运行态(占用CPU)
3)等待态(释放CPU)
3.1.2 独立性:
1)单独的个体。逻辑上与其他可执行程序单元(task,isr)平等。
3.1.3 并发性:
1)感觉每个任务都拥有自己的CPU资源
2)单CPU系统不可能是真正的并发,因为同一时间只能有一个程序单元运行,故为伪并发
3.3 任务分类:单次执行的任务,周期执行的任务,事件触发的任务。
3.3.1 单次执行的任务:
1)任务创建后只执行一次,执行结束后立即将自己删除。
2)举例一:启动任务
void main(void)
{
OSInit();
OSTaskCreat(StartTask, NULL, &StartTaskStk[TASK_STK_SIZE - 1], 1);
OSStart();
}
void StartTask(void * pdata)
{
初始化硬件资源 //中断、时钟、外设
创建各任务 //采集任务、处理任务、显示任务、通讯任务等
创建各种通讯工具 //信号量、消息邮箱、消息队列、事件标志组等
删除自己 //OSTaskDel()
}
【批注】创建启动任务后删除,浪费了系统资源,故一般初始化工作交给一个有实质的用户任务来完成。
3)举例二:按键任务检测到发送按键、则创建发送任务,发送任务执行完成在删除自己
【批注】该任务对实时性要求不高,且该任务为孤立任务(与其他任务没有行为同步、资源同步),否则容易出异常。
3.3.2 周期执行的任务
1)举例一:
void StartTask(void * pdata)
{
初始化
while (1) {
任务实体代码
调用系统延时函数 //OSTimeDlyHMSM();或者OSTimeDly();
}
}
2)用于执行周期远大于系统节拍时间。
3)若执行周期只要一个或几个系统节拍,故该任务功能可以发到节拍钩子函数OSTimeTickHook()去做。
4)若执行周期小于系统节拍或不是系统节拍的整数倍,则该任务功能可以放到定时中断去做。
【批注】多任务系统中,用户任务必须至少一次调用系统服务函数接口,否则低优先级则无法得到运行的机会(高优先级可以通过中断触发后重新任务调度而得到运行)。
3.3.3 事件触发的任务
1)举例一:
void StartTask(void * pdata)
{
初始化
while (1) {
获取事件函数 //等待信号量、消息邮箱、消息队列、事件标志组等
任务实体代码
}
}
2)获取事件函数,因获取不到事件而挂起进入等待状态,例如:信号类:OSSemPend(Sem, 0, &err); 消息类:OSMboxPend(Mbox, 0, &err);
3)该事件由其他可执行程序单元(task、isr)发送,例如:OSSemPost(Sem);
KUI 20170917