关于codewarrior调试出现illegal BP的问题解决过程(转载)

2023-05-16

昨天两位工程师调试同时出现这个问题,网上对于illegal BP的解决方法讲解的很模糊,没有一个具体的指导方针。我试着阐述我们问题的解决过程,希望对大家解决类似情况可以起到抛砖引玉的作用。
    两位工程师同时出现该问题,但由于负责不同的功能,并且互相独立,可以判断是不同的问题引起的。
    通过单步运行(step over),工程师J发现当进入某个子函数时,对某个指针指向的变量清零时出错。
    func(unchar *P)
    {
      *P=0
    }
    刚开始怀疑堆栈溢出,但屏蔽了许多子函数并且检查xMAP文件,发现堆栈空间还是很多的,由于该函数多次被调用,我们逐个检查main中该函数的调用情况,发现某个地方调用该函数写为func(0),可能是工程师疏忽遗忘了。问题就在这里,0作为一个指针而不是变量被引用,在coldfire中,所指向的是单片机的初始监控堆栈指针,对它强行清零可想而知。
    工程师L的问题比较棘手,单步运行(step over)发现是退出中断时出错。我们采用标准的codewarrior中断声明格式
    void (*const vector_60)(void)  @Vfunc = isrfunc;

    我们在hiwave下查看memory窗口,发现中断向量所指向的中断处理函数地址完全正确。在汇编Assembly窗口下单步运行(single step)观察,发现执行到返回指令RTS后,程序跑飞。coldfire中地址寄存器A7作为堆栈指针使用,我们继续追查A7所指向的堆栈地址,发现在堆栈中插入了一个不是地址的数据。
    比如
    0x1000  正确的存储地址
    0x0FFC  非地址数据

    每次退出堆栈时,当堆栈指针指向0x0FFC时,PC就指向了这个非地址数据,于是程序跑飞。不论我们如何单步运行,都不能把插入该非地址数据和中断处理分离开。也就是说,这个非地址数据是进入中断时推入堆栈的,而不是其他指令产生的。我们在这里纠结了很久。后来偶然发现中断函数的写法有问题。
    工程师L的写法是
    void isrfunc(void)
    {
       asm
       {
          JMP func_ISR;
       }
    }

     void (*const vector_60)(void)  @Vfunc = func_ISR;

     但codewarrior的默认写法是
     __interrupt void isrfunc(void)
    {
        asm
        {
          JSR func_ISR;
        }
    }

    void (*const vector_60)(void)  @Vfunc = func_ISR;

    原来是JMP搞的鬼,JMP是直接跳转,而JSR是保存现场至堆栈后再跳转。修改JSR后发现debug仍旧出现illegal BP提示,查看堆栈,发现那个非地址数据插在两个地址中间,即
    0x1000  正确的存储地址
    0x0FFC  非地址数据
    0x0FF8  正确的存储地址
    难道是__interrupt的问题?老老实实补充完整后运行OK。没有illegal BP提示。检查汇编指令发现返回指令由RTS变为了RTE了。RTS功能仅仅是将PC从堆栈中取出,而RTE作为异常返回,不仅取出PC,还有SR。原来那个非地址数据是中断前的状态寄存器,恍然大悟。仔细比较了中断前后两个SR,差别仅仅是包含了中断优先级。
    由于做了中断向量声明,所以在进入中断时(使用JSR),保存了PC和SR至堆栈中。但有无__interrupt声明却决定了返回时是作为普通子函数返回,还是中断返回。难道codewarrior编译时已经判断了进入中断,退出中断时还可以有另一种方式?
    我在网上Google了illegal BP,发现所有程序运行异常都可能会提示,包括:中断处理不正确、堆栈溢出、程序跑飞(硬件或者软件导致该问题),所以解决该问题的建议步骤如下:
    1、单步运行追踪问题发生的具体位置;
    2、充分利用编译软件的汇编、存储窗口等功能,追踪程序运行跳转的各个细节;

    知识浅薄,欢迎指正。

 

 

ILLEGAL_BP总结

 

开始以为硬件问题,后来检查后排除了这种可能。于是上论坛看看别人的解决方法,论坛大致有以下几个答案:

 

1.重新下载。

2.在调试过程中非法设置断点。(从名字来看,这个命令应该是报ILLEGAL_BP错误~)

3.堆栈溢出。因为片上资源有限,而如果用到的临时变量太多,会导致片上堆栈溢出。

 

第四种方法,解决了我的问题:

4.程序中中断设置错误。程序中设置了开中断,但是却没有中断处理函数,就会报错。
   解决办法:要么写中断处理函数,要么别开中断。

ILLEGAL_BP总结

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于codewarrior调试出现illegal BP的问题解决过程(转载) 的相关文章

随机推荐

  • linux eth0设置

    命令行设定IP地址 ifconfig eth0 192 168 1 12 将eth0IP设置为192 168 1 12 ifconfig eth0 up 使eth0使能 如果开发板与路由器连接 xff0c 并且路由器能够自动分配IP地址 x
  • printk打印不能显示到终端的解决方法

    printk与printf有个不同的地方 xff0c 就是printk有打印级别 使用printk时 xff0c Linux内核根据日志级别 xff0c 可能把消息打印到当前控制台上 xff0c 这个控制台是一个字符设备 这些消息从终端输出
  • qt socket通信中接收client发送是十六进制数据包

    在QT的服务端接收客户端发送的十六进制收据包 xff0c 经转换后显示在LineEdit上 xff0c 并把接收到的数据包转化为char 类型 xff0c 为后期数据处理做准备 recbuf在头文件类中一定义 xff1a QByteArra
  • 两个双口ram之间数据的传递

    1 如果两个双口ram数据位宽相同 xff0c 则采用时钟快的ram等待时钟慢的ram来完成从一个ram中读取数据并存储到另一个ram中 xff1b 例如从ram A中读取数据到ram xff22 中 xff0c xff52 xff41 x
  • + - 与>> <<运算优先级

    43 运算符的优先级高于 lt lt gt gt 位移运算符 span class hljs keyword int span mian span class hljs keyword int span a 61 span class hl
  • linux col 过滤控制字符

    参考http blog 51cto com jim123 1833502 使用过Unix系统的人肯定会知道man帮助的功能强大 xff0c 是官方的帮助文档 xff0c 我们平时可以通过它来查询不知道如何使用的命令或者查询linux的系统C
  • gcc 参数

    gcc gcc与 g 43 43 分别是GNU的C与 C 43 43 的编译器 xff0c 在编译工作中分4步 xff1a 1 预处理 xff0c 生成 i文件 2 编译器 xff0c 编译后停下来 xff0c 生成 o的目标文件 3 汇编
  • gdb 调试

    原文http linuxtools rst readthedocs io zh CN latest tool gdb html span class hljs variable span span class hljs number 1 s
  • Linux-C语言 网络TCP单次通信、多次通信、多线程通信逐步实现

    一 TCP通信 xff0c 只发送一次就结束程序 功能描述 xff1a 1 服务端一次只能连接一个客户端 2 客户端只能向服务端发送一次消息 xff0c 消息返回后客户端和服务器程序结束 3 客户端向服务端发送一个字符串 xff0c 服务端
  • 奇偶校验通俗易懂

    简介 xff1a 奇偶校验是奇校验和偶校验的统称 xff0c 就是在最低位或最高位添加一个校验位 xff0c 应用于主存储器信息的校验及字节传输的出错校验 原理 xff1a 奇校验 连同校验位使得所有位上的1相加为奇数 偶校验 xff1a
  • Ubuntu系统rosdep update报错的解决办法(2022.10.3亲测有效)

    目录 一 问题 xff1a Ubuntu22 04系统下面 xff0c rosdep update总是报错 二 方法一一道来 1 直接访问raw githubusercontent com是不行的 按照网上的解决办法先把ip地址找到 xff
  • Socket通信实验总结

    在实验设计的过程中遇到了不少困难 xff0c 先是服务器监听时怎么保持已有的socket 连接 xff0c 又能接受新的连接 在此用了 C 的 Dictionary lt string Socket gt socketDic 61 new
  • [Excel]Excel函数和用法(4)——查找字符串,SEARCH和FIND函数

    区别 xff1a SEARCH大小写不敏感 xff0c FIND大小写敏感 作用 xff1a 都是从左到右返回搜索到的字符串的起始位置 SEARCH语法 xff1a SEARCH find text within text start nu
  • Error: L6200E: Symbol B_DisCnctRelayTime multiply defined (by cdma_gps_hc.o and main.o).

    现象 xff1a 最近调试MDK的程序 xff0c 老是报这样的错误 L6200E Symbol B DisCnctRelayTime multiply defined by cdma gps o and main o 记录下来 xff1a
  • STM32 ADC用到的 抗脉冲滤波算法

    先介绍一下算法的基本思想 xff1a 在一组采样值中 xff0c 去掉 abandonMaxNum 个最大数据 xff0c 去掉 abandonMinNum 个最小数据 xff0c 余下的数据求平均值 函数功能 xff1a 抗脉冲滤波法 输
  • STM32使用内部振荡器及其和外部晶体振荡器的区别

    转自 xff1a http blog csdn net meic51 article details 8778518 在STM32上如果不使用外部晶振 xff0c OSC IN和OSC OUT的接法 如果使用内部RC振荡器而不使用外部晶振
  • Android的Audio系统

    转自 xff1a http blog csdn net gowyz article details 6019314 Android的Audio 系统 第一部分 Audio 系统综述 第二部分 Audio 系统和上层接口 第三部分 Audio
  • Android Audio代码分析 - Audio Strategy

    frameworks base services AudioFlinger cpp status t AudioFlinger PlaybackThread Track start status t status 61 NO ERROR L
  • mtk android 4.4 audio framework 代码分析(未完成)

    mtk android 4 4 audio framework 代码分析 未完成 xff0c 有需要的朋友可以参考下 mtk android 4 4 audio framework 代码分析 未完成 2 28 2015 3 01 24 PM
  • 关于codewarrior调试出现illegal BP的问题解决过程(转载)

    昨天两位工程师调试同时出现这个问题 xff0c 网上对于illegal BP的解决方法讲解的很模糊 xff0c 没有一个具体的指导方针 我试着阐述我们问题的解决过程 xff0c 希望对大家解决类似情况可以起到抛砖引玉的作用 两位工程师同时出