lzzasd 发表于 2024-5-9 13:20:41

tzz1983 发表于 2024-4-6 09:51
是的, 不适合新人, 还是直接用函数名调用比较容易
这个本身就是调用函数名来运行任务函数的   
只是函数名以格构体的方式存储的   
格构体内有任务时间间隔等参数   
按照结构体数据编号逐次运行   
最主要的是没有公共延迟函数   
谁能补充下就很好用了

lzzasd 发表于 2024-5-9 13:34:47

liuyuhe 发表于 2024-4-24 17:45
如果任务的执行时间大于系统的轮询时间,那是先执行完当前的任务还是跳出当前任务执行下一个任务 ...
轮询时间是最小切换时间片   
也就是说任务最小切换时间就是轮询时间   
当任务小于轮询时间时任务结束后不会立即切换到下一个任务   
而是等到轮询时间到来才切换   
同样任务超过轮询时间也不会打断
等运行完后等轮询程序来调度

西红柿牛柳 发表于 2024-7-3 11:44:56

{:4_250:}

大锤子 发表于 2024-8-20 22:03:18

看了大佬们的讨论,感觉自己的知识实在太少了。
我有个工程打算用这种多任务调度方式,
使用sdcc实现,但是效果出乎意料,
能否帮忙看下:代码:
https://gitee.com/dchuizi/temperature-and-humidity.git   
有帖子描述了问题显现:
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10208

_NCY_ 发表于 2024-10-2 08:34:09

这个方便确实方便,比RTOS简单。
但这不就跟一while到底,外加一堆cnt和if“切换任务”没本质区别了。
缺点是,一阻塞就死了,并不能高效利用cpu。
不如能抢占的rtos,毕竟在dma的阻塞等待时,
在漫长的waitbusy时,谁不想切换任务干点别的呢

hewayking 发表于 2024-11-25 11:03:39

我在STC8A8K64D4上用过这种结构,实质还是一个大循环只是大循环里函数,
设定了定时器0控制 多长时间函数执行一次而已(如果别的在执行也得等),
不是单纯的裸机循序执行而已。   

本质就是大循环轮到我了我可以不执行(不需要频繁更新的让出时间给其他);
轮不到我只能等到轮到我。

跟IF(time1>=xx){hanshu1;}    IF(time1>=xx){hanshu2;}    没有本质区别

lgnstar 发表于 2024-12-7 09:22:11

<p>感谢分享</p>

是三三啊 发表于 2024-12-16 17:17:37

<p>定时器调度和操作系统调度有什么区别啊</p>

scpcw 发表于 2025-2-12 22:24:25

大神呀,你唾弃我这个小白吧.我这个跑馬灯的程序结果就是P37,最后一个灯一直亮.试了一晚上了.
指点一下吧
static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
      {0, 500,   500,   LED_Lamp},                /* task 1 Period: 1ms */
      {0, 500,   500,   test},                /* task 1 Period: 1ms */
      

      /* Add new task here */
};

u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps);

//========================================================================



void LED_init(void)
{
      LED_port=0; //做测试用,开机有全亮灯的动作.
}

//========================================================================
// 函数: Sample_Lamp
// 描述: 用户应用程序.
// 参数: None.
// 返回: None.
// 版本: V1.0, 2020-09-23
//========================================================================
void LED_Lamp(void)
{
      
      u8 i;
      
      
      delay_ms(200);
      for(i=0;i<8;i++)
      {
                LED_port= ~(1<<i);
      }
               
      
      
}

void test(void)
{
      delay_ms(10);
}

scpcw 发表于 2025-2-12 22:29:45


把LED_lamp()函数改成这样好像看到苗头了..

while(1)
        {
               
                for(i=0;i<8;i++)
                {
                        for(o=0x10;o!=0;o--)
                        {
                                for(m=0xff;m!=0;m--)
                                {
                                        for(n=0xff;n!=0;n--);
                                }       
                        }
                        P3=~(0x1<<i);               
                       
                }
               
               
        }
页: 1 2 3 4 [5] 6
查看完整版本: 任务调度方法,【无错,至简】!“多任务分时调度”