0

我对在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);
    }
}

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

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

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

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

4

1 回答 1

2

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

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

于 2020-06-26T18:40:00.580 回答