dsp-biosapi接口介绍精_第1页
dsp-biosapi接口介绍精_第2页
dsp-biosapi接口介绍精_第3页
dsp-biosapi接口介绍精_第4页
dsp-biosapi接口介绍精_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基础类的 DSP/BIOS API 调用基础类的 DSP/BIOS API 调用一、时钟管理 CLK(1) Uns ncounts= CLK_countspms(void)返回每毫秒的定时器高分辨率时钟的计数值(2) LgUns currtime = CLK_gethtime(void)返回高分辨率时钟的计数值 超过 32bit 归零高分辨率时钟是 DSP 时钟除以 (TDDR+1)(3) LgUns currtime = CLK_getltime(void)返回低分辨率时钟的计数值 超过 32bit 归零高分辨率时钟是 DSP 时钟除以 (TDDR+1) 再除以 (PRD+1)(4) Uns

2、 period = CLK_getprd(void)返回 CLK 管理器周期寄存器的值sp; 基础类的 DSPBIOS API 调 二、周期函数 PRD(1) LgUns num = PRD_getticks(void)返回 32 位周期函数管理计数值(2) void PRD_start(PRD_Obj* period)启动 PRD 模块计数器,一般地, mode=one-shot(3) void PRD_stop(PRD_Obj* period)关闭 PRD 模块计数器(4) void PRD_tick(void)对周期模块的计数器加 1,以便周期模块管理器确定哪个周期性函数得以运行三、软件

3、中断管理 SWImask 屏蔽字参数(1) void SWI_andn(SWI_Obj* swi, Uns mask)0,启动软件中断,恢复邮箱初始值将邮箱值与 mask 做与运算,并用结果代替以前的邮箱值,若为(2) void SWI_andn(SWI_Obj* swi)将邮箱值减 1 ,并用结果代替以前的邮箱值,若为0 ,启动软件中断,恢复邮箱初始值(8)void SWI_or(SWI_Obj* swi, Uns mask)mask 屏蔽字参数(3) void SWI_disable(Void)禁止软件中断(4) void SWI_enable(Void)使能软件中断(5) Uns num

4、 = SWI_getmbox(void)DSP/BIOS 会先保存此值返回当前 SWI 对象在被执行的邮箱值,若中断已经开始执行,(6) Uns key = SWI_getpri(SWI_Obj * swi)返回指定的 SWI 对象的优先级(7) void SWI_inc(SWI_Obj * swi)将指定的 SWI 对象的邮箱值加 1 ,同时启动软件中断,就算用户调用多次,最终执行一次将启动指定的软件中断,并将此软件中断的邮箱值与 mask 做与运算,并用结果代替以前的邮箱值,SWI_getmbox 获得触发此软件中断的邮箱值等到中断完成之后,邮箱值恢复为初始值,一般地,调用(9) void

5、 SWI_post(SWI_Handle swi)启动指定的 SWI 对象的软件中断,此函数不受邮箱值的影响,也不影响邮箱值一般地,周期性低启动一个软件中断,将_SWI_post 填入 PRD 对象的函数设置栏,启动软件中断的参数写入arg0(10) Uns key = SWI_raisepri(Uns mask)提高 SWI 软件中断的优先级,一般地 sp; 基础类的 DSPBIOS API 调key = SWI_raisepri(SWI_getpri(&swi_1);-access shared resouces-SWI_restorepri(key)(11) void SWI_r

6、estorepri(Uns key)恢复原来的优先级(12) SWI_Obj * swi = SWI_self(void)当前执行的 SWI 对象的软件中断的地址四、信息输出管理 LOG(1) void LOG_disable(LOG_Obj * log)关闭指定对向的日志功能(2) void LOG_enable(LOG_Obj * log)开启指定对向的日志功能(3) void LOG_error(String format, Arg arg0)void LOG_message(String format, Arg arg0)TRC 跟踪管理模块的影响前一个函数可以将一个事件、数据或出错信

7、息按照指定的格式串写入系统日志,不受后一个函数类似于前一个函数,但是受到TRC 跟踪管理模块的影响(4) void LOG_event(LOG_Obj * log, Arg arg0, Arg arg1, Arg arg2)将未格式化的事件消息写入日志中(5) void LOG_printf(LOG_Obj * log, String format, int arg0, int arg1)指定的 LOG 窗口显示消息 %d %x %o %s(6) void LOG_reset(LOG_Obj * log)复位日志缓冲区五、存储器管理 MEM(1) void * addr = MEM_alloc

8、(int segid,Uns size,Uns align)指定存储段分配连续块,返回起始地址segid = 存储段的标识符或者 ID 号size 块大小 等于多少个字align 边界条件 只为 0 或 2 的幂 若 align 为 0 、1 则无约束(2) void * addr = MEM_calloc(segid, size, align)基础类的 DSPBIOS API 调分配内存并初始化为 0(3) int segid = MEM_define(Ptr base, Uns length, MEM_Attrs* attrs)sp;定义一个新的存储段。返回值为存储段的ID 标号type

9、MEM_Attrs 规定attr 参数为 NULL ,会按照默认参数进行配置,段的参数由结构体此函数仅在 main 函数中使用base: 新段的基地址length :段长度attrs :段属性(4) bool status = MEM_free(segid,addr,size)释放申请的动态内存 不能在 SWI 和 HWI 中调用调用之前,用 LCK 中 API 查看内存块的锁定情况 sp; 基础类的 DSPBIOS API 调(5) void MEM_redefine(segid,base,length)重新定义一个存储段,只能在 main 中调用(6) bool status = MEM_

10、stat(int segid, MEM_Stat * statbuf)segid 存储段标识符statbuf 状态缓存区指针struct mem_statsp; 基础类的 DSPBIOS API 调Uns size;/ 存储段大小Uns used;/ 已经使用的数量Uns length;/ 最大连续存储块长度同理:若 segid 有效,则 MEM_stat 返回 TRUE不能在 SWI 和 HWI 中使用,应判断锁定情况(7) void * addr = MEM_valloc(int segid, Uns size, Uns align, char value)先申请内存,初始化为指定的值 v

11、alue六、C6000 专用模块 C64xsp; 基础类的 DSPBIOS API 调(1)Uns oldmask = C64_diableIER(Uns mask)关闭相应的中断 返回值实际屏蔽的中断(2) void C64_enableIER(Uns oldmask)开放相应的中断Uns oldmask;oldmask = C64_disableIER(0x1); / disable INT0C64_enableIER(oldmask);/ enable INT0(3) void C64_plug(int vecid, Fxn fxn, int dmachan)插入一个中断向量int ve

12、cid: 中断序号Fxn fxn: 中断服务程序的函数指针int dmachan: 插入操作使用的 DMA 通道将 ISFP 写到中断服务表 IST 中。若 IST 在外部 RAM ,则 CPU 复制代替 DMA ,此时 DMA 为 -1IST 在片内 RAM 时,使用 DMA 方式,是 0, 1, 2,3 用户保证在函数调用时该 DMA 通道有效七、统计模块 STS (1)void STS_add(STS_Obj * sts, LgInt value)使用我们提供的数据更新 STS 统计对象的 Total , Count ,Max 等参数传入一个 32 位参数, Count 加 1, Tot

13、al 累加传递的 32 位参数, MAX 记录传递参数的最大值(2) void STS_delta(STA_Obj * sts, LgInt value)STS_set 函数设置STS_add 更新统计累加值每个对象都包含有初始值,该初始值由配置文件指定或者由STS_delta 先计算当前传递参数与先前初始值只差,然后调用一般和 STS_set 一起用eg:STS_set ( &sts,CLK_gethtime();STS_delta(&sts,CLK_gethtime();(3) void STS_reset(STS_Obj * sts)复位统计对象中的累加值Count 和

14、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_S

15、TSSWI 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 newt

16、ask)无论是新任务还是老任务,如果堆栈的最后位置上都没有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,new

17、task);(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 函数解

18、析: TSK_Attrs * attrs任务参数指针struct TSK_Attrsint priority;Ptr stack;Uns stacksize;#ifdef _64_ / imitate C55 series. to checkUns sysstacksize;#endifUns stackseg;Ptr environ;String name;bool exitflag;(3)void TSK_delete(TSK_Handle task)从所有内部队列里面删除这个任务,并且调用MEM_free 释放任务对象和堆栈只能删除处于结束状态的任务,也可调用删除的钩子函数void my

19、DeleteFxn(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 dataTSK_deltatime(

20、TSK_self);假如流式 IO 没有准备好,那么该 API 函数会阻塞 (Blocked) ,任务切换,一段时间后,流式 IO 数据准备好了,此时发出 READY 信号,将本任务置为 ready 状态,此时 TSK_settime 会重新记录时间(6) void TSK_disable(void)全局关闭内核调度机制, Busy-Shutting-Down 状态。只有当前任务可行,其余所有任务禁止此函数不会禁止中断,所以在中断开始前需要调用此函数保证中断发生时不会发生任务切换可以嵌套,但是调用几次 TSK_disable ,就得相应调用几次 TSK_enablesp; 基础类的 DSPBI

21、OS API 调(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)返回任务环境指针,这个指针指向一个该任务可以访问的全局属性的结构若程序定义多个钩子对

22、象,那么 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_ge

23、tname(TSK_Handle task)返回任务的名字对于静态对象来说,必须打开Allocate Task Name on Target对于动态对象来说, TSK_getname 返回 字段(14) int priority = TSK_getpri(TSK_Handle task)返回优先级(15) int oldpri = TSK_setpri(TSK_Handle task, int newpri)设置优先级设置优先级对于 TSK_BLOCKED 状态任务只是优先级改变,而不会改变状态;对于 TSK_READY 状态的任务而言,可能会改变运行状态(16) STS

24、_Handle sts = TSK_getsts(TSK_Handle task)获得统计对象句柄,以便查看数据(17) void TSK_sleep(Uns nticks)sp;基础类的 DSPBIOS API 调ready 。 sp; 基础类的 DSPBIOS API 调ready返回系统告警时钟的当前值(由于延迟,只能得到一个大概的系统时钟暂停任务的时钟个数,此时钟数可能比真实的暂停时钟少一个时钟(告警时钟)(18) void TSK_itick(void)对告警时钟加 1 ,以便让 TSK_sleep 或者 SEM_pend 函数暂停执行的任务恢复到一些暂停的任务可能会随着告警时钟的增

25、加而超时,从而就绪(19) void TSK_tick(void)对告警时钟加 1 ,以便让 TSK_sleep 或者 SEM_pend 函数暂停执行的任务恢复到一些暂停的任务可能会随着告警时钟的增加而超时,从而就绪可以在中断服务程序和当前任务中调用,后者在控制超时非常有用(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_StatTSK_Attrs attrs;/ 任务参数TSK_Mode mode; / 任务执行模式Ptr sp;/任务当前堆栈指针TSK_RUNNINGUns used; /任务堆栈曾经使用的最大值注意:任务比 HWI 和 SWI 中断优先级要低,所以当任务被中断时,还是返回因为中断完成后任务继续运行(23)void TSK_yield(void)强制任务切换,请注意,任务可以被中断,但是,任务

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论