中级会员
 
- 积分
- 214
- 金钱
- 214
- 注册时间
- 2014-4-30
- 在线时间
- 26 小时
|
在物联网开发中,有可能会接收到服务器的定时任务,参考Linux内核中的定时任务,采用cron表达式简单明了,但是没有现成的代码,Linux内核中的crond.c中有相关的代码,但是不能直接使用在stm32或者其他内核的单片机上面。这一块用的人不多,网上的资料也比较少,基于stm32的基本上没有。
我花了一周的时间去研究,目前基本的版本能够暂时满足需求,但是想解析任何的cron表达式,需要自己做二次加工了,暂时比较忙,等后面有时间了新建一个工程,把代码贡献出来。
主要思路就是:首先建立一个结构体
typedef struct {
/* ordered by size, not in natural order. makes code smaller: */
char cl_Yars[100]; /* 0-99 */ //year begin 2000
char cl_Mons[12]; /* 1-12 */
char cl_Days[31]; /* 1-31 */
char cl_Weks[7]; /* 1-7, beginning sunday */
char cl_Hors[24]; /* 0-23 */
char cl_Mins[60]; /* 0-59 */
char cl_Secs[60]; /* 0-59 */
} CronLine;
然后把cron表达式中的时间点字符串转化成数字,然后把结构体中的相应位置1,
for(tt=0; tt<strlen(crons);tt++)
{
if(crons[tt] != ' ')
{
tokens[j][k++]=crons[tt];
}
else
{
tokens[j][k]='\0';
// printf("t[%d][%d] = %s\r\n",j,k,tokens[j]);
j++;
k = 0;
}
}
memset(&line[t],0,sizeof(line[t]));
// Parse( line.cl_Secs, 60,tokens[0]);
Parse( line.cl_Mins, 60,tokens[1]);
Parse( line.cl_Hors, 24,tokens[2]);
Parse( line.cl_Days, 31,tokens[3]);
Parse( line.cl_Mons, 12,tokens[4]);
Parse( line.cl_Weks, 7,tokens[5]);
// if(tokens[6] == RT_NULL)
// memset(line.cl_Yars,0x01,sizeof(line.cl_Yars)-1);
// else
// Parse( line.cl_Yars,100,tokens[6]);
print_array( line.cl_Mins, 60);
print_array( line.cl_Hors, 24);
print_array( line.cl_Days, 31);
print_array( line.cl_Mons, 12);
print_array( line.cl_Weks, 7);
// 关键步骤:将cron转化为time
cron_find_latest_time_piont(&line,tab);
下一步就根据当前的时间查找最近的几个执行时间点,然后转化为时间,就得到了执行的时间点,最后判断是否到了这个时间点。
|
|