基于CCS的嵌入式软件开发与调试

来源:互联网 发布:网站数据分析 编辑:程序博客网 时间:2024/05/16 19:52

什么是调试?


     调试 Debug   输入--->输出 不符合设计逻辑

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

调试的一般过程

  1. 识别问题(加断点对timer计数的影响)
  2. 收集信息logging:(收集什么信息?造成输出错误的直接输入信息,逐级tracing)
  3. 分析收集的数据,定位bug;
  4. 修改bug。
可控性 & 可观测性 :来自软件工程的概念,其中可观测性是软件、硬件调试的基石。


静态调试:

  • 单步执行;设置断点;
  • 观察变量;观察寄存器和存储器值;
  • 修改变量、寄存器和存储器的值;
  • 运行一段程序;
“必须掌握的基本技能”


动态调试:

  • 实时记录、观察数据;
  • RTDX 条件断点

论述"调试"的书籍:

  1. The Science of Debugging, MattTelles.程序调试思想与实践,中国水力水电出版社---bug 是系统逻辑的奴隶
  2. Debugging Application , JohnRobbins ,Microsoft Press ,2000 主要针对windows程序调试中文名:  应用程序调试技术
  3. 软件调试思想: Robert Charles Metzger

写 C6000 中断程序:


一般来讲,嵌入式系统是中断驱动的系统,另外还有数据流驱动的嵌入式系统(Windows:事件驱动)典型的结构:main函数中初始化->While循环等待中断到来,在中断处理程序中进行真正的数据处理中断之间的关系:
-同步关系:中断的触发次数成比例
-异步关系:。。。
-因果关系:一个中断触发其他中断,可看作是同步  关系中的一种特例

基于以上关系的中断间的数据共享模式
-乒乓模式:采数中断+处理中断, 同步中断关系
-圆周buffer:串口中断+处理中断,异步中断关系
-共享memory:传数中断+DMA结束中断,因果关系


调试经验:

  • 可中断程序的编写:应用条件----核循环的并行指令数不小于6 (SPRA534 Writing Interruptible Looped Code ForThe TMS320C6x)
  • 调试中数据的存储和显示:1. 系统级调试中的重要性  2. CCS的显示工具  3. Matlab
  • 定点DSP实现浮点运算的考虑
  • 一次新增的调试代码不能过长:便于新的bug定位
  • 防御式编程例:723解模糊程序边界条件
  • 对感兴趣的事件做记录:放到片外ram;某些计数记录在halt运行后更新时可能有+/1的误差
  • CCS添加断点的注意:run前,running中 if( Cnt>1000) {nop_debug();};       audio例子运行时,设置断点的现象
  • 窗口刷新的影响:application的非实时
  • 随时关心程序运行时间:使用timer测量时间,中断法/非中断法
  • 注意数组的越界和指针的使用:中断向量表被修改,程序就会跑飞
  • 关于全局变量和局部变量:bug例:723程序,MTD子函数设置256字的大数组,修改中断向量表
  • volatile关键字:其它任务中可能修改
  • const关键字:编译器保证数据不被修改,但是运行时用指针可以修改;没有用?!
  • 关于中断嵌套
  • 观察中断间的同步关系
  • 程序跑飞:
  • 不要惧怕程序“死了”、“跑飞”,万事皆有原因;对编程环境的基础知识熟悉程序跑飞绝大多数是中断向量表被修改
  • “快”与“慢”,“大”与“小”.
  • 选择高级的优化不会造成程序错误,如果有错误,是自己程序的问题。(例:最初接dqy的 DSP板 程序,局部变量->全局变量,堆栈)
  • 设计小实验进行某些验证:语法,设想。例子:PM数据改变,怀疑硬件问题,结果设计DMA改写PM,不排除软件的bug;培养工程动手能力,想一想->试一试,
  • far型数据:truncated错误
  • CCS不支持中文目录
  • 节拍节拍节拍:处理帧、时间粒度
  • 改变某部分后出了问题,就是改的部分有 bug. 
  • 中断处理的超时错误计数器在停止(halt命令)后加1--JTAG对实时时序的影响
  • Restart ---> gomain 跑飞和reload--->gomain跑飞的原因:(1)GIE为1和IER的某些位为1(2)发生了某些中断或IFR某些位为1(3)中断向量表未初始化。要运行run time load 后才初始化。发生中断后,读取中断向量表的值是乱数。(联系那个 设置大数组的 调试例子)



自己开发的硬件平台,在交付软件开发工程师之前,应该做测试。以便于硬件bug和软件bug的定位。

主要的测试内容:
  • 数据IO
  • 数据处理

测试方法:

(1)时间足够长,1hour以上
(2)数据IO:DMA,CPU核和各个外设通讯
(3)数据处理:FFT,充分使用各个运算单元


TI DSP软件开发学习:
  • CCSTurorialUser’s Guide
  • C 的运行环境
  • CPU结构和汇编语言
  • 硬件知识

要客观世界可“控制”,可“利用”,你需要先深刻地理解客观世界的运行规律。然后,在种种规律(也可理解为“限制”)的前提下实现你的想法。

---------------------------------------------------------------------------------------------------------------------------------------------

原创粉丝点击