zoukankan      html  css  js  c++  java
  • keil5的仿真调试

    仿真调试的作用

      1.仿真调试实时跟踪代码的运行,逐步执行代码,程序出现问题并能跟踪到问题所在;
      2.设置调试断掉,使程序运行到指定位置停下;
      3.能够观察全局变量的变化、寄存器的变化;
      4.可以查询某个内存地址的存储的数据;
      5.显示调用栈的内容,也就是函数指针和局部变量;
      6.可以查询片内外设和片外外设的寄存器变化,对照芯片手册的相应寄存器的说明,便可以知道相应外设寄存器的值是否出错。

    调试界面常用按钮


      以上为调试界面常用的按钮

      以上为查看片内外设寄存器的操作,结合芯片手册相应寄存器的说明,便可以明白相应外设寄存器的值是否符合预期。

    编译优化


      以上为将编译器设置为-O2优化的方法,编译器想尽办法去压缩程序存储空间,提高运行速度。一般编译器,优化有多个等级:-O0、-O1、-O2、-O3:
        -O0:默认优化级别,不压缩程序存储空间,不提高程序运行速度,保证程序的可靠执行;
        -O1:轻度优化,轻度压缩程序存储空间,轻度优化程序运行速度;
        -O2:推荐优化等级,在程序存储空间和程序运行速度取得平衡点;
        -O3:最高级别的优化等级,有可能导致程序不能运行,也会使用以空间换时间的方法,导致程序体积增大。
    -O0:

    -O2

      以上为不优化和使用-O2优化编译同一工程所产生的结果,可以看出使用-O2将输出的可执行文件减小了10%,这还是很可观的,所以能优化的时候尽量使用优化。

    volatile关键字

      注意如果使用了-O2优化有些变量的定义就需要volatile关键字修饰,CPU去访问被volatile修饰的变量时会小心翼翼去去实际所在的内存地址中去读取它的值,而不是去读取保存在寄存器中的备份, volatile往往应用在三种场合:
        1.多线程编程共享全局变量的时候,该全局变量要加上volatile进行修饰;
        2.裸机编程的时候,某函数与中断服务函数共享全局变量的时候,该全局变量要加上volatile进行修饰,让编译器不要省略该变量的访问;
        3.CPU访问外设寄存器的时候,寄存器是指向一个地址,需要加上volatile进行修饰,表示让CPU去该地址读取值,而不是使用备份的值。

    总结

      1.调试时如果要查看局部变量的值就不应使用优化,不然不能够在Call Stack窗口中查看但局部变量的值;
      2.watch窗口只能跟踪全局变量的值;
      3.延迟函数的计数值在使用-O2优化时,需要使用volatile修饰,不然会被优化而不能延迟。

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14409491.html
Copyright © 2011-2022 走看看