1895|0

6587

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

基础类的DSP/BIOS API调用之三 [复制链接]

九、任务管理 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);
}
}
假如流式IO没有准备好,那么该API函数会阻塞(Blocked),任务切换,一段时间后,流式IO数据
准备好了,此时发出READY信号,将本任务置为ready状态,此时TSK_settime会重新记录时间。
(6)void TSK_disable(void)
全局关闭内核调度机制,Busy-Shutting-Down状态。只有当前任务可行,其余所有任务禁止。
此函数不会禁止中断,所以在中断开始前需要调用此函数保证中断发生时不会发生任务切换。
可以嵌套,但是调用几次TSK_disable,就得相应调用几次TSK_enable
(7)void TSK_enable(void)
全局开启内核调度机制
(8)void TSK_exit(void)
终止当前任务运行。如果所有任务都被终止,则DSP/BIOS会调用SYS_exit终止程序。
无论什么时候,任务从顶层函数返回时,都是自动调用此函数。
可以注册一个退出辅助函数 void myExitFxn(void)
这样,在任务被设置为TSK_TERMINATED模式之前,会调用这个辅助函数。
(9)Ptr environ = TSK_getenv(TSK_Handle task)
返回任务环境指针,这个指针指向一个该任务可以访问的全局属性的结构。
若程序定义多个钩子对象,那么HOOK_getenv函数可以获取设置的环境指针。
(10)void TSK_setenv(TSK_Handle task, Ptr environ)
设置指定任务的环境指针。
若程序定义多个钩子对象,那么HOOK_setenv函数可以为每个钩子和任务对象的组合体设置独立的环境指针。
(11)int errno = TSK_geterr(TSK_Handle task)
每个任务对象都有一个包含任务错误号的存储单元。初始值为SYS_OK
(12)void TSK_seterr(TSK_Handle task, int errno)
改变错误号
(13)String name = TSK_getname(TSK_Handle task)
返回任务的名字。
对于静态对象来说,必须打开Allocate Task Name on Target
对于动态对象来说,TSK_getname返回attrs.name字段
(14)int priority = TSK_getpri(TSK_Handle task)
返回优先级
(15)int oldpri = TSK_setpri(TSK_Handle task, int newpri)
设置优先级
设置优先级对于TSK_BLOCKED状态任务只是优先级改变,而不会改变状态;
对于TSK_READY状态的任务而言,可能会改变运行状态。
(16)STS_Handle sts = TSK_getsts(TSK_Handle task)
获得统计对象句柄,以便查看数据
(17)void TSK_sleep(Uns nticks)
暂停任务的时钟个数,此时钟数可能比真实的暂停时钟少一个时钟(告警时钟)
(18)void TSK_itick(void)
对告警时钟加1,以便让TSK_sleep或者SEM_pend函数暂停执行的任务恢复到ready。
一些暂停的任务可能会随着告警时钟的增加而超时,从而就绪。
(19)void TSK_tick(void)
对告警时钟加1,以便让TSK_sleep或者SEM_pend函数暂停执行的任务恢复到ready。
一些暂停的任务可能会随着告警时钟的增加而超时,从而就绪。
可以在中断服务程序和当前任务中调用,后者在控制超时非常有用。
(20)Uns currtime = TSK_time(void)
返回系统告警时钟的当前值。(由于延迟,只能得到一个大概的系统时钟)
(21)TSK_Handle currtask = TSK_self(void)
返回当前任务对象的句柄
(22)void TSK_stat(TSK_Handle task,TSK_Stat * statbuf)
返回任务的属性参数和状态信息
struct TSK_Stat{
TSK_Attrs attrs;//任务参数
TSK_Mode mode; //任务执行模式
Ptr sp; //任务当前堆栈指针
Uns used; //任务堆栈曾经使用的最大值
}
注意:任务比HWI和SWI中断优先级要低,所以当任务被中断时,还是返回TSK_RUNNING,
因为中断完成后任务继续运行。
(23)void TSK_yield(void)
强制任务切换,请注意,任务可以被中断,但是,任务之间必须依靠切换来进行,就是说,
即便当前有高优先级任务就绪,它不能被执行,除非切换。
此函数用于任务之间的同步。

十、任务管理 HOOK钩子函数管理模块
HOOK模块管理者一组涉及钩子函数的对象。DSP/BIOS初始化期间,每一个HOOK对象都分配了一个数字标识符。
每个HOOK模块都有一个初始化函数,该函数会在钩子函数调用前运行。在调用初始化函数是,DSP/BIOS内核
会将HOOK对象的标识符以参数的形式传给初始化函数。
HOOK对象的数据是存放在.bss部分中的。

关于HOOK属性的设置,对应关系如下:
Initialization function: TSK_create
delete function: TSK_delete
Exit function: TSK_exit
另外还有Call switch function, switch function, Call ready function, ready function

十一、DSP/BIOS后台管理 IDL模块
IDL 模块管理着应用中最低等级的线程。除了用户自己编写的函数外,IDL模块执行DSP/BIOS的API函数,
DSP/BIOS内核正是利用这些函数来处理主机通信和CPU负载计算的。
当DSP/BIOS分析工具的RTA控制面板激活时,应用程序会包含一个IDL_cpuLoad的IDL对象,其会调用一个提供
CPU利用率的函数,绘出负载图。另外,还有LINL_dataPump函数在后台处理与主机的数据交换,RTDX,HST等。
程序模块执行状态图,就是RTA_dispatch函数处理的结果。
(1)void IDL_run(void)
依次调用IDL模块中定义的所有IDL函数,其在所有IDL函数执行一次后返回,由于IDL函数中有完成主机和目标
系统交换数据的函数,所有IDL函数必须定期调用。
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表