分享

基础类的DSP/BIOS API调用下

 AwayFly 2011-05-27
基础类的DSP/BIOS API调用下

nb
 oldmask = c64_disableier(0x1);
// disable int0
 c64_enableier(oldmask);   
// enable int0
(3)void c64_plug(int vecid, fxn fxn, int dmachan)写了--
--边看书边写的--希望能够给
 插入一个中断向量
 int vecid: 中断序号
 fxn fxn: 中断服务程序的函数指针--本想在网上找找,但是没有找到,就自己
 int dmachan: 插入操作使用的dma通道
 将isfp写到中断服务表ist中。若ist在外部ram,则cpu复制代替dma,此时dma为-1
 ist在片内ram时,使用dma方式,是0,1,2,3
用户保证在函数调用时该dma通道有效写了--
--边看书边写的--希望能够给
 
七、统计模块sts
(1)void sts_add(sts_obj * sts, lgint value)【原创】 转载请注明出处

 使用我们提供的数据更新sts统计对象的total,count,max等参数
 传入一个32位参数,count加1,total累加传递的32位参数,max记录传递参数的最大值
(2)void sts_delta(sta_obj * sts, lgint value)--本想在网上找找,但是没有找到,就自己
 每个对象都包含有初始值,该初始值由配置文件指定或者由sts_set函数设置
 sts_delta先计算当前传递参数与先前初始值只差,然后调用sts_add更新统计累加值
 一般和sts_set一起用【原创】 转载请注明出处

 eg:
  sts_set(&sts,clk_gethtime());
  sts_delta(&sts,clk_gethtime());写了--
--边看书边写的--希望能够给
(3)void sts_reset(sts_obj * sts)
 复位统计对象中的累加值。count和total设置为0.max成为最大的负值。 
(4)void sts_set(sts_obj * sts, lgint value)写了--
--边看书边写的--希望能够给
 监视或统计程序的执行时间
八、统计类模块trc
(1)trc_logclk 日志记录定时器中断【原创】 转载请注明出处

(2)trc_logprd 日志记录周期时隙和周期函数的开始
(3)trc_logswi 日志记录软件中断的启动和完成
(4)trc_logtsk 日志记录任务处于准备好、开始、停止、继续执行、终止等事件--本想在网上找找,但是没有找到,就自己
(5)trc_stshwi 收集关于hwi统计数据
(6)trc_stspip 写管道和读管道帧进行计数
(7)trc_stsprd 执行期间clk时隙个数的统计数据【原创】 转载请注明出处

(8)trc_stsswi swi执行时间的统计数据
(9)trc_ststsk tsk执行时间的统计数据 从tsk准备好到调用tsk deltatime都要收集
(10)trc_user0 and trc_user1 和trc_query一起用 执行和忽略结果的设备调用【原创】 转载请注明出处

(11)trc_gblhost 执行所有的隐藏仪器功能,此比特位能够开始或停止收集所有开启的跟踪类型
(12)trc_gbltarg 执行所有的隐藏仪器功能,此比特位只能被目标程序设置
九、任务管理 tsk任务管理模块写了--
--边看书边写的--希望能够给
(1)void tsk_checkstacks(tsk_handle oldtask,tsk_handle
newtask)
 无论是新任务还是老任务,如果堆栈的最后位置上都没有rg_stackstamp标识,那么tsk_checkstacks就会
 报错sys_abort,出现这种情况可能是由于上一个任务堆栈溢出或无效的存储占用了新任务的堆栈sp;
基础类的dspbios api调
 一般地,用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。
 调用此函数是动态创建,而在配置工具中创建是静态创建,二者效果一样。sp;
基础类的dspbios api调
 静态创建的任务对象,创建函数将在bios_start函数中自动调用。bios_start函数在main函数之后,
 在后台idl循环之前运行。而动态创建的任务处于ready状态。函数参数最多不超过8个。
 任务对象函数fxn返回时,自动调用tsk_exit函数。大家提供便利---

&nb
 解析: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函数记录起始点,此函数记录终点。大家提供便利---

&nb
(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);
  }
 }大家提供便利---

&nb
 假如流式io没有准备好,那么该api函数会阻塞(blocked),任务切换,一段时间后,流式io数据
 准备好了,此时发出ready信号,将本任务置为ready状态,此时tsk_settime会重新记录时间。
(6)void tsk_disable(void)写了--
--边看书边写的--希望能够给
 全局关闭内核调度机制,busy-shutting-down状态。只有当前任务可行,其余所有任务禁止。
 此函数不会禁止中断,所以在中断开始前需要调用此函数保证中断发生时不会发生任务切换。
 可以嵌套,但是调用几次tsk_disable,就得相应调用几次tsk_enablesp;
基础类的dspbios api调
(7)void tsk_enable(void)
 全局开启内核调度机制
(8)void tsk_exit(void)--本想在网上找找,但是没有找到,就自己
 终止当前任务运行。如果所有任务都被终止,则dsp/bios会调用sys_exit终止程序。
 无论什么时候,任务从顶层函数返回时,都是自动调用此函数。
 可以注册一个退出辅助函数 void
myexitfxn(void)大家提供便利---

&nb
 这样,在任务被设置为tsk_terminated模式之前,会调用这个辅助函数。
(9)ptr environ = tsk_getenv(tsk_handle task)
 返回任务环境指针,这个指针指向一个该任务可以访问的全局属性的结构。【原创】 转载请注明出处

 若程序定义多个钩子对象,那么hook_getenv函数可以获取设置的环境指针。
(10)void tsk_setenv(tsk_handle task, ptr environ)
 设置指定任务的环境指针。大家提供便利---

&nb
 若程序定义多个钩子对象,那么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)大家提供便利---

&nb
 返回任务的名字。
 对于静态对象来说,必须打开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)sp;
基础类的dspbios api调
 暂停任务的时钟个数,此时钟数可能比真实的暂停时钟少一个时钟(告警时钟)
(18)void tsk_itick(void)
 对告警时钟加1,以便让tsk_sleep或者sem_pend函数暂停执行的任务恢复到ready。sp;
基础类的dspbios api调
 一些暂停的任务可能会随着告警时钟的增加而超时,从而就绪。
(19)void tsk_tick(void)
 对告警时钟加1,以便让tsk_sleep或者sem_pend函数暂停执行的任务恢复到ready。大家提供便利---

&nb
 一些暂停的任务可能会随着告警时钟的增加而超时,从而就绪。
 可以在中断服务程序和当前任务中调用,后者在控制超时非常有用。
(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,大家提供便利---

&nb
 因为中断完成后任务继续运行。
(23)void tsk_yield(void)
 强制任务切换,请注意,任务可以被中断,但是,任务之间必须依靠切换来进行,就是说,sp;
基础类的dspbios api调
 即便当前有高优先级任务就绪,它不能被执行,除非切换。
 此函数用于任务之间的同步。
 --本想在网上找找,但是没有找到,就自己
十、任务管理 hook钩子函数管理模块
hook模块管理者一组涉及钩子函数的对象。dsp/bios初始化期间,每一个hook对象都分配了一个数字标识符。
每个hook模块都有一个初始化函数,该函数会在钩子函数调用前运行。在调用初始化函数是,dsp/bios内核【原创】 转载请注明出处

会将hook对象的标识符以参数的形式传给初始化函数。
hook对象的数据是存放在.bss部分中的。
大家提供便利---

&nb
关于hook属性的设置,对应关系如下:
initialization function: tsk_create
delete function: tsk_delete【原创】 转载请注明出处

exit function: tsk_exit
另外还有call switch function, switch function, call
ready function, ready function
大家提供便利---

&nb
十一、dsp/bios后台管理 idl模块
idl
模块管理着应用中最低等级的线程。除了用户自己编写的函数外,idl模块执行dsp/bios的api函数,
dsp/bios内核正是利用这些函数来处理主机通信和cpu负载计算的。sp;
基础类的dspbios api调
当dsp/bios分析工具的rta控制面板激活时,应用程序会包含一个idl_cpuload的idl对象,其会调用一个提供
cpu利用率的函数,绘出负载图。另外,还有linl_datapump函数在后台处理与主机的数据交换,rtdx,hst等。
程序模块执行状态图,就是rta_dispatch函数处理的结果。【原创】 转载请注明出处

(1)void idl_run(void)
 依次调用idl模块中定义的所有idl函数,其在所有idl函数执行一次后返回,由于idl函数中有完成主机和目标
 系统交换数据的函数,所有idl函数必须定期调用。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多