5963|6

92

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【讨论】调用子程序为什么不能正确返回?郁闷中... [复制链接]

使用IAR EW 3.10A,C编程。主循环进入LPM1,在通讯中断中唤醒。中断返回后调用一个子程序(该子程序中有4层调用其它子程序,并能正确执行完成),最后返回时却不能回到原调用处!而是返回到主循环外的前面的几条语句上(单步执行观察到的)。这是为什么?

最新回复

我遇到过这样的问题,也是在串口通信中,后来仔细查找才解决 ――我开始的时候是将浮点数拆分成字节流进行传输,在中断中用定义成全局变量得接收缓冲区接收,再强制类型转换成浮点数,浮点数的获取和返回都用的是局部变量。仔细跟踪堆栈发现,MSP430是16位单片机,多字节数据必须偶地址对齐,而如果恰好浮点数是从奇地址开始存放,就无法正确转换成浮点数,严重的时候会导致堆栈混乱,退不回来了。后来开辟了一个全局联合体,以上的问题就全部解决了。  详情 回复 发表于 2006-1-15 20:53
 
点赞 关注

回复
举报

80

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
会不会是 SP 在中断程序中被错误修改了
退出中断的时候中断标志位清了吗
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我也怀疑是SP被修改了,但我的程序中没有人为的去修改SP啊。它怎么就在最后一层返回时出错了呢?
在UART0的接收中断中执行:
while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?
TX = RXBUF0;
还要清什么中断标志?
问题是,在错误返回后程序还可以运行,甚至照样响应TA0和UART0中断!只是响应UART0时收到的数据面目全非或是发送数据的某一段不完整。系统复位后可以正常运行一个循环。不,应该是最后一点时不完整的一个循环。
 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

4
 
是在UART0中断函数里退出LPM1吗?你的UART0没有一次正确吗?
IAR EW 3.10A是D版?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 


1、我是在UART0中断函数里退出LPM1的。在UART0中执行了LPM1_EXIT语句后程序从中断返回,执行mian()中while(1)循环体中“LPM1”后面的语句“Command_identify();”。执行该语句调用的程序时,最多有4层函数调用。其中包括通过UART0回发应答数据帧。在完成UART0回发应答数据帧后逐层返回,当返回到最后一层时,即返回到调用“Command_identify();”处时,PC指针却指向到while(1)循环体外面,即while(1)语句前面的某条语句上!使得程序重新进入while(1)循环,并又一次进入LPM1低功耗,并等待UART0的再次中断。在次期间同时还有一个TA0的0.5s中断,对LCD进行时钟刷新。
/*---------主循环 ----------------*/
while (1)
{
LPM1; // 进入低功耗模式1(LPM1=ACLK、SMCLK活动)
_NOP(); // Required only for C-spy
if (RxEND == 1)
{
Command_identify(); // 若数据帧接收完成,则调用命令识别
RxBUF_i = 0;
RX_Star = 0;
}
}
}

2、上电或复位后UART0可以正确的完成一次数据收发操作。
但是,从断点设置后单步跟踪的观察,在完成操作后就不能正确返回到调用处,所以有些程序标志没有复位,因此不能正确执行新的命令了。

3、IAR EW 3.10A是破解版,并打了补丁。

lsdfae06版主,能否做进一步解答,谢谢!!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
感觉问题应该在Command_identify()。会不会4层函数调用时发生冲突造成的。
建议:
1。将Command_identify()完全屏蔽,看程序是否正常运行,UART接受是否正常?如果正常可以确定是Command_identify()问题,再2。
2。再将Command_identify()函数一层一层屏蔽,判断是否正常执行,从而找出问题所在。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
我遇到过这样的问题,也是在串口通信中,后来仔细查找才解决
――我开始的时候是将浮点数拆分成字节流进行传输,在中断中用定义成全局变量得接收缓冲区接收,再强制类型转换成浮点数,浮点数的获取和返回都用的是局部变量。仔细跟踪堆栈发现,MSP430是16位单片机,多字节数据必须偶地址对齐,而如果恰好浮点数是从奇地址开始存放,就无法正确转换成浮点数,严重的时候会导致堆栈混乱,退不回来了。后来开辟了一个全局联合体,以上的问题就全部解决了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表