3

我有一个线程,它执行函数调用,

 Thread 1()
 {
 while(1)
 {
 msg =  msgreceive();
condn= msg->condn;
 switch(condn)
 {
 case 0:
 //do sonmething
 break;
 case 1:
  printf("case_1");
  function2()
 break;
  }
}
}

function 2()
{
printf("fn2_Start");
//Do something
function 3();
printf("fn2_end");
}

fucntion3()
{
printf("fn3_Start");
//Do something
printf("fn3_end");
}

通常我以这种方式获得 printf 痕迹,

case_1
fn2_Start 
fn3_Start
fn3_end
fn2_end
case_1
fn2_Start 
fn3_Start
fn3_end
fn2_end
....
....
...

但从长远来看,有时我会以这种方式获得痕迹

case_1
fn2_tart
fn2_start
fn2 start
case 1
case 1

这与嵌入式 RTOS 设备环境有关。(MQX) 语言 - C 无论如何,我们是否可以怀疑为什么系统会以这种方式运行。当系统负载重且运行时内存使用量约为 93% 时,就会发生这种情况。

4

1 回答 1

2

如果stdout流在设备驱动程序级别缓冲并且输出由中断处理,那么当缓冲区已满时,如果它被设计为简单地丢弃字符而不是执行阻塞 I/O,那么这将导致字符丢失在输出中。

如果是这种情况,那么实际执行是按照正常顺序进行的(而 Occam 的 Rasor 建议是这种情况),但是一些跟踪输出只是丢失了。这个假设可能得到了格式错误的fn2_tart输出的支持。

使用“printf”作为跟踪方法不是非侵入性的。它既可以影响代码运行方式,也可以受其影响。如果高 CPU 负载周期相对较短,增加缓冲区大小可能会有所帮助,但如果它们是永久持续的,那么任何缓冲量都无法解决问题。

于 2012-02-25T12:30:52.817 回答