DSP/BIOS API提供可伸缩的实时核,还提供了有优先级的多线程处理。它是转为那些需要实现实时调度、同步及通信的应用程序而设计的。在一个包含DSP/BIOS 内核的应用程序中,按优先级从低到高有四种线程:后台线程(IDL),任务(TSK),软件中断(SWI),硬件中断(HWI)。 1、时钟管理CLK模块是系统的时钟管理模块,它提供以下几种API函数调用 CLK_countspms:函数返回毫秒(ms)的定时器高分辨率时钟的计数值; CLK_gethtime:函数返回高分辨率时间计数; CLK_getltime:函数返回低分辨率时间计数; CLK_getprd:函数返回定时器的周期寄存器(PRD)的值 调用:DSP/BIOS中的API几乎都是以C语言调用形式给出,但可以在汇编中调用。只需注意在汇编调用C函数时,要在C函数名前补充一个下划线,如_myfunction取代myfuction.汇编中调用API另一种方法直接使用宏调用。 2、周期函数PRD :可设置多个PRD对象,但所有的PRD对象都是又同一个周期计数器驱动的,每个PRD对象在不同周期内完成自己的功能。通常,PRD对象的周期计数都由CLK模块管理,也可由用户调用PRD_tick函数来管理。 PRD模块API函数: PRD_getticks:返回周期性函数的计数值; PRD_start:打开该PRD模块计数器; PRD_stop:关闭该PRD模块计数器; PRD_tick:系统内核或用户调用该函数完成对PRD管理模块的计数。 PRD函数用于需要定时执行的函数,特别是周期性执行而执行频率很低的函数。 3、软件中断管理SWI 每个软件中断对象都对应一个函数,而且都可以单独设置优先级(0~14)。所有的软件中断都是通过DSP/BIOS内核的API调用来启动。一旦目标程序使用API调用来启动一个SWI对象,这时,系统会为该SWI函数创建一个运行的时间表。所以当一个软件中断被API调用启动后,SWI对象不一定立即执行,而是按照时间表在执行队列中根据优先级等候执行。也就是说,DSP/BIOS 内核将使用软件中断的优先级来决定是否要暂时停止现在运行的线程。需要注意的是,如果一个软件 中断在它开始运行前已经被执行了多次(这是该软件已在执行队列中),由于HWI或更高优先级的中断正在执行,这个软件中断只会运行一次,后面几次运行将被忽略。 为了便于控制,系统为每个SWI对象都设置有一个16位邮箱(mailbox)。可以利用这些邮箱的值有条件的启动这个软件中断。系统内核会自动维护邮箱的管理,如值变为0后的重新装入初始值,对邮箱值进行加减或逻辑操作等。下表给出了软件中断启动条件、调用启动的函数以及邮箱值的对应关系。 中断线程都是使用相同的堆栈来执行的。当中断发生时,新的线程会添加到栈顶,系统会执行一次系统切换。由于高优先级中断会中断低优先级中断的运行,所以SWI模块在运行高优先级中断前会先处理器中的内容。在高优先级软件中断运行完成后,寄存器的值恢复为原来的内容,以便继续执行原来的低优先级SWI中断。如果没有启动其他高优先级SWI中断 ,低优先级SWI就会运行。DSP/BIOS虽具有抢先的特点,但是如果没有导致任务切换的API函数调用,系统则不会主动切换到其他线程去执行。 SWI模块中系统提供的API函: (1)SWI_andn:该函数提供的参数与邮箱值做“与”运算,若邮箱为0,则启动该软件中断; (2)SWI_dec:邮箱值减1,若邮箱为0,则启动该软件中断,并恢复邮箱到初始值; (3)SWI_disbale:禁止软件中断; (4)SWI_enable:允许软件中断; (5)SWI_getmbox:返回邮箱的值; (6)SWI_getpri:返回邮箱优先级; (7)SWI_inc:启动该软件中断,并对邮箱值加1; (8)SWI_or:启动该软件中断,并且邮箱值与该函数提供的参数做“或”运算; (9)SWI_post:启动软件中断; (10)SWI_raisepri:将软件中断优先级升高; (11)SWI_restorepri:恢复软件中断优先级; (12)SWI_self:返回SWI对象的地址; 4.信息输出管理LOG 目标程序执行时,可使用LOG模块中的事件日志来记录实时事件。LOG模块的系统日志存储与系统事件有关的消息,这些消息应该是我们在TRC跟踪模块中激活了的事件。 我们可通过LOG_printf或者LOG_event函数,在用户日志或系统日志里添加消息。为了减少运行时间,日志数据的格式化处理总是在主机上完成,通常用LOG_printf来替代标准C的printf函数。 LOG_error将用户的错误事件信息写进系统日志。该事件不受任何RTC跟踪模块的影响。LOG_message则会把用户消息事件写进系统日志。当目标系统检测到一个错误时,可以在系统上记录该消息。这样可以方便及时的把检测到的事件和其他系统事件联系起来。 日志缓存区是在数据存储器中一段固定大小的存储空间。在日志缓存区里,一个消息占用4个字的存储空间。第一个字用来存储序号,这些序号控制日志用正确的顺序显示日志。剩下3个字记录数据,在调用API函数时写进日志。 DSP/BIOS 提供的LOG模块的API函数: LOG_disable: LOG_enable: LOG_error; LOG_event: LOG_message: LOG_printf: LOG_reset. 5.模块配置MEM MEM模块提供了对DSP目标系统的存储器管理。通过MEM模块中的说明和定义,DSP/BIOS 的配置工具会自动生成工程文件连接时使用的CMD文件。该CMD文件确定了数据、程序、堆栈存放的地址。配置文件中的MEM模块相当于一个可视化的CMD编译工具。可通过MEM管理压缩代码的大小,可通过取消动态分配能力或者清楚空白存储区来减少对存储资源的浪费。 MEM模块允许使用DSP/BIOS的应用软件调用内存管理函数,该模块提供的API函数如下: (1)MEM_alloc:动态内存分配函数; (2)MEM_calloc:动态内存分配函数,并初始化为0; (3)MEM_define:定义新的存储段;(该函数只在main()函数中使用) (4)MEM_free:释放动态申请的内存; (5)MEM_redefine:重新定义一个存储段;(该函数只在main()函数中使用) (6)MEM_stat:指定的存储段的状态; (7)MEM_valloc:将分配的存储器初始化为指定的值。 6.全局设置GBL 该模块不管理任何独立的对象,但是却可以设置许多有关整个目标系统的参数,并直接影响DSP/BIOS应用程序的代码效率和大小。 7.实时数据交换(RTDX):提供了实时、连续的DSP应用操作途径, 允许开发者在主机和DSP设备间传送数据。 RTDX模块描述: RTDX模块为两种情况提供了数据通道和函数: (1)从DSP目标系统到主机传送数据,输出(output)模式; (2)从主机到DSP目标系统发送数据,输入(input)模式。 数据通道是个全局结构体,可能输入可能输出,但不会同时既做输入又做输出。用户不必了解数据通道结构的内容,只需借助RTDX的库函数来完成通道的状态查询和输入输出。一个通道的结构有两种:开启(Enabled)或关闭(Disabled)。 RTDX模块API函数: 1)RTDX通道的宏定义说明: RTDX_CreateInputChannel:用于创建一个输入的RTDX通道; RTDX_CreateoutputChannel:用于创建一个输出的RTDX通道; 2)函数 RTDX_channelBusy:用于通道是否处于忙状态检测; RTDX_diableInput:用于禁止数据输入; RTDX_diableOutput:用于禁止数据输出; RTDX_enableOutput:用于允许数据输出; RTDX_enableinput:用于禁止数据输入; RTDX_read:用于读取主机通过RTDX发送的数据,若没有数据,将一直等待; RTDX_readNB:用于读取主机通过RTDX发送的数据,但不等待; RTDX_sizeofInput:用于读取主机通过RTDX发送的数据大小; RTDX_write:用于DSP目标系统通过RTDX向主机发送数据; RTDX_channelBusy:用于通道是否处于忙状态检测 8.STS模块 在DSP/BIOS 内核中,STS 模块提供了统计工具。用户通过STS模块全面了解中断、任务以及用户自己定义的代码段的运行时间。STS统计结果可在Statistics View窗口中显示。对于一些默认的统计对象,用户一般不需要调用STS模块提供的API函数,如PRD周期管理模块、SWI软件中断模块、PIP管道管理模块以及HWI硬件中断管理模块,但TSK任务模块需要用户调用API函数。 利用自定义的统计模块,以及相应API 函数,用户可完成以下统计功能: 一个事件发生的次数统计; 统计事件的最大值和平均值; 时间事件或监测单元的增加值。 STS模块的API函数: (1)STS_add:用提供的参数更新统计对象的累加值; (2)STS_delta:使用提供的数据与先前预置点的数据之差更新对象的累加值; (3)STS_reset:清除统计对象的累加值; (4)STS_set:保存预置点的数据 9.TRC模块 TRC模块管理着一系列统计跟踪打开或关闭的控制位。这些控制位能通过事件统计累加器完成对程序信息的实时捕捉。
|