各位,我的树莓派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. 好了,大功告成,亲个嘴儿。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐