[STM8] 求助:任务调度老死机。

[复制链接]
2437|25
 楼主| 斗转乾坤 发表于 2015-6-25 16:41 | 显示全部楼层 |阅读模式
在STM8写了一个任务调度器,总是运行一会就卡死。
typedef struct {
    void(*funname)();
    unsigned int delaytime[2];
    unsigned char flag;
}TASK_DEF;


extern TASK_DEF Task[];extern void (*function)(void);

调度器:
void exchang_fun(void)
{   unsigned char i;
    while(1)
    {    for(i = 0;i < maxtask;i++)
        {
            if((Task.flag==1)&&(Task.delaytime[0]==0))
            {   
                Task.delaytime[0] = Task.delaytime[1];

                Task.flag = 0;
                function=Task.funname;
                (*function)();
            }
        }      
    }
}
中断函数:
@far @interrupt void TIM4_IRQ(void)
{
    unsigned char id;
    TIM4_SR = 0x00;
    for(id=0;id<maxtask;id++)
    {
        if(Task[id].delaytime[0]>0)
        {
            Task[id].delaytime[0]--;
        }
        if(Task[id].delaytime[0]==0)
        {
            Task[id].flag = 1;
        }
    }

}

为什么总是卡死?



 楼主| 斗转乾坤 发表于 2015-6-25 18:24 | 显示全部楼层
求解答
e_007 发表于 2015-6-25 18:53 | 显示全部楼层
本帖最后由 e_007 于 2015-6-25 19:03 编辑

...
戈卫东 发表于 2015-6-25 18:54 | 显示全部楼层
中断和你的调度器访问同样的变量但没有安全措施
 楼主| 斗转乾坤 发表于 2015-6-25 19:03 | 显示全部楼层
e_007 发表于 2015-6-25 18:53
TIM就是定时中断了,干么里面还有时间相关代码?

我定时1ms,delaytime[2]是延时长度;
e_007 发表于 2015-6-25 19:07 | 显示全部楼层
本帖最后由 e_007 于 2015-6-25 20:42 编辑
斗转乾坤 发表于 2015-6-25 19:03
我定时1ms,delaytime[2]是延时长度;

LS说的也可能,task等值没锁,可去参照下os用法.
 楼主| 斗转乾坤 发表于 2015-6-25 19:08 | 显示全部楼层
戈卫东 发表于 2015-6-25 18:54
中断和你的调度器访问同样的变量但没有安全措施

是的,这个有哪些方法解决吗?我在结构体定义出修改了delaytime类型(int delaytime[2]),然后把Task[id].delaytime[0]==0改为Task[id].delaytime[0]<=0;就OK了;
 楼主| 斗转乾坤 发表于 2015-6-25 19:18 | 显示全部楼层
再问一下:我有下面这样类型数组,如何判定数组为空?
typedef struct {
    void(*funname)();
     int delaytime[2];
    unsigned char flag;
}TASK_DEF;

TASK_DEF Task[5];
如何判断Task[i]是否为空?(就是没有数据在里面)
是不是:if(Task[id]=='\0')或if(Task[id]==NULL)   但是出错啊。
戈卫东 发表于 2015-6-25 20:00 | 显示全部楼层
先把C语言弄熟悉吧。。。。。。。。。
戈卫东 发表于 2015-6-25 20:00 | 显示全部楼层
写操作系统这种事情先不要急。。。。。。
yklstudent 发表于 2015-6-25 21:32 | 显示全部楼层
斗转乾坤 发表于 2015-6-25 19:18
再问一下:我有下面这样类型数组,如何判定数组为空?
typedef struct {
    void(*funname)();

Task[id].funname == NULL
可以尝试这个
hnkf118 发表于 2015-6-25 22:50 | 显示全部楼层
是写法不安全造成的。 最基本的 C指针 你就没做安全处理。
菜鸟同学 发表于 2015-6-26 10:41 来自手机 | 显示全部楼层
这个不算是调度,只能算是软时钟,这些问题调试就能出来,没有判断回调函数的合法性。
 楼主| 斗转乾坤 发表于 2015-6-26 11:06 | 显示全部楼层
yklstudent 发表于 2015-6-25 21:32
Task.funname == NULL
可以尝试这个

嗯嗯,试试
 楼主| 斗转乾坤 发表于 2015-6-26 11:08 | 显示全部楼层
hnkf118 发表于 2015-6-25 22:50
是写法不安全造成的。 最基本的 C指针 你就没做安全处理。

:handshake,如何进行安全处理?菜鸟求教:lol
 楼主| 斗转乾坤 发表于 2015-6-26 11:10 | 显示全部楼层
菜鸟同学 发表于 2015-6-26 10:41
这个不算是调度,只能算是软时钟,这些问题调试就能出来,没有判断回调函数的合法性。 ...

调度是不是还要加上任务堆栈来保护数据?
 楼主| 斗转乾坤 发表于 2015-6-26 11:12 | 显示全部楼层
戈卫东 发表于 2015-6-25 20:00
写操作系统这种事情先不要急。。。。。。

其实我就是没事瞎鼓捣:lol
戈卫东 发表于 2015-6-26 11:15 | 显示全部楼层
斗转乾坤 发表于 2015-6-26 11:12
其实我就是没事瞎鼓捣

好吧。。。。其实这样多写多练是进步最快的
不过,真的写操作系统其实相当耗费精力,很考验你的耐心和智力。。。。。。
hnkf118 发表于 2015-6-26 11:55 | 显示全部楼层

/********************************************************************************************************
* 功 能 : 这个是软件定时器的维护任务 要求中断中能处理1/10秒的时间
* 入 口 : None.
* 返 回 : None.
* 说明  : 1) 当一个软定时器计时到时 将触发一个外部的处理函数
********************************************************************************************************/

void  TmrTask (void *data)
{
#if OS_CRITICAL_METHOD == 3
        OS_CPU_SR cpu_sr;
#endif
    void  (*pfnct)(void);
    TMR    *ptmr;
    INT8U   i;


    pfnct = NULL;

        ptmr = &TmrTbl[0];
        for (i=0; i <TMR_MAX_TMR; i++) {
            OS_ENTER_CRITICAL();
            if (ptmr->TmrEn == TRUE) {
                if (ptmr->TmrCnt > 0) {
                    ptmr->TmrCnt--;
                    if (ptmr->TmrCnt == 0) {                        
                        pfnct = ptmr->TmrFnct;
                    }
                }
            }
            OS_EXIT_CRITICAL();
            if (pfnct != NULL) {
               (*pfnct)();
                pfnct = NULL;
            }
            ptmr++;
     }
}


这个是我很早前写的。一个 你可以参考下。

 楼主| 斗转乾坤 发表于 2015-6-27 09:11 | 显示全部楼层
hnkf118 发表于 2015-6-26 11:55
/************************************************************************************************** ...

谢谢啦:lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

70

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部