找回密码
 立即注册
查看: 317|回复: 16

关于AI8051U任务调度函数

[复制链接]
已绑定手机

8

主题

42

回帖

134

积分

注册会员

积分
134
发表于 2026-10-3 21:54:56 | 显示全部楼层 |阅读模式
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
        if(Task_Comps[i].TIMCount)      /* If the time is not 0 */
        {
            Task_Comps[i].TIMCount--;   /* Time counter decrement */
            if(Task_Comps[i].TIMCount == 0) /* If time arrives */
            {
                /*Resume the timer value and try again */
                Task_Comps[i].TIMCount = Task_Comps[i].TRITime;  
                Task_Comps[i].Run = 1;      /* The task can be run */
            }
        }
    }
}大家没发现这个函数有问题吗?这个是官方例程里面的。好奇怪!

回复

使用道具 举报 送花

已绑定手机

8

主题

42

回帖

134

积分

注册会员

积分
134
 楼主| 发表于 2026-10-3 21:58:17 | 显示全部楼层
正确的定法应该是
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
        if(Task_Comps[i].TIMCount)      /* If the time is not 0 */
        {
            Task_Comps[i].TIMCount--;   /* Time counter decrement */
        }
            if(Task_Comps[i].TIMCount == 0) /* If time arrives */
            {
                /*Resume the timer value and try again */
                Task_Comps[i].TIMCount = Task_Comps[i].TRITime;  
                Task_Comps[i].Run = 1;      /* The task can be run */
            }
    }
}

或者
void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
        if(Task_Comps[i].TIMCount)      /* If the time is not 0 */
        {
            Task_Comps[i].TIMCount--;   /* Time counter decrement */
        }
          else  if(Task_Comps[i].TIMCount == 0) /* If time arrives */
            {
                /*Resume the timer value and try again */
                Task_Comps[i].TIMCount = Task_Comps[i].TRITime;  
                Task_Comps[i].Run = 1;      /* The task can be run */
            }
    }
}

按理说官方的函数应该是不能运行的才对呀
回复

使用道具 举报 送花

已绑定手机

2

主题

153

回帖

466

积分

中级会员

积分
466
发表于 2026-10-4 11:18:50 | 显示全部楼层
你的第一个功能正常,但没官方效率高,
注意,官方只有在TIMCount减少时才判断是否==0,
你每次都判断,这部分是无用功,区别就在这。

你的第二可以用,但误差一拍,
TIMCount减到0后,下一回定时才判断==0,延迟多了一定时周期。
假设定时器是1ms,如本来期望10ms,结果是11ms才触发。


回复

使用道具 举报 送花

已绑定手机

8

主题

42

回帖

134

积分

注册会员

积分
134
 楼主| 发表于 2026-10-4 11:27:06 | 显示全部楼层
jrc*** 发表于 2026-10-4 11:18
你的第一个功能正常,但没官方效率高,
注意,官方只有在TIMCount减少时才判断是否==0,
你每次都判断,这部 ...

官方的有个BUG,因为是FOR循环,当有中断产生时,FOR被打断,然后永远都进不了TIMCount==0这个判断里面,也就无法重装数值。你可以把定时器设置为100uS试试。我是做项目才发现这个问题的,如果只是用官方的原程序测试根本不会发现有什么问题。
回复

使用道具 举报 送花

已绑定手机

2

主题

153

回帖

466

积分

中级会员

积分
466
发表于 2026-10-4 11:31:06 | 显示全部楼层
Tank*** 发表于 2026-10-4 11:27
官方的有个BUG,因为是FOR循环,当有中断产生时,FOR被打断,然后永远都进不了TIMCount==0这个判断里面, ...

被中断抢占,在原中断完成后,还会返回来继续执行,没问题的
回复

使用道具 举报 送花

已绑定手机

8

主题

42

回帖

134

积分

注册会员

积分
134
 楼主| 发表于 2026-10-4 11:36:09 | 显示全部楼层
jrc*** 发表于 2026-10-4 11:31
被中断抢占,在原中断完成后,还会返回来继续执行,没问题的

你试试。我是碰到了这情况才做的验证。正常情况下中断后是返回断点接着运行的。
回复

使用道具 举报 送花

已绑定手机

2

主题

153

回帖

466

积分

中级会员

积分
466
发表于 2026-10-4 11:39:50 | 显示全部楼层
不用试,mcu,cpu,是这么设计的,
中断原理是这样的:
中断执行时,备份现场,切换到中断服务,
中断完成后返回,恢复中断前的现场,
继续执行,即返回原来挂起的位置。
回复

使用道具 举报 送花

已绑定手机

8

主题

42

回帖

134

积分

注册会员

积分
134
 楼主| 发表于 2026-10-4 11:43:45 | 显示全部楼层
jrc*** 发表于 2026-10-4 11:39
不用试,mcu,cpu,是这么设计的,
中断原理是这样的:
中断执行时,备份现场,切换到中断服务,

那就当我没有说过。
回复

使用道具 举报 送花

已绑定手机

307

主题

582

回帖

2957

积分

金牌会员

积分
2957
发表于 2026-10-4 12:28:19 | 显示全部楼层
Tank*** 发表于 2026-10-3 21:58
正确的定法应该是
void Task_Marks_Handler_Callback(void)
{

没多大区别,不都一样吗?我的写法


void Task_Marks_Handler_Callback(void)
{
    u8 i;
    for(i=0; i<Tasks_Max; i++)
    {
        if( !--Task_Comps.TIMCount)      /* If the time is not 0 */
        {
                /*Resume the timer value and try again */
              Task_Comps.TIMCount = Task_Comps.TRITime;  
              Task_Comps.Run = 1;      /* The task can be run */
        }
    }
}

回复

使用道具 举报 送花

已绑定手机

8

主题

42

回帖

134

积分

注册会员

积分
134
 楼主| 发表于 2026-10-4 12:39:16 | 显示全部楼层
QQ6243*** 发表于 2026-10-4 12:28
没多大区别,不都一样吗?我的写法

这个效率高!都说论坛藏大神!
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 10:35 , Processed in 0.078832 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表