基础类的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 period = CLK_getprd(void)
返回CLK管理器周期寄存器的值
二、周期函数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,以便周期模块管理器确定哪个周期性函数得以运行
三、软件中断管理SWI
(1)void SWI_andn(SWI_Obj* swi, Uns mask) mask 屏蔽字参数
将邮箱值与mask做与运算,并用结果代替以前的邮箱值,若为0,启动软件中断,恢复邮箱初始值
(2)void SWI_andn(SWI_Obj* swi)
将邮箱值减1,并用结果代替以前的邮箱值,若为0,启动软件中断,恢复邮箱初始值
(3)void SWI_disable(Void)
禁止软件中断
(4)void SWI_enable(Void)
使能软件中断
(5)Uns num = SWI_getmbox(void)
返回当前SWI对象在被执行的邮箱值,若中断已经开始执行,DSP/BIOS会先保存此值
(6)Uns key = SWI_getpri(SWI_Obj * swi)
返回指定的SWI对象的优先级
(7)void SWI_inc(SWI_Obj * swi)
将指定的SWI对象的邮箱值加1,同时启动软件中断,就算用户调用多次,最终执行一次。
(8)void SWI_or(SWI_Obj* swi, Uns mask) mask 屏蔽字参数
将启动指定的软件中断,并将此软件中断的邮箱值与mask做与运算,并用结果代替以前的邮箱值,
等到中断完成之后,邮箱值恢复为初始值,一般地,调用SWI_getmbox获得触发此软件中断的邮箱值
(9)void SWI_post(SWI_Handle swi)
启动指定的SWI对象的软件中断,此函数不受邮箱值的影响,也不影响邮箱值。
一般地,周期性低启动一个软件中断,将_SWI_post填入PRD对象的函数设置栏,启动软件中断的参数写入arg0
(10)Uns key = SWI_raisepri(Uns mask)
提高SWI软件中断的优先级,一般地
key = SWI_raisepri(SWI_getpri(&swi_1));
--access shared resouces--
SWI_restorepri(key)
(11)void SWI_restorepri(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跟踪管理模块的影响
后一个函数类似于前一个函数,但是受到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(int segid,Uns size,Uns align)
指定存储段分配连续块,返回起始地址
segid = 存储段的标识符或者ID号
size 块大小 等于多少个字
align 边界条件 只为0或2的幂 若align为0、1 则无约束
(2)void * addr = MEM_calloc(segid, size, align)
分配内存并初始化为0
(3)int segid = MEM_define(Ptr base, Uns length, MEM_Attrs* attrs)
定义一个新的存储段。返回值为存储段的ID标号
attr参数为NULL,会按照默认参数进行配置,段的参数由结构体type MEM_Attrs规定
此函数仅在main函数中使用
base: 新段的基地址
length:段长度
attrs:段属性
(4)bool status = MEM_free(segid,addr,size)
释放申请的动态内存 不能在SWI和HWI中调用
调用之前,用LCK中API查看内存块的锁定情况
(5)void MEM_redefine(segid,base,length)
重新定义一个存储段,只能在main中调用
(6)bool status = MEM_stat(int segid, MEM_Stat * statbuf)
segid 存储段标识符
statbuf 状态缓存区指针
struct mem_stat{
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)
先申请内存,初始化为指定的值value
|