用树莓派产生较为精确的10ms定时 保姆级教程
各位,我的树莓派4B,装的是ubuntu24.04LTS版本。我们都知道,在嵌入式软件开发里,实时性,是个很重要的东西。很多任务都是在一个10ms或者是50ms的任务里完成的。下面,我就写一个保姆级的教程,来教大家产生一个比较精确的10ms定时。没有原理,我从网上查了一下,linux可以有很多方式产生定时,能够产生比较准的定时的,是用posix_timer. 下面就给出我用posix_timer产
·
各位,我的树莓派4B,装的是ubuntu24.04LTS版本。现在,要用树莓派来写软件,驱动很多东西。我们都知道,在嵌入式软件开发里,实时性,是个很重要的东西。很多任务都是在一个10ms或者是50ms的任务里完成的。这需要我们产生一个比较精确的10ms的定时。下面,我就写一个保姆级的教程,来教大家产生一个比较精确的10ms定时。
1. 原理
没有原理,我从网上查了一下,linux可以有很多方式产生定时,能够产生比较准的定时的,是用posix_timer. 下面就给出我用posix_timer产生10ms定时的代码。
2. 代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <wiringPi.h>
// 用wiringPi来输出波形看的
#define LED 25
bool LED_flag=false;
// 用enter键来结束运行用的
bool g_bExit = false;
void PressEnterToExit(void)
{
int c;
while( (c=getchar())!='\n' && c != EOF );
fprintf(stderr, "\nPress enter to exit.\n");
while(getchar()!='\n');
g_bExit = true;
sleep(2);
}
// 这是10ms定时任务的执行函数,也就是10ms_task()
// 一般来说,所有的控制都在这里执行
void handle()
{
time_t t;
char p[32];
time(&t);
strftime(p, sizeof(p), "%T", localtime(&t));
printf("time is %s\n", p);
pinMode(LED, OUTPUT);
if(LED_flag)
{
digitalWrite(LED, 1);
LED_flag=false;
}
else
{
digitalWrite(LED, 0);
LED_flag=true;
}
}
int main()
{
// for posix_timer test
struct sigevent evp={0};
struct itimerspec ts;
timer_t timer;
int ret;
evp.sigev_value.sival_ptr= &timer;
evp.sigev_notify = SIGEV_SIGNAL;
evp.sigev_signo = SIGUSR1;
signal(SIGUSR1, handle);
ret = timer_create(CLOCK_REALTIME, &evp, &timer);
if(ret)
{
perror("timer_create");
return 1;
}
ts.it_interval.tv_sec = 0;
ts.it_interval.tv_nsec = 10*1000*1000; // 10ms
ts.it_value.tv_sec = 0;
ts.it_value.tv_nsec = 10*1000*1000; // 10ms
ret = timer_settime(timer, 0, &ts, NULL);
if(ret)
{
perror("timer_settime");
timer_delete(timer);
return 1;
}
if(wiringPiSetup()<0)
{
perror("wiringPi Setup Error!");
timer_delete(timer);
return 1;
}
while(1)
{
PressEnterToExit();
if(g_bExit)
{
break;
}
}
timer_delete(timer);
return 0;
}
3. 运行结果
gcc -Wall -o a.out my_test.c -lwiringPi


这2个画面连接起来看,可以看到在1s之内,有100个输出,也就是10ms输出一个。如果将树莓派的GPIO25接到示波器上,可以看到50Hz的方波(我这里就不上波形图了)。
可见,实现了10ms较为精确的定时。
4. 好了,大功告成,亲个嘴儿。
更多推荐



所有评论(0)