lezjin 发表于 2024-6-2 17:13:31

44行多任务代码重写

本帖最后由 lezjin 于 2024-8-21 20:31 编辑

更新代码例程,增加串口2发送功能,串口1仿真用,串口2 定义printf函数,打印调试信息,非常好用



参考官方例程和论坛44行写了一个多任务模板,
观察好像就中断函数不太一样,
44行代码中,函数时间只做自减,函数状态在调用时候改变。


官方多任务例程在中断函数中自减函数设定的时间,时间到改变函数状态位。

点两个灯可以正常运行



typedef struct
{
    uint8_t taskstate;             //任务状态
    uint16_t tasktime;             //任务时间片
    uint16_t tasktimeR;      //任务时间重装值
void (*pTaskCb)(void);      //任务函数
}Task_t;

static Task_t g_task[] =
{
//状态计数重装   函数

    {0,   500,    500,      LedCtrlone},
    {0,   5000,   5000,   LedCtrltwo},
      /* Add new task here */

};

#define TASK_MAX (sizeof(g_task) / sizeof(g_task))

static void TaskHandle(void)
{
    uint8_t i;
    for(i = 0; i < TASK_MAX; i++)
    {
      switch (g_task.taskstate)
      {
            case 0:
                g_task.pTaskCb();
                g_task.tasktime = (g_task.tasktimeR);
                g_task.taskstate++;
                break;
            case 2:
                  g_task.taskstate = 0;
                break;
            default:
                if(g_task.tasktime == 0)
                {
                  g_task.taskstate++;
                }
                break;
      }
    }
}

static voidTasktimeSub(void)   
{
    uint8_t i;
    for (i = 0; i < TASK_MAX; i++ )
    {
      if (g_task.tasktime > 0)
      {
            g_task.tasktime--;
      }
    }
}

void main(void)
{
    while(1)
    {
      TaskHandle();
    }
}

void Time0_ISR() interrupt   TMR0_VECTOR   //定时器0中断函数1微秒
{
    TasktimeSub();   
}



lezjin 发表于 2024-6-2 17:20:03

本帖最后由 lezjin 于 2024-6-2 17:22 编辑

两个LED闪烁运行

soma 发表于 2024-6-2 23:49:50

rtos的原型?

zhange 发表于 2024-6-3 05:54:23

{:4_174:}这是啥???还没学到

cyxy 发表于 2024-6-3 06:47:23

能否提供完整源码和示例包

lezjin 发表于 2024-6-3 08:44:46

cyxy 发表于 2024-6-3 06:47
能否提供完整源码和示例包

晚上我把这个点灯的打包一下

lezjin 发表于 2024-6-4 21:42:26

cyxy 发表于 2024-6-3 06:47
能否提供完整源码和示例包

已上传

cyxy 发表于 2024-6-7 10:36:12

上传的 project.uvproj 工程文件打不开

xiangzichen 发表于 2024-6-8 11:21:53

好多时候,我认为时间调度是比操作系统更加有优势的.
因为涉及不到各种保护,
唯一需要注意就是最长任务执行时间不要超过调度周期就好了.
需要延时的,搞个状态机就好.

lezjin 发表于 2024-6-9 18:03:03

cyxy 发表于 2024-6-7 10:36
上传的 project.uvproj 工程文件打不开

大概率版本问题,我的是960a
页: [1] 2
查看完整版本: 44行多任务代码重写