打印
[STM32]

KEIL 单步调试时指针总是跑飞,求解!

[复制链接]
6559|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我的串口1在不停的接收数据,在这个时候点击单步执行,那个指针箭头就消失了,只有点击STOP按钮才能挺下来,可是已经跑到串口1接收中断里面去了
试验过程下来,只要我的串口1是在活动状态,程序的单步执行功能就不正常,根本就执行不到下一步语句上去,把串口1的线缆拔掉单步执行又正常了,但是我单步执行就是需要串口1的数据过来,请问这种情况下怎么处理?

相关帖子

沙发
mylsf| | 2014-11-19 15:41 | 只看该作者
上代码

使用特权

评论回复
板凳
ayb_ice| | 2014-11-20 09:52 | 只看该作者
不是单步吧

使用特权

评论回复
地板
insect2006|  楼主 | 2014-11-26 10:53 | 只看该作者
可能说的不是太清楚,补充下:
我说的单步执行停不下来是指在程序的其他地方单步执行(比如在main函数的while(1)主循环里面任意地方),因此时串口1外接了一个东西,这个东西在不停的往串口1发送数据,所有此时我在main函数里面进行单步调试总是受到干扰,执行F10指针消失,而不是停留在下一句代码出,此时点击STOP按钮发现指针跑到串口1接收中断里面去了,在串口中断里面执行F10单步执行是正常的,但是在执行完串口1中断程序最有一句代码后指针又消失了,只能再次点击STOP按钮,此时指针有停留在串口1中断函数里面。以上现象就导致了我在程序的其他地方执行单步调试都无**常进行(而只要把外部那个东西拔掉,我的所有单步调试都回复正常)。

使用特权

评论回复
5
insect2006|  楼主 | 2014-12-24 15:53 | 只看该作者
没人能指点一二么?

使用特权

评论回复
6
徐大山| | 2014-12-24 19:02 | 只看该作者
本帖最后由 徐大山 于 2014-12-24 19:04 编辑

不好意思,大山还是没看明白, (这个确实很难文字描述,大山非常理解楼主)

大山的直觉就是:  楼主,你的 程序可能溢出了
(  比如,1.  指针紊乱,
                  2.  意外地不恰当使用公共变量

                 可以把串口中断服务程序简化,或屏蔽,然后,再试试看)

使用特权

评论回复
7
crystal1987| | 2014-12-25 09:38 | 只看该作者
楼主,确实没太理解你的意思。不过建议串口不要实时发送数据,你手动发送,然后单步运行,看看能不能单步监测正常。

使用特权

评论回复
8
insect2006|  楼主 | 2014-12-27 00:34 | 只看该作者
crystal1987 发表于 2014-12-25 09:38
楼主,确实没太理解你的意思。不过建议串口不要实时发送数据,你手动发送,然后单步运行,看看能不能单步监 ...

简而言之就是串口1在持续接收数据导致程序单步调试不正常,屏蔽掉串口1接收则单步正常。但是串口1的接收程序也是正常的,没有发现问题。

使用特权

评论回复
9
insect2006|  楼主 | 2014-12-27 00:37 | 只看该作者
徐大山 发表于 2014-12-24 19:02
不好意思,大山还是没看明白, (这个确实很难文字描述,大山非常理解楼主)

大山的直觉就是:  楼主,你 ...

见4楼描述
屏蔽串口1中断后单步调试正常
开启串口1中断后程序运行状态下同样正常,只是进入调试模式下单步执行不能进行

使用特权

评论回复
10
zchong| | 2014-12-27 13:52 | 只看该作者
说明串口一直在中断,要么就是串口一直有数据,要么就是串口中断清标志出现了问题

使用特权

评论回复
11
crystal1987| | 2014-12-27 17:38 | 只看该作者
insect2006 发表于 2014-12-27 00:34
简而言之就是串口1在持续接收数据导致程序单步调试不正常,屏蔽掉串口1接收则单步正常。但是串口1的接收 ...


按照目前的情况看,应该还是串口1中断的问题。如果方便把你的串口通信代码贴出来,让大家帮忙看看。慢慢来,问题总能解决的。

使用特权

评论回复
12
insect2006|  楼主 | 2014-12-28 14:47 | 只看该作者
crystal1987 发表于 2014-12-27 17:38
按照目前的情况看,应该还是串口1中断的问题。如果方便把你的串口通信代码贴出来,让大家帮忙看看。慢慢 ...

void USART1_IRQHandler(void)               
{
        u8 i;

        USART_ClearITPendingBit(USART1,USART_IT_RXNE);                        //清除接收标志位
        USART1_ReceData=USART1->DR;

        if(USART1_ReceFlag==0)
        {
                if(USART1_ReceData==0xEB)
                {
                        USART1_Recebuf[0]=USART1_ReceData;
                        USART1_ReceFlag++;               
                }
        }
        else if(USART1_ReceFlag==1)
        {
                if(USART1_ReceData==0x90)
                {
                        USART1_Recebuf[1]=USART1_ReceData;
                        USART1_ReceFlag++;       
                }
                else
                {
                        USART1_ReceFlag=0;                                                                //重新接收               
                }
        }
        else if(USART1_ReceFlag==2)       
        {                               
                USART1_Recebuf[2]=USART1_ReceData;
                USART1_Len=USART1_ReceData;                                                        //帧长度                                       
                USART1_ReceFlag++;       
        }
        else if(USART1_ReceFlag==3)
        {
                USART1_Recebuf[3]=USART1_ReceData;
                USART1_Cmd=USART1_ReceData;                                                        //帧命令
                USART1_ReceFlag++;               
        }
        else
        {
                /*接收剩余数据中*/
                if(USART1_ReceFlag<USART1_Len-1)
                {
                        USART1_Recebuf[USART1_ReceFlag]=USART1_ReceData;
                        USART1_ReceFlag++;       
                }
                /*接收完成*/
                else if(USART1_ReceFlag==USART1_Len-1)
                {
                        USART1_Recebuf[USART1_ReceFlag]=USART1_ReceData;          //接收最后一个校验字节
                       
                        /*计算校验位*/
                        for(i=0,USART1_CountData=0;i<USART1_ReceFlag;i++)USART1_CountData+=USART1_Recebuf;
                       
                        /*校验OK,解析*/
                        if((USART1_CountData&0x00ff)==USART1_Recebuf[USART1_ReceFlag])
                        {                               
                                USART1_ReceOK=1;                                                                               
                                USART1_ReceFlag=0;                                               
                       
                                /*数据帧单独处理*/
                                if(USART1_Cmd==CONTINUS_READ_AD7730_DATA)
                                {
                                        receive_dataframe_ok_flag=1;       
                                }
                                /*其他帧处理*/
                                else
                                {
                                        receive_cfgframe_ok_flag=1;                                                       
                                }                               
                        }
                        /*校验错误,丢弃*/
                        else
                        {
                                USART1_ReceFlag=0;               
                        }       
                }
                else
                {
                        USART1_ReceFlag=0;       
                }
        }
}

使用特权

评论回复
13
insect2006|  楼主 | 2014-12-28 14:50 | 只看该作者
        USART_InitStructure.USART_BaudRate = 115200;                                                                                        //115200bps
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;                                                                //数据位8位
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                                                                        //停止位1
        USART_InitStructure.USART_Parity = USART_Parity_No;                                                                                //无奇偶校验
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;                        //无硬件流控制
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                                                        //发送和接收模式                                                                                               

        USART_Init(USART1, &USART_InitStructure);                                                                                            //初始化串口1
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);                                                                                        //开启接收中断
        USART_Cmd(USART1,ENABLE);                                                                                                                                //开启串口1

使用特权

评论回复
14
crystal1987| | 2014-12-29 10:21 | 只看该作者
insect2006 发表于 2014-12-28 14:50
USART_InitStructure.USART_BaudRate = 115200;                                                                                        //115200bps
        USART_InitStructure.USART_WordL ...

for(i=0,USART1_CountData=0;i<USART1_ReceFlag;i++)USART1_CountData+=USART1_Recebuf;
这个是显示问题!

使用特权

评论回复
15
crystal1987| | 2014-12-29 10:21 | 只看该作者
insect2006 发表于 2014-12-28 14:50
USART_InitStructure.USART_BaudRate = 115200;                                                                                        //115200bps
        USART_InitStructure.USART_WordL ...


if(USART1_Cmd==CONTINUS_READ_AD7730_DATA)
                                {
                                        receive_dataframe_ok_flag=1;        
                                }
                                /*其他帧处理*/
                                else
                                {
                                        receive_cfgframe_ok_flag=1;                                                        
                                }   
这个是不是有问题?

使用特权

评论回复
16
crystal1987| | 2014-12-29 10:24 | 只看该作者
crystal1987 发表于 2014-12-29 10:21
if(USART1_Cmd==CONTINUS_READ_AD7730_DATA)
                                {
                      ...

你貌似接收和发送中断都用了。
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
}
else if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{                                         
}

使用特权

评论回复
17
insect2006|  楼主 | 2014-12-29 15:06 | 只看该作者
crystal1987 发表于 2014-12-29 10:24
你貌似接收和发送中断都用了。
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{

只开了接收中断功能,发送完成中断未启用,见仿真截图:

使用特权

评论回复
18
menfiss| | 2015-1-10 09:09 | 只看该作者
那个指针估计不是c语言的指针,好像是进入中断服务程序了。
在中断服务程序设置一个断点试试。

使用特权

评论回复
19
戈卫东| | 2015-1-12 12:08 | 只看该作者
有中断单步不好用。
找几个关键位置放断点可能好一些。

使用特权

评论回复
20
insect2006|  楼主 | 2015-1-14 11:39 | 只看该作者
戈卫东 发表于 2015-1-12 12:08
有中断单步不好用。
找几个关键位置放断点可能好一些。

我觉得应该不是不好用
而是我们不会用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

146

帖子

1

粉丝