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:22 编辑
两个LED闪烁运行
rtos的原型? {:4_174:}这是啥???还没学到 能否提供完整源码和示例包 cyxy 发表于 2024-6-3 06:47
能否提供完整源码和示例包
晚上我把这个点灯的打包一下 cyxy 发表于 2024-6-3 06:47
能否提供完整源码和示例包
已上传 上传的 project.uvproj 工程文件打不开 好多时候,我认为时间调度是比操作系统更加有优势的.
因为涉及不到各种保护,
唯一需要注意就是最长任务执行时间不要超过调度周期就好了.
需要延时的,搞个状态机就好.
cyxy 发表于 2024-6-7 10:36
上传的 project.uvproj 工程文件打不开
大概率版本问题,我的是960a
页:
[1]
2