《基于TS101的嵌入式实时操纵系统设计.docx》由会员分享,可在线阅读,更多相关《基于TS101的嵌入式实时操纵系统设计.docx(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、基于TS101的嵌入式实时操纵系统设计caojing导语:随着半导体制造工艺的开展和计算机体系构造的改良,DSP处理芯片的处理才能越来越强大,控制的外围设备越来越多,软件算法也越来越复杂。随着半导体制造工艺的开展和计算机体系构造的改良,DSP处理芯片的处理才能越来越强大,控制的外围设备越来越多,软件算法也越来越复杂。对于DSP系统的软件开发,不仅要面对复杂的软件算法,同时还要把大局部精力放在各种外围设备和相关的硬件控制上,整个经过复杂而艰辛。因此,为这一类系统开发小巧精致、便于移植的嵌入式实时操纵系统,具有实际的意义。本文参考开放源代码实时操纵系统uCOS-II,完成了基于ADI公司的ADSP
2、-TigerSHARC101S以下简称TS101系列DSP芯片的嵌入式实时操纵系统的设计和开发工作。1TS101芯片简介TS101是美国ADI公司消费的一款高性能静态超标量处理器。ADSP-TS101S的内核指令周期为3.3ns,每周期可以执行4条指令、24个16-bit定点运算和6个浮点运算。内部有三条互相独立的128bit宽度的内部数据总线,每条总线各连接一个2MB内部存储器阵列,可提供4个字的数据、指令及IO访问,以及14.4Gbytess的内部存储器带宽。在ADSP-TS101内部的双运算模块中,每个均包含一个ALU、乘法器、64-bit移位器和32个字的存放器组及相关的数据对齐缓冲器
3、DAB。芯片中的双整数ALUIALU均有自己的31个字的存放器组以用于数据寻址。此外,TS101中还带有一个带指令对齐缓冲器IAB,以及分支目的缓冲器BTB和中断控制器的程序控制器,同时有三条互相独立的128bit宽度的内部数据总线以及片内6MBSRAM;TS101提供有与主机处理器、多处理器空间DSP、外部SRAM和SDRAM相连的外部端口和一个14通道DMA控制器、四个链路口、两个64bit问隔定时器和定时器计满引脚。芯片上一个与IEEE1149.1兼容的JTAG接口可用于片上仿真。2基于TS101的嵌入式实时操纵系统功能本文介绍的基于TS101的嵌入式操纵系统是参考源码公开的实时操纵系统
4、uCOS-II来设计的,实际上,它和uCOS-II一样,仅仅是一个实时内核,而不具有像GUI、TCPIP协议栈等功能部件。它支持占先式多任务调度,并可提供有效的效劳如信号量、邮箱、队列、延时、超时等。同时,在uCOS-II根底上可引入高级操纵系统中的进程和线程等概念。因此,本没计采用了进程与线程结合的方式,即将实现不同功能的任务视为进程,然后在任务内部进展细分,以划分为不同的线程。进程间的调度与切换在TS101内部存储区和外部扩展存储区例如SDRAM中进展,而线程间的调度与切换那么在TS101内部存储区中实现。从本设计的整个TS101嵌入式实时系统来看,它的根本功能主要包括任务治理、中断治理、
5、内存治理三方面内容。在TS101嵌入式实时系统的三大块功能中,任务治理功能模块根本上是uCOS-II的简单移植,本文主要针对中断处理和存储器治理两大局部进展设计讲明。3TS101的中断处理TS101的中断处理包括硬件中断和软件中断两大类,其中软件中断又包括软件异常中断和Debug中断。3.1硬件中断TS101处理器不需要专门的堆栈指针来保存现场,器件中IALU的J、K存放器都可以用作堆栈指针。在允许嵌套中断的中断效劳程序中,可将中断返回地址即RETIB值保存到堆栈中,这样,在从RETIB读出返回地址后,系统将自动开启全局中断使能。但在保存相关的存放器和RETI时本应制止全局中断使能,所以这是在
6、程序控制器将PC写入RETI时自动完成。假如系统不支持嵌套的硬件中断,那么无需把处理器状态保存在堆栈中。中断一般根据存放器RETI执行并在中断后返回,而不需要再对硬件中断的全局制止位进展处理。3.2软件中断异常异常软件中断是在程序执行的经过中触发的。使能异常中断时,可将PMASK62置位,并将PC存储于RETS;而对于仿真异常,那么将PMASK63置位,PC存储于DBUG中。当异常中断出现时,程序控制器将从存放器IVSW指向的地址取址,仿真异常那么从EMUIR存放器取址,同时将指令流水的指令清空。3.3中断返回中断返回是通过在中断效劳程序中执行RTI指令来实现的。当然,这要求在响应中断效劳程序
7、时就将返回的地址保存在该存放器中。通常要求至少在执行该指令前的8个指令周期就将返回地址放入在存放器RETIB中,这样,分支缓冲BTB才能使用。4操纵系统中断处理的实现在本操纵系统中,对于用户中断效劳程序的处理经过,其示意代码和功能如表1所列。事实上,用户应首先将处理器的存放器压人当前堆栈程序列表1中的1。在进展中断处理时,操纵系统需要知道用户在做中断效劳,因此,用户应该调用OS_Int_Enter_C将全局变量OSIntNesting程序列表1中的2直接加1。完成上述两步以后,用户就可以开场效劳于引发中断的设备了程序列表1中的3。由于该操纵系统允许中断嵌套,而且系统能跟踪嵌套层数OS-IntN
8、esting。然而,为允许中断嵌套,在多数情况下,用户应在开中断之前先清中断源。调用脱离中断函数OS_Int_Exit_C程序列表1中的4标志着中断效劳子程序的终结,同时OSIntExit会将中断嵌套层数计数器减l。当嵌套计数器减到零时,所有中断,包括嵌套的中断便都完成了。此时操纵系统要断定有没有优先级较高的任务被中断效劳子程序或者任一嵌套的中断唤醒。假如有高优先级的任务进入了停当态,系统那么返回到那个高优先级的任务,OS_Int_Exit_C返回到调用点程序列表1中的5。保存的存放器的值将在这时被恢复,然后在去执行中断返回指令程序列表1中的6。应当留意的是,假如调度被制止OSIntNesti
9、ng0,系统将返回到被中断的任务。以上描绘的具体解释如图1所示。图中,有时中断来到了图11,但还不能被处理器识别,这也许是由于中断被操纵系统或者用户应用程序关了,或是由于处理器还没执行完当前的指令。一旦处理器响应了这个中断图12,处理器的中断向量将跳转到中断效劳子程序图13。中断效劳子程序在处理器存放器也叫做CPUcontext图14中一旦保存完毕,用户中断效劳子程序将通知操纵系统进入中断效劳子程序,方法是通过调用OS_Int_Enter_C给OS-IntNesting加1图15。然后用户中断效劳代码开场执行图16。应当留意的是,用户中断效劳中做的事要尽可能地少,而把大局部工作留给任务去做。用
10、户中断效劳完成以后,要调用OS_Int_Exit_C图17。从时序图上可以看出,对被中断的任务来讲,假如没有高优先级的任务被中断效劳子程序激活而进入停当态,OS_Int_Exit_C只占用很短的运行时间。在这种情况下,CPU存放器只是简单地恢复图18并执行中断返回指令图19。而假如中断效劳子程序使一个高优先级的任务进入了停当态,那么OS_Int_Exit_C将占用较长的运行时间,由于这时要进展任务切换图110。新任务的存放器内容要恢复并执行中断返回指令图112。5存储器治理在TS101的C环境下,可将内存划分为代码区code、数据区data、堆heap区和栈stack区。代码区用来存放用户代码
11、,数据区用来存放全局变量和静态变量等数据,栈区用来存放临时变量等数据,堆区用来为用户提供动态内存分配。在编译器的链接描绘文件LinkerDescriptonFile.LDF中,可以手动划分各个内存分区的大小。在TS101所提供的库函数中已经包含了比拟完备的内存治理函数如常用的calloc,free,malloc和realloc等函数,可用于对内存进展根本治理。在对操纵系统进展设计的经过中,应将重心放在内存的扩展上,以便有效地使用外部存储器例如SDRAM等。为了实现内存扩展,本设计将一个大型任务看作一个进程,再将一个进程划分为不同的小线程。在系统的外部存储器中可以存放多个进程,而每次只将一个读人
12、到内存中来运行。操纵系统的主要治理对象是这个进程所划分的多个线程。这样,在一个系统中就可以运行多个进程,它们之间可以由程序进展由内存到外存或者由外存到内存的切换控制,但在切换经过中需要花费一些时间代价。5.1外部存储器堆区的使用TS101为用户提供了堆区,并提供有calloc、malloc、realloc和free等函数来对其进展治理和使用,同时用户可以通过手动修改链接描绘文件以获得相对较大的堆区。然而,在默认情况下,用户所能使用的只是链接描绘文件中所提供的那一块堆区,这对用户来讲是远远不够的。假如用户在外部存储器上也可以像在内存中一样动态的开拓存储空间来进展使用,那将会带来极大的方便。幸运的
13、是,TS101的编译系统提供了这一功能,用户只需要对系统提供的名为“ts_hdr.asm的汇编文件和链接描绘文件进展修改并编译“ts_hdr.asm文件,再用生成的“ts_hdr.doj文件代替链接描绘文件中的“ts_hdr_TS101即可。以下将对文件的修改正程做扼要的介绍。下面是TS101链接描绘文件中对于默认堆区的描绘,它定义了默认堆区的基址和堆区的大小:在“ts_hdr.asmii汇编文件中可对默认堆区进展操纵,它的主要功能是为默认堆区规定ID号0,以便有新的堆区存在时方便使用。ts_hdr.asm对默认堆栈进展编号的代码:var=1df_defheap_base;var=1df_de
14、fheap_size;var=0;对链接描绘文件和汇编文件进展修改时,只需要在链接描绘文件中对新的堆区进展描绘并在汇编文件中对其进展编号即可。代码如下:对新的堆栈区进展描绘的代码可开拓于外部存储器之中SDRAM。并在新的堆栈中将其编号为1。按照以上步骤将文件修改完毕之后,用户就可以在外部存储区中动态地使用内存了。编译器还为动态内存的开拓提供了一系列的库函数。其详细程序还在内部存储器中的默认堆区动态开拓了大小为50的内存61,并在外部存储区中动态开拓了大小为256的内存62。其程序如下:intx,y;x=heap_malloc0,50;1y=heap_malloc1,256;25.2内存覆盖通过
15、TS101可将数目极大的程序代码放入外部存储器中。每次通过DMA传输方式读入少量的程序代码到内存来执行,这样既扩展了内存空间。又比将全部代码放入外部存储器节省时间,这种方式称为内存覆盖overlay。内存覆盖是一种多对一的内存映射技术,它可将多段代码存储在外部存储器规定的不同位置,但也可以在内存中的同一位置运行。代码在外部存储器的存储区称为“live区,在内存中的运行区称为“run区。图2所示是overlay的使用构造图。由图可见,在外部存储器中,overlay1和overlay2可在内存中的同一区域中运行,而overlay3和overlay4也可以在内存的同一区域中运行。当主函数调用FUNC
16、_B时,overlay2将被换入内存中运行,而当主函数调用FUNC_A时,再用overlay1置换over-lay2,overlay3和overlay4的使用与overlay1和over-lay2一样。代码在内存与外存之间的置换主要通过DMA传输来实现。内存覆盖治理器是用户编写的用来将函数或者数据载入内存的子程序,它们与链接器提供的PLIT指令配合使用可完成内存覆盖操纵。内存覆盖治理器除了负责由外部存储器向内存的载入操纵外,还应当负责建立堆栈保存存放器的值,检查需要调用的函数是否已经在内存之中,以及利用DMA操纵在其它函数执行时运行内存覆盖载入。通过链接描绘文件可对内存覆盖进展辅助操纵。此操纵
17、需定义OVLY_one和OVLY_two两块overlay代码,其中OVLY_one包含函数FUNC_A.doj,而OVLY_two包含FUNC_B.doj和FUNC_C.doj,它们共同在MOCode的同一内存区域运行。在链接描绘文件中对overlay进展操纵的程序代码如下:在链接描绘文件中,还可以通过定义PLIT指令来协助内存覆盖操纵的完成。当主函数调用一个内存覆盖区的函数时,链接器将重新引导函数调用并进展操纵。例如当主函数调用了内存覆盖函数FUNC_A时,链接器会将其自动转化为调用.plt_FUNC_A操纵。此操纵在函数执行之前先进展PLIT操纵,并跳转到overlay治理器中执行,然后
18、再执行函数A。下面是对PLIT进展操纵的定义代码:5.3内存扩展的实现操纵系统提供了OS_Process_Sched函数来完成这一操纵,该函数中的进程切换函数顺序代码如下:1将处于在内存中的进程的存放器值压入堆栈;2将处于内存中的进程的全部存储区内容由DMA方式放入外存:3调用在外存中的进程的存放器出栈函数;4跳转到新的进程运行。在进程调度中,一般首先将所有存放器值压入当前进程堆栈中进展保存顺序代码1,然后将内存进程存储区中的所有内容放入外部存储器中保存,以便当该进程重新进入内存运行时可以完全恢复原有运行环境顺序代码2。这里的所有内容是指与当前进程有关的数据,包括进程的堆栈、进程的全局变量、进
19、程动态申请的内存块等等。调用外部存储器中的进程存放器出栈函数顺序代码3主要是利用前面所述的内存覆盖技术来进展的,该存放器的出栈函数一般放在外部存储器中,操纵时可通过调用它使链接器跳转到内存覆盖治理器来完成外部存储器进程向内存的加载。但在这里要对内存覆盖治理器进展修改,并添加外部存储器中进程的全部数据的载入函数,然后,程序才能跳转到新的进程中开场运行顺序代码4。6完毕语本文在对嵌入式实时操纵系统进展研究的根底上,完成了基于TS101DSP芯片的嵌入式实时操纵系统的设计。所设计的系统体系构造主要参考的是开放源代码的实时操纵系统uCOS_II,并在此根底上,根据芯片本身的特点和实际应用的需要进展了创新和重设计,这主要表达在以下三方面:1结合TS101芯片的特点,实现了中断处理局部的设计;2放弃了一般操纵系统对内存采取每一任务分配一块内存的方法,而是采用对内存进展分块治理,并采取所有任务公用同一块内存。对同一内存统一治理的方式;3根据实际系统需要研究,并实现了内存覆盖技术,扩展了系统的存储空间。当然,任何嵌入式操纵系统的设计都有一个简单到具体的经过,需要逐步完善。本文只是完成了TS101嵌入式实时操纵系统根本功能的实现。相信经过长期的实际模拟运行,定能建立起功能更加完善、构造更加稳固可靠的嵌入式实时操纵系统。0
限制150内