DSP

DSP多线程

2019-07-13 11:09发布

  关于DSP多线程技术问题的认识 为了让DSP能够同时处理多个任务,DSP/BIOS提供了如下几种类型的线程。
HWI(硬件中断),SWI(软件中断),TSK(任务),IDL(空闲线程)。
HWI其实就是中断服务。当硬件中断产生之后,DSP/BIOS就会调用相应的HWI函数。如果把HWI设置为Dispatch的话,则会在调用HWI函数的前后自动调用HWI_enter和HWI_exit。在HWI函数的执行时,若有其他的硬件中断产生,当前的HWI会被新的中断抢占,也就是说DSP会先去执行新的HWI。如果希望当前的HWI在不被其他的HWI打断的话,可以在不能被打断的代码前后调用HWI_disable和HWI_enable。HWI的优先级是硬件级别的优先级(固定的),若同时有多个中断向DSP请求的话,它决定DSP先响应哪个中断。而中断所对应的HWI则是可以被任何其他的HWI抢占。
SWI有15级优先级,高优先级的SWI可以抢占低优先级的SWI。一般通过SWI_post(或者类似的函数)来启动它。SWI和HWI一样都是不能被阻塞(blocking)的线程。也就是说一旦它们被运行,就要运行到终点为止,除非被其它的线程抢占。
HWI和SWI都使用系统堆栈,而每个TSK都有自己的堆栈。可以在TSK线程之间随意地互相切换,切换时DSP/BIOS将自动地更新堆栈寄存器,因此TSK线程可以被阻塞。这样TSK就可以写成一个死循环:
While(1){
   Do_some_task();
   Yield_to_other_task();
}
Do_some_task做这个TSK所要做的事情,Yield_to_other_task则把控制权转给其他的TSK。例如如果是把控制权转给同样优先级的其他TSK,则可以调用TSK_yield函数。如果是要把控制权转给低优先级的TSK,则可以调用TSK_sleep函数让自己休眠一段时间,或者调用SEM_pend函数等待。除非TSK中调用了HWI_disable或者SWI_disable,否则它在任何时候都可以被HWI或者SWI抢占。
TSK和电脑上的线程有些类似,而HWI和SWI则不一样。下面举一个例子说明一下:假设有线程SWI1,SWI2,TSK1,TSK2。SWI1的优先级大于SWI2,TSK1的优先级大于TSK2。
则:
若在SWI2运行当中,SWI1被post了的话,DSP马上转到SWI1运行,并且直到SWI1运行结束之后再继续SWI2的运行。这就是说SWI只能被抢占,不能被阻塞。这是因为所有的SWI和HWI都公用系统堆栈,一旦SWI1运行,堆栈的最上层就变成了SWI1的环境,除非SWI1运行结束,是无法切换回到SWI2的环境中去的。
若在TSK2运行当中,TSK1进入ready状态的话,DSP马上转到TSK1运行。稍后如果TSK1被阻塞的话,DSP再继续TSK2运行,当TSK1所等待的信号就绪之后,再转入TSK1运行,如此反复。也就是说DSP可以在TSK之间相互切换。这正是因为每个TSK都有自己独立的堆栈可以保存自己的运行环境。 关于CMD与gel文件设置问题 .cmd文件是链接命令文件 .gel文件:利用GEL(通用扩展语言)函数可以进行编译,链接和运行DSP应用程序;使用GEL函数可以控制仿真或者实际目标板的状态,访问仿真或者实际目标板存储器,并在输出窗口中显示结果。 memory 是启动ccs时由gel文件设置,可以在菜单中更改。   一般的load program时出现 “file:  c:\ti\myprojects\test\debug\test.out: Load failed.A section of your program falls into a memory region that is not writable.check your linker configuration and/or memory map.” 的提示,是由于自己定义的.cmd文件里指定的存储空间不一定和memory map中相匹配,应该在gel文件里加以修改.   c6000编程设计思路 1)TI C编程很类似标准C语言编程,需要掌握很多TI公司提供的API函数才能更好的使用。对于底层寄存器的控制,不需要直接对控制寄存器操作,而是采用相应的API函数操作即可。这类API函数叫做CSL(chip support library), 2).在C6000中式不可能用汇编编写大型程序的;如果采用DSP/BIOS这种RTOS,只能采用C来写主要程序。如果采用了DSP/BIOS+RF5+TCP/IP这种架构,需要个人编写的程序一般只占总程序量的四分之一或者更少。 3).直接用DSP6000的汇编编程是非常困难的,这就像在WINDOWSXP环境下用8086汇编编写一个复杂的可视化程序一样不切实际。但是在编写DSP C6000的bootload程序时往往采用汇编程序来编写,作为引导程序代码少,执行效率更高。