在一些/sys设备或者文件代码设置操作中,大家可能会用到open/fopen/system三种sys操作,
在测试中需要尽快启动一个pwm信号:
int StartSecPulse(bool onesec,bool onoff)
{
pid_t status = 0;
int fd = 0;
char buffer[64];
struct timespec time1 = { 0, 0 };
struct timespec time2 = { 0, 0 };
struct timespec ts;
FILE *p=NULL;
clock_gettime(CLOCK_REALTIME, &time1);
fd = open("/sys/devices/ocp/48300000.epwmss/48300200.ehrpwm/pwm/pwmchip0/pwm1/period",O_RDWR);
//fprintf(p,"%d",700000000);
write(fd,"600000000",sizeof("700000000"));
close(fd);
clock_gettime(CLOCK_REALTIME, &time2);
printf("StartSecPulse CLOCK_REALTIME:sec= %d, nsec = %d\n", time1.tv_sec, time1.tv_nsec);
printf("StartSecPulse CLOCK_REALTIME 2:sec= %d, nsec = %d\n", time2.tv_sec, time2.tv_nsec);
#if 1
clock_gettime(CLOCK_REALTIME, &time1);
p = fopen("/sys/devices/ocp/48300000.epwmss/48300200.ehrpwm/pwm/pwmchip0/pwm1/period","w");
fprintf(p,"%d",700000000);
fclose(p);
clock_gettime(CLOCK_REALTIME, &time2);
printf("StartSecPulse CLOCK_REALTIME:sec= %d, nsec = %d\n", time1.tv_sec, time1.tv_nsec);
printf("StartSecPulse CLOCK_REALTIME 2:sec= %d, nsec = %d\n", time2.tv_sec, time2.tv_nsec);
clock_gettime(CLOCK_REALTIME, &time1);
sprintf(buffer, "echo 1000000000 > /sys/devices/ocp/48300000.epwmss/48300200.ehrpwm/pwm/pwmchip0/pwm1/period");
status = system(buffer);
if (-1 == status && WIFEXITED(status) && (WEXITSTATUS(status) == 0))
return -1;
clock_gettime(CLOCK_REALTIME, &time2);
printf("StartSecPulse CLOCK_REALTIME:sec= %d, nsec = %d\n", time1.tv_sec, time1.tv_nsec);
printf("StartSecPulse CLOCK_REALTIME 2:sec= %d, nsec = %d\n", time2.tv_sec, time2.tv_nsec);
#endif
return 0;
-----------------测试数据------------
# ./testapi_so secpulse 1
test_secpulse:
CLOCK_REALTIME:sec= 87055, nsec = 459398823
StartSecPulse CLOCK_REALTIME:sec= 87055, nsec = 459558114
StartSecPulse CLOCK_REALTIME 2:sec= 87055, nsec = 459809948
StartSecPulse CLOCK_REALTIME:sec= 87055, nsec = 459868781
StartSecPulse CLOCK_REALTIME 2:sec= 87055, nsec = 460768489
StartSecPulse CLOCK_REALTIME:sec= 87055, nsec = 460819489
StartSecPulse CLOCK_REALTIME 2:sec= 87055, nsec = 468688031
# ./testapi_so secpulse 1
test_secpulse:
CLOCK_REALTIME:sec= 87072, nsec = 674135741
StartSecPulse CLOCK_REALTIME:sec= 87072, nsec = 674294408
StartSecPulse CLOCK_REALTIME 2:sec= 87072, nsec = 674547491
StartSecPulse CLOCK_REALTIME:sec= 87072, nsec = 674604158
StartSecPulse CLOCK_REALTIME 2:sec= 87072, nsec = 675504450
StartSecPulse CLOCK_REALTIME:sec= 87072, nsec = 675559700
StartSecPulse CLOCK_REALTIME 2:sec= 87072, nsec = 683437241
# ./testapi_so secpulse 1
test_secpulse:
CLOCK_REALTIME:sec= 87240, nsec = 695442261
StartSecPulse CLOCK_REALTIME:sec= 87240, nsec = 695603803
StartSecPulse CLOCK_REALTIME 2:sec= 87240, nsec = 695852845
StartSecPulse CLOCK_REALTIME:sec= 87240, nsec = 695909636
StartSecPulse CLOCK_REALTIME 2:sec= 87240, nsec = 696797095
StartSecPulse CLOCK_REALTIME:sec= 87240, nsec = 696849886
StartSecPulse CLOCK_REALTIME 2:sec= 87240, nsec = 704839970
根据上面的log打印信息,nsec两个时间的差值,open操作的效率是最高的,fopen次之,system调用是最慢的。