Трассировки для вызова функции в одном потоке, по-видимому, не в том порядке, который ожидается

У меня есть поток, который делает вызов функции,

 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% использования памяти.

1 ответ

Решение

Если поток stdout буферизуется на уровне драйвера устройства и обрабатывается outout прерыванием, то когда буфер заполнен, и если он предназначен для простого отбрасывания символов, а не для блокирования ввода-вывода, то это приведет к потере символов на выходе.

Если это так, то фактическое выполнение следует нормальной последовательности (и Rasor Оккама скорее предполагает, что это будет так), но некоторые выходные данные трассировки просто теряются. Возможно, эта гипотеза подтверждается fn2_tart выход.

Использование "printf" в качестве метода трассировки не является навязчивым. Это может как влиять, так и зависеть от того, как работает ваш код. Увеличение размера буфера может помочь, если периоды высокой загрузки ЦП являются относительно короткими, но если они постоянно поддерживаются, никакое количество буферизации не решит проблему.

Другие вопросы по тегам