
我有一个EthernetClIEnt,它在回调函数中逐个字符地读取数据.
我的工作代码看起来像(只有相关部分):
voID setup() { Serial.begin(9600); ...}voID loop() { char* processedData = processData(callback); // this is in a external lib}boolean callback(char* buffer,int& i) { ... if (ClIEnt.available()) { char c = clIEnt.read(); buffer[i++] = c; Serial.print(c); } ...} 这没有任何问题(读取和处理数据),但当我删除Serial.begin(9600);和Serial.print(c);它停止工作,我不知道为什么?唯一改变的是char c没有打印.可能是什么问题呢?
解决方法 当看似无关的代码被改变时,回调函数改变其行为的一个常见原因是优化器相关的错误.许多嵌入式编译器无法理解将在程序中调用回调函数(或中断服务例程).他们看不到对该函数的显式调用,然后假设它从未被调用过.
当编译器做出这样的假设时,它将优化由回调函数改变的变量,因为它无法在初始化点和访问点之间看到变量被程序改变.
// Bad practice example:int x; voID main (voID){ x=5; ... if(x == 0) /* this whole if statement will get optimized away,the compiler assumes that x has never been changed. */ { do_stuff(); }}voID callback (voID){ x = 0;} 当这个BUG出现时,它几乎不可能找到,它可能会导致任何奇怪的症状.
解决方案是始终将main()和中断/回调/线程之间共享的所有文件范围(“全局”)变量声明为volatile.这使得编译器无法做出不正确的优化器假设.
(请注意,volatile关键字不能用于实现同步,也不能保证任何内存障碍.这个问题与这些问题没有丝毫关系!)
总结以上是内存溢出为你收集整理的Arduino EthernetServer read()仅在Serial初始化并打印读取字符时有效全部内容,希望文章能够帮你解决Arduino EthernetServer read()仅在Serial初始化并打印读取字符时有效所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)