完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用的STC15的片子,在做DP从站,以下代码是检查外部RAM的一段代码,但是不知道为什么会陷入死循环出不来,经仿真变量 i 的值只会增到0x07800左右,在此段for语句之前还有两个类似的for语句,但是只有这个会陷入死循环,
unsigned int i; unsigned int j; for(i=0x0000;i<0x0f00;) { if(*((UWORD xdata*)i)!=j) { error = DP_SRAM_ERROR; // ERROR } i+=0x0002; j++; } |
|
相关推荐
9个回答
|
|
吧你编译后的map文件传上来吧
|
|
|
|
编译后没有map格式的文件,在一下for语句中间有一个flashing程序,是控制led灯闪烁的,里面有他自己的局部变量,刚才经过调试发现里面的局部变量经过运行后竟然可以更改for语句中的 i 和 j 的值,是在弄不懂为什么,从来没有碰到过这样的情况,有没有编译器设置什么的是控制函数调用层数的?
j = 0; for(i=0x0000;i<0x0f00;i+=2) { *((UWORD xdata*)i)=j; j++; } flashing(); // C501 Watchdog // TOGGLE_WATCHDOG__(); j = 0; for(i=0x0000;i<0x0f00;i+=2) { if(*((UWORD xdata*)i)!=j) { error = DP_SRAM_ERROR; // ERROR } j++; } flashing(); // C501 Watchdog // TOGGLE_WATCHDOG__(); j = 0; for(i=0x0000;i<0x0f00;i+=2) { *((UWORD xdata*)i)=j; } flashing(); |
|
|
|
你应该注意全局变量与局部变量的定义
|
|
|
|
把你的代码打包发来吧,帮你看一下(先编译一次,连编译产生的文件一道发);
你也可以调试的时候打开汇编窗口看一下,i 分配的是在什么空间,如果分配在外部存储空间,那么这就是问题所在; 也有可能你有中断程序修改了 i ,....... |
|
|
|
为什么分配在外部存储空间就不行呢,编译器选项我选的large模式,dp从站需要用好多变量一定要用片上拓展RAM的! |
|
|
|
|
|
|
|
如果i的值指向它自己呢?你对i做增量和指针操作会是啥情况? 叫你传工程上来帮你看,你又不肯,唉 |
|
|
|
不是我不肯,是我在帮别人做项目,实在是不能传太多的源代码,真实有劳各位了!
/*---------------------------------------------------------------------------*/ /* check external ram 片上的xdata RAM */ /*---------------------------------------------------------------------------*/ DP_ERROR_CODE check_external_ram(void) //已经修改过 { register DP_ERROR_CODE error; #ifdef _KEIL_C51 register int i; //这种定义会陷入死循环,可能是位数不够大 register int j; //UWORD i; //UWORD j; #endif //#ifdef _KEIL_C51 // flashing(); error = DP_OK; #ifdef _KEIL_C51 // C501 Watchdog // TOGGLE_WATCHDOG__(); j = 0; for(i=0x0000;i<0x0f00;i+=2) { *((UWORD xdata*)i)=j; j++; } // flashing(); // C501 Watchdog // TOGGLE_WATCHDOG__(); j = 0; for(i=0x0000;i<0x0f00;i+=2) { if(*((UWORD xdata*)i)!=j) { error = DP_SRAM_ERROR; // ERROR } j++; } // flashing(); // C501 Watchdog // TOGGLE_WATCHDOG__(); j = 0; for(i=0x0000;i<0x0f00;i+=2) { *((UWORD xdata*)i)=j; } // flashing(); // C501 Watchdog // TOGGLE_WATCHDOG__(); #endif //#ifdef _KEIL_C51 return error; }//DP_ERROR_CODE check_sram(void) void delay( void ) { UBYTE icount,jcount; for(icount = 0; icount < 255; icount++) { for(jcount = 0; jcount < 255; jcount++); } } void flashing() { UBYTE i; fault_led=0; for(i=0;i<20;i++) delay(); fault_led=1; for(i=0;i<20;i++) delay(); } |
|
|
|
我的理解是:你将i,j定义为全局变量,在在子程序中如果没有重新定义的话,就是使用的全局变量。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
195 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
172 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
453 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
697 浏览 2 评论
602 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11988 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 13:42 , Processed in 0.636674 second(s), Total 87, Slave 70 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号