资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二层,第三层,第四层,第五层,*,远见品质,The successs road,基于CCS的嵌入式实时系统软件开发与调试,实时调试的挑战,DSP程序常见的错误程序跑飞,死机,程序跳转不正确数据被修改指针问题、堆栈溢出,DSP实时程序的特点:与通用OS的应用程序比较(1)至少存在一个中断,即有时限(2)DSP系统是嵌入式系统,用户管理memory map。(3)数据IO程序+数据处理程序:并行,可能的硬件平台的问题给软件带来的麻烦,调试:debug调试就是通过,理解,系统,行为(,运行,),,让系统实现其正确的功能的过程。,在调试时,我们试图根除导致系统出现,未预期行为,的,根本原因,。为了理解其根本原因,我们需要,理解,系统的,运行,情况。,我们需要理解系统在做什么-不是我们认为系统应该做什么,也不是另外什么人说系统在做什么-而是系统实际上在做什么。,如果我们不理解系统,就不能指望改动系统让它完成我们想做的事情。而且,我们所做的任何改变系统行为的事情,都有破坏另外一些事情的危险;也可能因为改动而带来了更多的bug。,什么是“调试”,输入,输出,调试的过程,调试的一般过程(1)识别问题(加断点对timer计数的影响)(2)收集信息logging:(收集什么信息?造成输出错误的,直接,输入信息,逐级tracing)(3)分析收集的数据,定位bug;(4)修改bug。,可控性&可观测性:来自软件工程的概念,其中可观测性是软件、硬件调试的基石。,调试的手段,静态调试:单步执行;设置断点;观察变量;观察寄存器和存储器值;修改变量、寄存器和存储器的值;运行一段程序;,“必须掌握的基本技能”,动态调试:实时记录、观察数据;RTDX条件断点;,论述“调试”的书籍,The Science of Debugging,Matt Telles.程序调试思想与实践,中国水力水电出版社-bug 是系统逻辑的奴隶,Debugging Application,John Robbins,Microsoft Press,2000 主要针对windows程序调试中文名:应用程序调试技术,软件调试思想,:,Robert Charles Metzger,嵌入式实时系统程序的分类,简单地,可以分为(1)数据处理的程序:各种算法的实现;与硬件相对无关(2)数据传输的程序:与硬件紧密相关;,中断、DMA,:提高数据传输效率的 两种“古老”而有效的手段,两种程序的开发时间:,数据链路层次(1)CPU核,DSP的寄存器和运算单元之间的数据链路多,数据链路层次(2)DSP,片内存储器,片外存储器接口:EMIF,HPI/XBUS,DMA,中断,其它外设:时钟,串口,C6x 片内总线,A,D,InternalMemory,x32,A,D,ExternalInterface,A,D,x32,Peripherals,can perform 64-bit data loads.,C67x,Data Addr-T1 x32,Data Data-T1 x32/64,Data Addr-T2x32,Data Data-T2 x32/64,A,regs,B,regs,Program Addrx32,Program Datax256,PC,DMA Addr-Readx32,DMA Data-Readx32,DMA Addr-Writex32,DMA Data-Writex32,DMA,数据链路层次(3)板级,数据链路层次(4)板间,Compact PCI 总线,脉冲压缩板,C6701 C6701,C6701 C6701,C6202,AD预处理板,ADC C6202,ADC C6202,DSP板,并口,串口,C6202,CPU板,定,时,板,C31,某 信号处理系统框图,系统定时信号,数据链路层次(5)系统间,其实是一个雷达系统的子系统之间的数据链路。,再进一步:这个雷达系统可以组网,利用通信系统给决策单位提供信息,进行后数据处理,做出决策,总之,要对数据链路有一个清晰的各级层次的传输图,C6000的中断(1),三个概念:(1)中断源(Interrupt source):即中断事件,32个(2)中断选择号(Interrupt Selection Number):5bit(3)中断(Interrupt):12个可屏蔽NMI(No.1)+RESET(No.0)RTDX(No.3),中断寄存器的设置:中断源通过中断选择子(Interrupt Selector)“映射”到CPU的中断上,并可通过外中断极性设置寄存器设置EXT_INT4,EXT_INT7的中断极性(即中断地触发时刻),C6000的中断(2),中断服务程序:map1:IDRAM 0 x0000 x200 0 x200=16*32;16个中断,每个中断的8条指令;,二次跳转:中断服务程序的任务实现超过8条指令时,跳转到真正处理中断的子程序,_INT4:.asg 4,vec,stw .d2 b0,*-b15,|mvk (_isr_jump_table+vec*4),b0,mvkh (_isr_jump_table+vec*4),b0,ldw .d2 *b0,b0,nop 4,b .s2 b0,|ldw .d2 *b15+,b0,nop 5,C6000的中断(3),二次跳转的实现:(1)中断跳转表:isr_jump_table 全局变量(2)“挂”中断:void intr_hook(void(*fp)(void),int cpu_intr);,来源:tic6000evm6xdsp 库函数,头文件,源文件v1.2 有;v2.0 只含头文件,C6000的中断(4),中断嵌套,进入中断后,GIE0允许中断嵌套的设置,中断重入,打乱时序关系,应该尽量避免,IRPBak=GET_REG(IRP);CSRBak=GET_REG(CSR);IERBak=GET_REG(IER);INTR_DISABLE(CPU_INT6);INTR_GLOBAL_ENABLE();.INTR_CLR_FLAG(CPU_INT6);,INTR_GLOBAL_DISABLE();,SET_REG(IRP,IRPBak);,SET_REG(CSR,CSRBak);,SET_REG(IER,IERBak);,写C6000中断程序,一般来讲,嵌入式系统是中断驱动的系统,另外还有数据流驱动的嵌入式系统(Windows:事件驱动)典型的结构:main函数中初始化,While循环等待中断到来,在中断处理程序中进行真正的数据处理,中断之间的关系:同步关系:中断的触发次数成比例异步关系:。因果关系:一个中断触发其他中断,可看作是同步关系中的一种特例,基于以上关系的中断间的,数据共享模式,:乒乓模式:采数中断处理中断,同步中断关系圆周buffer:串口中断处理中断,异步中断关系共享memory:传数中断DMA结束中断,因果关系,C6000的DMA(1),C6000的DMA控制器在CPU结构中的位置,确定DMA的数据链路:编程时考虑效率XB,PBC,EMIF,DMC,PMC*其中和PMC的连接是单向的,只能向程序存储空间写入,(723数采例子,软硬件bug定位),4个DMA通道1个辅助DMA(HPI/XB)C6711/C6211/C64XX,16 EDMA通道,复杂的传输模式:满足不同的数据传输应用单通道分割,多帧传输,自动初始化,传输完毕后触发中断.,C6000的DMA(2),由于DMAC的位置,某些存储区之间的数据搬移要通过中间的buffer(一般为IDRAM)实现,否则时间消耗大。如双口和SBSRAM的数据传输,2次DMA的时间小于一次直接DMA的时间;2次DMA传输中的第二次传输的启动一般是靠第一次DMA完成后产生的软件中断触发的,用DMA实现MemoryCopy和MemorySet;片内的MemorySet可以有更快的方法,优化,DMA的优先级:可设,但默认DMA0最高如果高优先级DMA启动时,低优先级DMA没有完成时,要将低优先级DMA的操作挂起,等完成高优先级DMA后,继续完成。所以系统中有几个DMA同时发生时,要根据,数据的重要性,和,数据传输处理的顺序,选择合适的DMA通道。,DMAC通用管脚在调试中的使用:发光二极管,C6000的Timer,DSP时间的最细刻度:主频,利用时钟(中断)为系统提供的各种时间,起到计时器的作用中断发生的间隔时间可设:1ms计算时间间隔精度:1us,利用计时器防止等待超时,TIMER测试程序时间的两种方法:中断法;直接计数法(无中断开销)。,一个AD板的例子,Q路视频信号,双口中断,内PRT中断,AD_I,AD_Q,I路视频信号,EPLD,+,FIFO,开关网络,C6202_1,C6202_2,控制信号,256K*32bit,SBSRAM,256K*32bit,SBSRAM,16K*32bit双口RAM,16K*32bit双口RAM,VTIDP中断,GRIDP中断,外PRT 中断,双口中断,C,P,C,I,总线,图1 AD板硬件简要框图,清FIFO信号,AD板的中断小结,调试经验1,可中断程序的编写:应用条件-核循环的并行指令数不小于6,SPRA534,Writing Interruptible Looped Code For The TMS320C6x,调试中数据的存储和显示:系统级调试 中的,重要性,CCS的显示工具,Matlab,定点DSP实现浮点运算的考虑,调试经验2,一次新增的调试代码不能过长:,便于新的,bug,定位,防御式编程:,例:,723解模糊程序边界条件,对感兴趣的事件做记录:,放到片外,ram;,某些计数记录在,halt,运行后更新时可能有/1的误差,CCS,添加断点的注意:,run,前,,running,中,if(,Cnt,1000),nop,_debug();,audio,例子运行时,设置断点的现象,窗口刷新的影响:,application,的非实时,随时关心程序运行时间:,使用,timer,测量时间,中断法/非中断法,注意数组的越界和指针的使用:,中断向量表被修改,程序就会跑飞,调试经验3,关于全局变量和局部变量:,bug,例:,723,程序,,MTD,子函数设置256字的大数组,修改中断向量表,volatile,关键字:,其它任务中可能修改,const,关键字:,编译器保证数据不被修改,但是运行时用指针可以修改;没有用?!,关于中断嵌套,观察中断间的同步关系,程序跑飞:,不要惧怕程序“死了”、“跑飞”,,万事皆有原因,;对,编程环境,的基础知识熟悉 程序跑飞绝大多数是中断向量表被修改,“快”与“慢”,“大”与“小”:,调试经验4,选择高级的优化不会造成程序错误,如果有错误,是自己程序的问题。,(例:最初接dqy的 DSP板 程序,局部变量-全局变量,堆栈),设计小实验进行某些验证:,语法,设想。例子:PM数据改变,怀疑硬件问题,结果设计DMA改写PM,不排除软件的bug;培养工程动手能力,想一想-试一试,,Far型数据:truncated错误,CCS不支持中文目录,节拍,节拍,节拍,:处理帧、时间粒度,改变某部分后出了问题,就是改的部分有bug:,调试经验5,Restart,go main跑飞和reload,go main跑飞的原因:(1)GIE为1和IER的某些位为1(2)发生了某些中断或IFR某些位为1(3)中断向量表未初始化。要运行run time load 后才初始化。发生中断后,读取中断向量表的值是乱数。,(联系那个 设置大数组的 调试例子),中断处理的超时错误计数器在停止(halt命令)后加1JTAG对实时时序的影响,调试小结,应用工程师:实现层次程序员在调试时,医生,与,警察,未能实现功能,观察现象(错误的结果),注重相关的基础知识的掌握:编程环境,错误结果,原因,并非一目了然,正确结果,定位,监测,记录,改正,往往不难,实现,硬 软,硬件
展开阅读全文