【发布时间】:2014-03-27 23:29:50
【问题描述】:
我有一个嵌入式板和一个连接到它的相机。我正在尝试在嵌入式板的控制台输出上打印来自相机的时间戳。时间戳被访问并加载到一个结构中,并使用 printf 打印出来,如下:
这段代码在循环中。
f.timestamp = hrt_absolute_time(); // Inbuilt function
printf("Timestamp is %u",f.timestamp);
如果运行这些行,它总是打印“Timestamp is 77”。如果我这样做:
counter = 1;
f.timestamp = hrt_absolute_time();
printf("The %d st timestamp is %u",counter,f.timestamp);
如果运行这些行,它会打印“第一个时间戳是”,并且时间戳每秒更新一次。我的问题是,如此微不足道的事情怎么会造成如此巨大的差异?是因为一些旧的 printf 没有清除标准输出缓冲区吗?此模块中没有其他打印语句。有没有人有任何想法?提前致谢!
整个区块:
if (msg->msgid == MAVLINK_MSG_ID_OPTICAL_FLOW) {
mavlink_optical_flow_t flow;
mavlink_msg_optical_flow_decode(msg, &flow);
struct optical_flow_s f;
f.timestamp = hrt_absolute_time();
f.flow_raw_x = flow.flow_x;
f.flow_raw_y = flow.flow_y;
f.flow_comp_x_m = flow.flow_comp_m_x;
f.flow_comp_y_m = flow.flow_comp_m_y;
f.ground_distance_m = flow.ground_distance;
f.quality = flow.quality;
f.sensor_id = flow.sensor_id;
printf("Timestamp is %u",f.timestamp);
//OTHER CODE FOLLOWS
【问题讨论】:
-
我们能看到整个循环吗?从这个例子我看不出有什么明显的错误。我从中看到的唯一可能性是编译器缓存了 hrt_absolute_time 的读取值并且从不更新它,因为它是硬件映射的但没有标记为 volatile。
-
也许你应该试试 2
printf看看发生了什么 printf("the %d st", counter); printf("时间戳为 %u", f.timestamp); -
我不认为uit会是时间戳的缓存值,因为时间戳是以微秒为单位的,所以显然是一个比77大得多的值。我不知道整个循环是不是这样虽然内容丰富..我现在有问题了。
-
只有我能想到的其他事情是
mavlink_msg_optical_flow_decode中可能的内存损坏或timestamp和hrt_absolute_time的 ret 值之间的类型不匹配?和你一样难过。也许编译器警告可能会提供线索。 -
电路板有一个地面控制软件,可以很好地打印这些值。看起来标准输出缓冲区有问题?不确定它是什么,但感谢您的输入。