OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2864|回复: 1

单片机上用C语言解析出服务器的cron表达式,并实现了cron的解析和执行

[复制链接]

22

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-4-30
在线时间
26 小时
发表于 2020-5-14 18:17:19 | 显示全部楼层 |阅读模式
在物联网开发中,有可能会接收到服务器的定时任务,参考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);


下一步就根据当前的时间查找最近的几个执行时间点,然后转化为时间,就得到了执行的时间点,最后判断是否到了这个时间点。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-14 18:17:19 | 显示全部楼层
帮顶,大家来帮忙解答一下。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-1 02:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表