- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章】中断处理
* * * * * * * 读取两个传感器采集的温度值,如果不相等则报警。 * * * * * * * * * * * 提问:bug出现在哪里? * * result=secondsToday在执行过程中可能被中断,造成result值不等于secondsToday,但是后续while循环能发现该问题 如果在While循环中产生中断,result的值会和secondsToday不相等,所以会继续循环读取。 * * * * * * * * * * * * 不使用中断禁止的解决方法4 Interrupt Routine 1 void interrupt ReadTemperatures(void) 2 { 3 if(taskUsingArrayB) 4 { 5 iTemperaturesA[0] = !!传感器0中存储的值 6 iTemperaturesA[1] = !!传感器1中存储的值 7 } 8 else 9 { 10 iTemperaturesB[0] = !!传感器0中存储的值 11 iTemperaturesB[1] = !!传感器1中存储的值 12 } 13 taskUsingArrayB = !taskUsingArrayB; 14 } 2.2 共享数据问题 –时间转换1 void interrupt UpdateTime(void) { ++iSeconds; if (iSeconds = 60) { iSeconds = 0; ++ iMinutes; if (iMinutes = 60) { iMinutes = 0; ++iHours; if (iHours = 24) iHours = 0; } } } static int iSeconds, iMinutes, iHours; int SecondsSinceMidnight(void) { return (iHours*60 + iMinutes)*60 + iSeconds; } void main() { int seconds = SecondSinceMidnight(); } 2.2 共享数据问题 –时间转换2 第一个解决方法a 1 int SecondsSinceMidnight(void) 2 { 3 int iResult; 4 disable(); 5 iResult = (iHours*60 + iMinutes)*60 + iSeconds; 6 enable(); 7 return iResult; 8 } 2.2 共享数据问题 –时间转换3 第一个解决方法b 1 long SecondsSinceMidnight(void) 2 { 3 BOOL oldInterruptState; 4 int iResult; 5 oldInterruptState = disable(); 6 iResult = (iHours*60 + iMinutes)*60 + iSeconds; 7 restoreIrq(oldInterruptState); 8 return iResult; 9 } 2.2 共享数据问题 –时间转换4 第二个解决方法 static int secondsToday; int SecondsSinceMidnight(void) { int result; result = secondsToday; while (result != secondsToday) result = secondsToday; return result; } void interrupt UpdateTime(void) { ++secondsToday; if (secondsToday == 60L*60L*24L) secondsToday = 0; } 只要该段代码能在1秒内执行完毕,就不会有问题。 2.2 共享数据问题 –时间转换5 第二个解决方法的问题 大多数编译器都会假设变量不会变化,除非该程序主动改变它的值; 基于这个假设,编译器会将内存中的值暂存在寄存器中。之后用寄存器中的值代替变量的值,这是编译器的一种优化策略; 但在一些情况下,这种假设是不对的。变量确实会在本程序没有改动的情况发生值的变化; 例如,其他程序或硬件对该变量的改变。 2.2 共享数据问题 –时间转换6 第二个解决方法的问题 对于右上角的代码,编译器会将seco
文档评论(0)