无限循环并不是防止程序“跑飞”的,而是防止main()返回
?
例子:
//实例13:用P0口显示逻辑"与"运算结果 #include?? //包含单片机寄存器的头文件 void main(void)? { ? P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口 ? while(1) ??? ;??? //设置无限循环,防止程序“跑飞” } 请问大侠们最后的无限循环是如何防止程序跑飞的??
---------------------------------------------------------------------------------------------------------------------------------------3#
这个程序并不能阻止程序的跑飞(应该用看门狗才行),不过这样写也是很正确的做法,就是让程序一直在运行着(原地循环),这里的while(1)并不是防止程序“跑飞”的,而是防止main()返回。
①??? 在嵌入式中main是不能返回的。不同的C语言实现的startup code会有不同的表现,有的是在call _main后jmp,而有的是jmp? 0,等等这些会导致
不可预料的结果。
②??? 在我们写的C语言后转换成汇编,在观察单片机的代码区,你会发现没有写程序的部分例如全1或者全0区域,程序运行到这里如果在往下执行的话,就会有可能造成
意料不到的结果。?? 不过我还没有这样实验过,理论上是这样的,希望大家一起讨论,多多指教。
------------------------------------------------------------------------------------------------------------------------------------------
3楼正解,我觉得最后那个while里面没有代码,就是让程序原地运行,但是它不能阻止在特殊情况下程序跑飞,如外界电磁干扰等,那个无限循环的作用就是将PC指针控制在程序的代码区内,防止PC跑偏。
------------------------------------------------------------------------------------------------------------------------------------------
路过 打酱油 用看门狗就好
?
?
?
R8C/1B单片机的Flash编程/擦除挂起功能
?
Flash存储器已成为嵌入式系统中数据和程序最主要的载体。但是在对Flash进行
编程或
擦除的操作过程中,如果
单片机需要处理一些紧急的情况(如中断、数据存储等等),就需要暂停相对比较消耗时间的Flash编程/擦写过程,优先处理这些紧急情况。这对Flash存储器的工艺水平及控制技术提出了更高的要求。
Flash编程/擦除挂起功能
Flash编程/擦除挂起功能的实现
●? Flash编程/擦除挂起的设定 EW0模式的擦除挂起设定 EW1模式的擦除挂起设定
#pragma interrupt timerX_ISR void timerX_ISR(){ g_Timers++; } /* 检查Data Flash状态寄存器 */ unsigned char checkStatusRegister(){ return fmr07|fmr06; } /* 清除DataFlash状态寄存器? */ void clearStatusRegister(){ ?*((unsigned char *)0x2400) = 0x50;//执行清除状态寄存器软件命令 } /* 块擦除 */ unsigned char eraseBlock(unsigned int adr){ unsigned char?? result="1"; asm("FCLR I");//关中断 fmr01 = 0; fmr01 = 1;//进入CPU改写模式 fmr11 = 0; fmr11 = 1;//设置为EW1模式&nb
sp; /* 主函数 */ void main(void) { unsigned char flag; ?initMCU();//对MCU进行初始化 ?flag = eraseBlock(0x2400);//擦除大小为1kB的块A,块首地址为2400H ?while (1); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |