裸机环境实现多任务调度(例程及源码)

无RTOS(裸机环境)下实现分时调度法,非常适用于单片机环境下的一般应用场景

RTOS优点不用多说了,但对于一些简单的业务需求,移植一个操作系统又显得非常麻烦,且非常占用系统资源。

通常的做法是在一个大while下执行各个业务函数,通过多个定时器去控制各个函数的执行周期,利用几个全局变量关联各个模块功能。

但这样的做法在多轮开发下,会造成 代码非常臃肿,模块关系混乱,不利于阅读。

为了解决这个问题,手动码了一个简单的多任务调度,封装成接口供大家使用!

实现方式:创建任务时,设定好任务的调度周期和任务函数,通过定时器来计算任务是否达到执行周期,在主循环上执行任务函数。

优点: 
1、占用代码量超小
2、移植超简单
3、程序架构清晰、模块化

管理方式:

1、链表形式(推荐),任务数量无限,通过修改宏TASK_MODE_SELECT为TASK_MODE_LINKED进行条件编译

2、数组形式,任务数量由宏定义TASK_AMOUNT_MAX决定,通过修改宏TASK_MODE_SELECT为TASK_MODE_ARRAY进行条件编译

接口说明:

1、Task_create 创建一个任务,需要传入任务函数指针和执行周期

2、Task_cancel 取消一个任务

3、Task_reckon_time 任务计数,通常放在1mS的定时器中断中执行

4、Task_scheduling 任务调度,主函数上循环调用即可


使用举例:

//任务句柄变量
task_t gTestHandle,gLedHandle,gRtcHandle;

void main(void)
{
    Drive_init();//时钟、外设、IO 初始化
    Time_init();//设定1mS中断一次的定时器

    Task_create(&gTestHandle,"test_task_1",Task_1_fun,NULL,5);//创建一个Task_1_fun 任务 5mS执行一次
    Task_create(&gLedHandle,"test_led",Led_fun,NULL,100);//创建一个Led_fun 任务 100mS执行一次
    Task_create(&gRtcHandle,"test_RTC",RTC_fun,NULL,1000);//创建RTC_fun 任务 1000mS执行一次

    start_time();//启动定时器
    
    while(1)
    {
        Task_scheduling(); //死循环,任务调度
    }
}

//定时器中断回调函数 1mS一次中断 
void CallBack_time_it(void)
{
    Task_reckon_time();//任务周期计算
}

源码参考:github

 

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值