/usr/bin/sn.core.elf getstat 该指令打印的是Status:WR mode : WRC_SLAVE_WR0 wr0 -> lnk:1 rx:3009 tx:15889 lock:1 syncs:wr0 sv:1 ss:'TRACK_PHASE' aux:0 sec:6328 nsec:312981472 mu:867139 dms:418560 dtxm:138191 drxm:294473 dtxs:46407 drxs:172643 asym:30019 crtt:215425 cko:-9 setp:8781 hd:56899 md:31800 ad:65000 ucnt:737 wr1 -> lnk:0 rx:18853 tx:7362 lock:1 temp: 39.562 C Time: Thu, Jan 1, 1970, 01:45:28 +991471232 nanoseconds. 用c调用该指令 并将temp mu dms crtt的值保存到一个文本中 且保证文本掉电不丢失数据 其中mu dms crtt的值需要判断 当wr0->lnk:为1 则将获取到的mu dms crtt的值存到WR1这一行 当wr1->lnk:为1 则将获取到的mu dms crtt的值村到WR0这一行
时间: 2023-08-11 17:07:01 浏览: 182
好的,您的问题是如何用 C 语言调用 `/usr/bin/sn.core.elf getstat` 命令,并将其中的 `temp`、`mu`、`dms` 和 `crtt` 四个值保存到一个文本文件中,同时保证数据不会因掉电而丢失,在 `wr0` 和 `wr1` 之间根据 `lnk` 的值进行切换。
这个问题的解决可以分为以下几个步骤:
1. 使用 `popen` 函数调用 `/usr/bin/sn.core.elf getstat` 命令,并将输出读入到一个缓冲区中。
2. 从缓冲区中解析出 `temp`、`mu`、`dms` 和 `crtt` 四个值,并根据 `wr0->lnk` 和 `wr1->lnk` 的值判断应该将这些值保存到哪一行。
3. 将这些值保存到一个文本文件中,并使用 `fsync` 函数确保数据被写入到磁盘中,并不会因掉电而丢失。
下面是一个可能的实现,供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFSIZE 4096
#define FILENAME "/var/data.txt"
int main() {
FILE *fp;
int fd;
char buf[BUFSIZE], *p;
int temp, mu, dms, crtt;
int lnk0, lnk1;
fp = popen("/usr/bin/sn.core.elf getstat", "r");
if (fp == NULL) {
perror("popen");
exit(1);
}
fgets(buf, BUFSIZE, fp);
p = strstr(buf, "temp: ");
if (p == NULL) {
printf("Invalid output format\n");
exit(1);
}
sscanf(p + strlen("temp: "), "%d", &temp);
p = strstr(buf, "mu:");
if (p == NULL) {
printf("Invalid output format\n");
exit(1);
}
sscanf(p + strlen("mu:"), "%d", &mu);
p = strstr(buf, "dms:");
if (p == NULL) {
printf("Invalid output format\n");
exit(1);
}
sscanf(p + strlen("dms:"), "%d", &dms);
p = strstr(buf, "crtt:");
if (p == NULL) {
printf("Invalid output format\n");
exit(1);
}
sscanf(p + strlen("crtt:"), "%d", &crtt);
pclose(fp);
fd = open(FILENAME, O_WRONLY | O_CREAT | O_SYNC, 0644);
if (fd == -1) {
perror("open");
exit(1);
}
lnk0 = (strstr(buf, "wr0 -> lnk:1") != NULL);
lnk1 = (strstr(buf, "wr1 -> lnk:1") != NULL);
if (lnk0) {
dprintf(fd, "WR0: %d %d %d\n", mu, dms, crtt);
} else if (lnk1) {
dprintf(fd, "WR1: %d %d %d\n", mu, dms, crtt);
} else {
printf("No WR link found\n");
exit(1);
}
dprintf(fd, "temp: %d\n", temp);
if (fsync(fd) == -1) {
perror("fsync");
exit(1);
}
close(fd);
return 0;
}
```
注意,这个程序假设输出中只有一个 `wr0` 和一个 `wr1`,并且它们的顺序是固定的。如果实际情况不是这样的,需要对代码进行适当修改。此外,为了保证数据不会因掉电而丢失,程序使用了 `O_SYNC` 标志打开文件,这会导致写入文件的操作变得较慢,因此在实际使用中需要权衡速度和数据安全的需求。
阅读全文