找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2188|回复: 8
收起左侧

真正的程序框架 简洁小巧的软件定时器 , 已附移植视频,盖到20楼送源码

[复制链接]
ID:886627 发表于 2021-2-26 12:03 | 显示全部楼层 |阅读模式
还在用各种标志位 全局变量搞定时器,换种更优雅的方式吧

好了首先搞个需求引入 软件定时器的这个话题吧。

需求1:让4个任务分别以1000ms、500ms、500ms、800ms周期性执行。怎么弄
直接给出需求1的代码:
/*-----------------------------------------------------*/
void test1(void)
{
    MLPeriod.init();
    while (1) {
        MLPeriod.run();
        if (MLPeriod.check(1000)) {
            //task1
        }
        if (MLPeriod.check(500)) {
            //task2
        }
        if (MLPeriod.check(500)) {
            //task3
        }
        if (MLPeriod.check(800)) {
            //task4
        }
    }
}

/*-----------------------------------------------------*/
需求2让20个变量,分别以111,111,123,127,118,99,88,58,58,47,33,38,29,1111,2456,678,6789,457,451,20毫秒 周期性变化
                怎么弄?
直接给出应用代码:
/*-----------------------------------------------------*/
ml_u32_t var[20] = {0}; //20个变量
ml_u32_t init_period[20] = {111, 111, 123, 127, 118, 99, 88, 58, 58, 47, 33, 38, 29, 1111, 2456, 678, 6789, 457, 451, 20}; //20个变量的周期值
void test (void)
{
    ml_u32_t j;
    MLPeriod.init();
    while (1) {
        MLPeriod.run();
        for (j = 0; j < 20; j++) {
            if (MLPeriod.check(init_period[j])) {
                var[j]++;
            }
        }
    }
}

/*-----------------------------------------------------*/


代码是不是看起来很简单 没错!使用起来就是这么简单

移植视频如下(单机鼠标可放大):

keil51_Simulator.gif

源码链接:


有疑问或者建议请跟帖回复





评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:605142 发表于 2021-2-26 21:38 | 显示全部楼层
搞得太复杂了,应该精简一下
回复

使用道具 举报

ID:605142 发表于 2021-2-26 21:45 | 显示全部楼层
启动定时器的地方,和检测定时器的地方经常是不在一起的,所以还是要变量中转
回复

使用道具 举报

ID:886627 发表于 2021-2-27 08:45 | 显示全部楼层
应用场景
周期触发定时器(MLPeriod),适用于对首次触发时间要求不严格的场合。比如,让LED以280ms周期性亮灭。这种情况下我们并不关心LED首次由灭到亮用了多长时间,我们只要求LED在以后的时间以准确的280ms周期性亮灭。

单次触发定时器(MLShot),适用于对首次触发时间要求严格的场合。另外MLshot定时器自动停止后,调用启动函数MLShot.start,亦可实现周期触发。


API接口
microLite_timer支持的MLPeriod接口主要包括:

MLPeriod.Init,初始化定时器;
MLPeriod.run;
MLPeriod.check,检查定时器是否超时。
microLite_timer支持的MLShot接口主要包括:

MLShot.start,启动定时器;
MLShot.stop,停止定时器;
MLShot.check,检查定时器是否超时。
回复

使用道具 举报

ID:886627 发表于 2021-2-27 08:47 来自手机 | 显示全部楼层
hefq 发表于 2021-2-26 21:38
搞得太复杂了,应该精简一下

一看内容太多,估计你就没细看
回复

使用道具 举报

ID:97678 发表于 2021-2-27 10:34 | 显示全部楼层
没有看明白! 在研究研究!
回复

使用道具 举报

ID:478073 发表于 2021-2-27 10:56 | 显示全部楼层
明明一个简单的指针能摆平的事,硬是要搞得这么复杂,制造麻烦!
回复

使用道具 举报

ID:886627 发表于 2021-2-27 12:56 | 显示全部楼层
春风十里吹死你 发表于 2021-2-27 10:56
明明一个简单的指针能摆平的事,硬是要搞得这么复杂,制造麻烦!

talk is sheep, show me your code
回复

使用道具 举报

ID:886627 发表于 2021-3-5 07:20 来自手机 | 显示全部楼层
版主  51hei   就是51hei51?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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