本帖最后由 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[0]))
-
- static void TaskHandle(void)
- {
- uint8_t i;
- for(i = 0; i < TASK_MAX; i++)
- {
- switch (g_task[i].taskstate)
- {
- case 0:
- g_task[i].pTaskCb();
- g_task[i].tasktime = (g_task[i].tasktimeR);
- g_task[i].taskstate++;
- break;
- case 2:
- g_task[i].taskstate = 0;
- break;
- default:
- if(g_task[i].tasktime == 0)
- {
- g_task[i].taskstate++;
- }
- break;
- }
- }
- }
-
- static void TasktimeSub(void)
- {
- uint8_t i;
- for (i = 0; i < TASK_MAX; i++ )
- {
- if (g_task[i].tasktime > 0)
- {
- g_task[i].tasktime--;
- }
- }
- }
-
- void main(void)
- {
- while(1)
- {
- TaskHandle();
- }
- }
-
- void Time0_ISR() interrupt TMR0_VECTOR //定时器0中断函数1微秒
- {
- TasktimeSub();
- }
复制代码
|