•TI实时操作系统DSP/BIOS刘鑫茂2009.72009.72009.72009.7@@@@宁波QQ:273200351QQ群:47138806author:LiuXinmaoauthor:LiuXinmao概述•DSP/BIOS是TIDSP的嵌入式实时操作系统,性能很好,方便实用,但是国内用的却很少。可能有两点原因:•一、一般的超循环程序也能够满足需求。•二、操作系统门槛高,不敢涉足。author:LiuXinmaoauthor:LiuXinmao关于上述两点问题的个人看法•我也同样认为超循环程序可以解决大部分项目中的软件需求,但是在实时性要求严格的项目中,能否在规定的时间内完成任务的切换?(即超循环软件中的功能函数切换),没有操作系统支持这点是非常难做到的。另外由操作系统管理任务,程序更加清晰,层次更加分明。•关于第二点,我要告诉大家的是DSP/BIOS没有想象中的那么复杂,即使不懂操作系统原理也同样能够掌握。author:LiuXinmaoauthor:LiuXinmao关于本PPT本文档仅为BIOS入门篇•我相信大家只要认真阅读本文档,就能够认识BIOS,踏入实时操作系统开发的门槛(过了这扇门,一切就会海阔天空)。•并能够一般使用BIOS进行开发(常用的操作系统API,下文中进行了详细介绍,大部分项目中这些API就够用了(没有介绍API建议大家将来深入学习BIOS的时候再去理解)author:LiuXinmaoauthor:LiuXinmaoDSP/BIOSDSP/BIOSDSP/BIOSDSP/BIOS的功能uDSP/BIOSDSP/BIOSDSP/BIOSDSP/BIOS是CCSCCSCCSCCS提供的一套工具,是一个尺寸可伸缩的实时内核,它是为了那些需要实时线程调度与同步、主机与目标DSPDSPDSPDSP间通信或者实时监测的应用而设计的。uDSP/BIOSDSP/BIOSDSP/BIOSDSP/BIOS提供了抢占式多线程、硬件抽象、实时分析和配置工具。author:LiuXinmaoauthor:LiuXinmao任务调度抢占式RTOS任务切换示意图,永远保证优先级最高的立即执行。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具静态配置工具如左图所示:系统配置(System)分析工具(Instrumentation)任务调度(Scheduling)任务同步(Synchronization)输入输出(Input/Output)§重点掌握前四个author:LiuXinmaoauthor:LiuXinmaoDSP/BIOSDSP/BIOSDSP/BIOSDSP/BIOS配置分为图形方式和文本方式经常需要两种方式结合起来使用配置文件编译出错的时候,从文本方式下查找错误更容易author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具author:LiuXinmaoauthor:LiuXinmaoMEM模块uMEM模块:用于定义目标系统的内存使用。系统根据此信息自动产生.cmd文件author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具根据芯片RAM和FLASH的实际情况细分存储器段,如果不清楚就找个例子照抄。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具先保持默认状态,如果编译到过程中出现存储器段空间不足的情况,可以修改代码段到其他存储器段。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具author:LiuXinmaoauthor:LiuXinmao分析工具uLOG模块:用于事件的记录显示。例如,你可以通过该API输出调试信息。uSTS模块:统计对象可以实时捕获任意变量的计数、最大值和总和等统计数据。author:LiuXinmaoauthor:LiuXinmao常用LOG模块API示意代码:author:LiuXinmaoauthor:LiuXinmaoLOG模块API浏览一下就行,只需要把常用的掌握就可以了。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具author:LiuXinmaoauthor:LiuXinmao时钟(CLK)函数uCLK函数:该类函数按照片上定时器中断的频率被触发执行。默认情况下,这些函数由硬件定时器中断触发,并在与定时器对应的HWI函数的环境中执行。CLK模块:用于片上的定时器管理,设置定时器中断的间隔时间。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具1000微秒触发产生一次系统时钟中断author:LiuXinmaoauthor:LiuXinmao周期(PRD)函数u该函数的触发周期基于片上定时器中断周期的倍数或其他事件发生的周期的倍数,周期函数是一种特殊的软件中断。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具通过对象属性对话框与源代码建立调用关系,只需要在对话框function中添加.c源文件中的函数名(函数名前面需要加一个下划线)输入周期函数的调用周期(tick单位)这里可以看到周期大小(ms单位)author:LiuXinmaoauthor:LiuXinmao周期函数举例源代码在.c源文件中添加个对应函数名的函数。author:LiuXinmaoauthor:LiuXinmao硬件中断u硬件中断:用于响应外部异步事件。当一个硬件中断被触发后,一个HWI函数(也被称为中断服务程序或ISR)会被执行来完成一个有严格时间限制的关键作业。HWI函数十DSP/BIOS应用程序中优先级最高的一类线程。author:LiuXinmaoauthor:LiuXinmao硬件中断u在DSP/BIOS配置工具中为每一个硬件中断建立了HWI对象。u使用HWI管理器,可以配置每个硬件中断的ISR(中断服务函数)。在HWI对象的属性页中输入ISR的函数名即可。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具PIE中断author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具输入函数名一定要勾选UseDispatcherauthor:LiuXinmaoauthor:LiuXinmao硬件中断服务程序举例源代码在.c源文件中添加个对应函数名的函数。author:LiuXinmaoauthor:LiuXinmaoHWI模块-注意事项u一个中断抢占另外一个中断时,这个中断要保存和恢复它修改的寄存器。使用HWI_enter和HWI_exit保存和恢复寄存器。uHWI_enter/HWI_exit还保证SWI和TSK管理器在合适的时候被调用。u使用HWIdispatcher,就把C写的HWI函数放到HWI_enter/HWI_exit宏对中。所以使用HWIdispatcher后,不能再调用HWI_enter/HWI_exit,否会导致系统崩溃。author:LiuXinmaoauthor:LiuXinmaoHWI模块-注意事项HWI_unused,该字符串在配置中用来标记未使用的HWI对象。author:LiuXinmaoauthor:LiuXinmao软件中断u软件中断:通过在程序中调用SWIAPI函数而触发的。软件中断提供了一个介于HWI和TSK之间的额外的优先级,用于处理那些时间限制比TSK严格,但是比HWI宽松的作业。HWI线程和SWI线程都会一直运行到完成。软件中断应该用于处理那些执行时限为100μs或更长时限的应用程序作业。SWI使得HWI可以将一些不太关键的处理委托给一个优先级比它低的SWI线程,从而减少CPU在中断服务程序中花费的时间,使其他的HWI可以得到运行。uSWI模块:用于管理软件中断。CCS将运行队列中的软件中断,并可以设置15个优先级,但都比硬件中断低。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具输入函数名SWI邮箱在这里,SWI邮箱和消息邮箱是两码事author:LiuXinmaoauthor:LiuXinmao软件中断服务程序举例源代码在.c源文件中添加个对应函数名的函数。author:LiuXinmaoauthor:LiuXinmao软件中断uSWI的触发是编程实现的,有五个函数(SWIAPI)可以触发软件中断:SWI_andn,SWI_dec,SWI_inc,SWI_or,SWI_postu一个软件中断会一直执行到完毕(没有挂起状态),除非被硬件中断或更高级别的软件中断抢占。author:LiuXinmaoauthor:LiuXinmao软件中断2000系列SWI邮箱是16位,(6000系列SWI邮箱是32位)author:LiuXinmaoauthor:LiuXinmao软件中断常用APISWIAPI调用示意:author:LiuXinmaoauthor:LiuXinmaoSWI邮箱值的变化过程。author:LiuXinmaoauthor:LiuXinmao软件中断常用APISWIAPI调用示意:author:LiuXinmaoauthor:LiuXinmao软件中断常用APISWIAPI调用示意:author:LiuXinmaoauthor:LiuXinmao软件中断利用SWI邮箱实现同步。邮箱值为0的时候才触发软中断1次,触发软中断后,邮箱值复位。输入函数名输入邮箱复位值author:LiuXinmaoauthor:LiuXinmaoauthor:LiuXinmaoauthor:LiuXinmao任务u任务的优先级高于后台线程IDL而低于软件中断SWI。任务与软件中断的不同之处在于任务在运行过程中可以等待(阻塞),直到所需的资源可用。DSP/BIOS提供了许多任务间同步和通信的结构体,如队列、信号量和邮箱。u任务通常写成一个死循环的形式,只执行一次的任务意义不大。author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具author:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具author:LiuXinmaoauthor:LiuXinmao任务程序举例源代码在.c源文件中添加个对应函数名的函数。author:LiuXinmaoauthor:LiuXinmaoTSK常用APITSKAPI调用示意:author:LiuXinmaoauthor:LiuXinmaoTSK模块常用APITSKAPI调用示意:author:LiuXinmaoauthor:LiuXinmaoTSK模块APIauthor:LiuXinmaoauthor:LiuXinmaoBIOSAPIauthor:LiuXinmaoauthor:LiuXinmaoBIOS静态配置工具author:LiuXinmaoauthor:LiuXinmao信号量u信号量分为二进制信号量和计数信号量,常用于协助一组相互竞争的任务来访问共享资源。可以实现任务同步和互斥。u二进制信号量只有两种状态:可用和不可用。u计数信号量对象有一个内部计数器,计数器对应有效的资源数,如果计数值大于0,则任务在请求该信号量时不会被阻塞。author:LiuXinmaoauthor:LiuXinmaoSEM模块常用API函数SEM_pendSEM_pendSEM_pendSEM_pend用于等待一个信号量,如果信号量大于0000,则SEM_pendSEM_pendSEM_pendSEM_pend简单地将其计数值减1111并返回,否则SEM_pendSEM_pendSEM_pendSEM_pend等待SEM_postSEM_postSEM_postSEM_post来发布该信号量。超时参数timeouttimeouttimeout