九、任务管理 TSK任务管理模块
(1)void TSK_checkstacks(TSK_Handle oldtask,TSK_Handle newtask)
无论是新任务还是老任务,如果堆栈的最后位置上都没有RG_STACKSTAMP标识,那么TSK_checkstacks就会
报错SYS_abort,出现这种情况可能是由于上一个任务堆栈溢出或无效的存储占用了新任务的堆栈
一般地,用TSK_checkstacks(TSK_self(),TSK_self())来检查堆栈
定义Switch函数,这样在任务切换时自动调用堆栈检查函数:
void myswitchfxn(TSK_Handle oldtask, TSK_Handle newtask)
{
...
TSK_checkstacks(oldtask,newtask);
...
}
(2)TSK_Handle task = TSK_create(Fxn fxn, TSK_Attrs * attr, Arg [arg,]...)
创建一个调用函数fxn的任务对象,返回新对象的句柄,失败返回NULL。
调用此函数是动态创建,而在配置工具中创建是静态创建,二者效果一样。
静态创建的任务对象,创建函数将在BIOS_start函数中自动调用。BIOS_start函数在main函数之后,
在后台IDL循环之前运行。而动态创建的任务处于Ready状态。函数参数最多不超过8个。
任务对象函数fxn返回时,自动调用TSK_exit函数。
解析:TSK_Attrs * attrs任务参数指针
struct TSK_Attrs{
int priority;
Ptr stack;
Uns stacksize;
#ifdef _64_ // imitate C55 series. to check
Uns sysstacksize;
#endif
Uns stackseg;
Ptr environ;
String name;
bool exitflag;
}
(3)void TSK_delete(TSK_Handle task)
从所有内部队列里面删除这个任务,并且调用MEM_free释放任务对象和堆栈。
只能删除处于结束状态的任务,也可调用删除的钩子函数。
void myDeleteFxn(TSK_Handle task);
(4)void TSK_deltatime(TSK_Handle task)
累计从任务准备好到执行此函数时候的时间差
如果未调用此函数,那么就算打开任务统计累加器选项,统计对象也不会更新
一般地,统计时先用TSK_settime函数记录起始点,此函数记录终点。
(5)void TSK_settime(TSK_Handle task)
设定统计初始值
void task()
{
--do some startup work--
TSK_settime(TSK_self);
for(;;){
SIO_get(...);
--process data--
TSK_deltatime(TSK_self);
}
}
|