【问题标题】:Jetson Nano Temperature CJetson Nano 温度 C
【发布时间】:2020-10-17 09:07:27
【问题描述】:

我对这段代码有几个问题,在 jetson nano 上运行:

#include "stdio.h"
#include "unistd.h"
#include "stdlib.h"

float gputemp = 0;
float cputemp = 0;
int count = 0;

int main() {
    char* cpu;
    char* gpu;
    cpu = (char*)malloc(sizeof(char)*6);
    gpu = (char*)malloc(sizeof(char)*6);
    

    while (1) {
        FILE* fcputemp = fopen("/sys/devices/virtual/thermal/thermal_zone1/temp", "r");
        FILE* fgputemp = fopen("/sys/devices/virtual/thermal/thermal_zone2/temp","r");
        if (!fcputemp || !fgputemp ) {
            printf("Something went wrong\n");
            exit(EXIT_FAILURE);
        }
        
        cputemp = atoi(fgets(cpu, 6, fcputemp))/1000;
        gputemp = atoi(fgets(gpu, 6, fgputemp))/1000;
        
        printf("\rCpu : %.2f, Gpu : %.2f. Elapsed time : %d", cputemp, gputemp, count);
        fflush(stdout);
        
        fclose(fcputemp);
        fclose(fgputemp);
        
        count++;
        sleep(1);
    }
}

在这里我必须打开,获取温度,然后在每次循环迭代时关闭文件,以获得有效数据(并且不要出现段错误)。 我关心的是执行此操作所需的(昂贵的)内核开关的数量。

我知道过早的优化是邪恶的,但是还有另一种方法(或者可能是正确的方法)可以做到这一点,只打开一次文件?

如果我打开传感器接口(文件),为什么它不能自行更新?

P.S:是的,我知道,我没有释放 cpu 或 gpu 变量,这只是“演示”代码(看看我如何测量经过的时间,哈哈)

【问题讨论】:

  • 为什么是malloc?除非这些结构太大而无法放入堆栈,否则只需使用直列数组即可。您只是将它们用作暂存缓冲区,因此 char buffer[1024] 就足够了。
  • @tadman 是的,我使用了一个数组,但我遇到了段错误,所以我用 malloc 更改了它,但问题不存在,所以这是一个剩余的。同样,这只是一个演示代码,我并没有试图尽可能严格。
  • 如果您遇到段错误,第一步应该是将其放入调试器并找出原因,而不仅仅是随机切换。
  • A) 为什么 cputempgputemp 是全局变量? B) 如果你想要浮点值,为什么你使用atoi 而不是atof
  • @tadman,去 gdb 是我做的第二件事,我同意,应该是第一步。实际上谢谢B),在过程中从int更改为float并没有改变(我也不认为我需要浮点数,温度计的精度应该是度数,我必须检查)。对于 A),同样,它的 DEMO 代码甚至没有尝试将其作为良好实践的定义

标签: c linux nvidia-jetson-nano


【解决方案1】:

我不确定您是否可以只打开一次文件。您可以尝试倒带,但 sysfs 不是“真正的”文件系统,那些也不是真正的文件。如果您倒带,您可能会一遍又一遍地获得相同的数据,尤其是在使用像 fopen() 这样的缓冲调用时。

打开操作是准备读取数据的操作。由于这一切都由内核管理,因此开销应该很小,并且没有实际的磁盘活动。考虑到像 top 这样的程序每秒读取数千个这样的程序,这没什么大不了的。

【讨论】:

  • 其实rewind()可以解决问题,非常感谢!
  • @Rob 这真的很有趣,感谢您的测试!
  • 其实我错了。经过一些更深入的测试,结果证明这是错误的结果,所以我回到了每次迭代的打开和关闭。还是谢谢你!
猜你喜欢
  • 2019-11-19
  • 2020-06-07
  • 2022-07-03
  • 2021-10-26
  • 2020-04-30
  • 1970-01-01
  • 2021-06-17
  • 2020-04-07
  • 2020-01-15
相关资源
最近更新 更多