基于CCS的嵌入式软件开发与调试(已套模板)_第1页
基于CCS的嵌入式软件开发与调试(已套模板)_第2页
基于CCS的嵌入式软件开发与调试(已套模板)_第3页
基于CCS的嵌入式软件开发与调试(已套模板)_第4页
基于CCS的嵌入式软件开发与调试(已套模板)_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Thesuccess'sroad基于CCS的

嵌入式实时系统

软件开发与调试实时调试的挑战DSP程序常见的错误

程序跑飞,死机程序跳转不正确

数据被修改指针问题、堆栈溢出DSP实时程序的特点:与通用OS的应用程序比较

(1)至少存在一个中断,即有时限

(2)DSP系统是嵌入式系统,用户管理memorymap。

(3)数据IO程序+数据处理程序:并行可能的硬件平台的问题给软件带来的麻烦调试:debug

调试就是通过理解系统行为(运行),让系统实现其正确的功能的过程。在调试时,我们试图根除导致系统出现未预期行为的根本原因。为了理解其根本原因,我们需要理解系统的运行情况。我们需要理解系统在做什么----不是我们认为系统应该做什么,也不是另外什么人说系统在做什么----而是系统实际上在做什么。如果我们不理解系统,就不能指望改动系统让它完成我们想做的事情。而且,我们所做的任何改变系统行为的事情,都有破坏另外一些事情的危险;也可能因为改动而带来了更多的bug。什么是“调试”输入输出×调试的过程调试的一般过程

(1)识别问题(加断点对timer计数的影响)

(2)收集信息logging:(收集什么信息?造成输出错误的直接输入信息,逐级tracing)

(3)分析收集的数据,定位bug;

(4)修改bug。可控性&可观测性:来自软件工程的概念,其中可观测性是软件、硬件调试的基石。调试的手段静态调试:

单步执行;设置断点;

观察变量;观察寄存器和存储器值;

修改变量、寄存器和存储器的值;

运行一段程序;

“必须掌握的基本技能”动态调试:

实时记录、观察数据;RTDX

条件断点;论述“调试”的书籍TheScienceofDebugging,MattTelles.

程序调试思想与实践,中国水力水电出版社

---bug是系统逻辑的奴隶DebuggingApplication,JohnRobbins,

MicrosoftPress,2000

主要针对windows程序调试

中文名:应用程序调试技术软件调试思想

:RobertCharlesMetzger嵌入式实时系统程序的分类简单地,可以分为

(1)数据处理的程序:

各种算法的实现;与硬件相对无关

(2)数据传输的程序:与硬件紧密相关;

中断、DMA:提高数据传输效率的

两种“古老”而有效的手段两种程序的开发时间:

数据链路层次(1)CPU核DSP的寄存器和运算单元之间的数据链路多数据链路层次(2)DSP片内存储器片外存储器接口:

EMIF,HPI/XBUSDMA中断其它外设:

时钟,串口C6x片内总线ADInternal

Memoryx32ADExternal

InterfaceADx32Peripheralscanperform64-bitdataloads.‘C67x DataAddr -T1 x32 DataData -T1 x32/64 DataAddr -T2 x32 DataData -T2 x32/64AregsBregs ProgramAddr x32 ProgramData x256PC DMAAddr -Read x32 DMAData -Read x32 DMAAddr -Write x32 DMAData -Write x32DMA数据链路层次(3)板级数据链路层次(4)板间CompactPCI总线脉冲压缩板C6701C6701C6701C6701C6202AD预处理板ADCC6202ADCC6202DSP板并口串口C6202CPU板定时板C31某信号处理系统框图系统定时信号数据链路层次(5)系统间其实是一个雷达系统的子系统之间的数据链路。再进一步:这个雷达系统可以组网,利用通信系统给决策单位提供信息,进行后数据处理,做出决策总之,要对数据链路有一个清晰的各级层次的传输图C6000的中断(1)三个概念:

(1)中断源(Interruptsource):即中断事件,32个

(2)中断选择号(InterruptSelectionNumber):5bit

(3)中断(Interrupt):12个可屏蔽+NMI(No.1) +RESET(No.0)+RTDX(No.3)中断寄存器的设置:

中断源通过中断选择子(InterruptSelector)“映射”到CPU的中断上,并可通过外中断极性设置寄存器设置EXT_INT4EXT_INT7的中断极性(即中断地触发时刻)C6000的中断(2)中断服务程序:

map1:IDRAM0x000~0x200

0x200=16*32;16个中断,每个中断的8条指令;二次跳转:

中断服务程序的任务实现超过8条指令时,跳转到真正处理中断的子程序_INT4:.asg4,vecstw.d2b0,*--b15||mvk(_isr_jump_table+vec*4),b0mvkh(_isr_jump_table+vec*4),b0ldw.d2*b0,b0nop4b.s2b0||ldw.d2*b15++,b0nop5C6000的中断(3)二次跳转的实现:

(1)中断跳转表:isr_jump_table全局变量

(2)“挂”中断:

voidintr_hook(void(*fp)(void),intcpu_intr);来源:

ti\c6000\evm6x\dsp\…库函数,头文件,源文件

v1.2有;v2.0只含头文件C6000的中断(4)中断嵌套

-进入中断后,GIE=0

-允许中断嵌套的设置

中断重入

-打乱时序关系,应该

尽量避免

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,16EDMA通道复杂的传输模式:满足不同的数据传输应用

单通道分割,多帧传输,自动初始化,传输完毕后触发中断..….

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的TimerDSP时间的最细刻度:主频利用时钟(中断)为系统提供的各种时间,起到计时器的作用

-中断发生的间隔时间可设:1ms

-计算时间间隔精度:1us利用计时器防止等待超时TIMER测试程序时间的两种方法:

中断法;直接计数法(无中断开销)。一个AD板的例子Q路视频信号双口中断内PRT中断AD_IAD_QI路视频信号EPLD+FIFO开关网络C6202_1C6202_2控制信号256K*32bitSBSRAM256K*32bitSBSRAM16K*32bit双口RAM16K*32bit双口RAMVTIDP中断GRIDP中断外PRT中断双口中断CPCI总线图1AD板硬件简要框图清FIFO信号AD板的中断小结调试经验1可中断程序的编写:应用条件

----核循环的并行指令数不小于6

SPRA534

WritingInterruptibleLoopedCodeForTheTMS320C6x

调试中数据的存储和显示:

系统级调试中的重要性

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:调试经验5Restartgomain跑飞和reloadgomain跑飞的原因:

(1)GIE为1和IER的某些位为1

(2)发生了某些中断或IFR某些位为1

(3)中断向量表未初始化。要运行runtimeload后才初始化。发生中断后,读取中断向量表的值是乱数。

(联系那个设置大数组的调试例子)中断处理的超时错误计数器在停止(halt命令)后加1--JTAG对实时时序的影响调试小结应用工程师:实现层次

程序员在调试时医生与警察未能实现功能观察现象(错误的结果)注重相关的基础知识的掌握:编程环境错误结果原因并非一目了然正确结果定位监测记录改正往往不难实现硬

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论