打印
[STM8]

求助:任务调度老死机。

[复制链接]
1970|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 | 只看该作者
中断和你的调度器访问同样的变量但没有安全措施

使用特权

评论回复
5
斗转乾坤|  楼主 | 2015-6-25 19:03 | 只看该作者
e_007 发表于 2015-6-25 18:53
TIM就是定时中断了,干么里面还有时间相关代码?

我定时1ms,delaytime[2]是延时长度;

使用特权

评论回复
6
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用法.

使用特权

评论回复
7
斗转乾坤|  楼主 | 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了;

使用特权

评论回复
8
斗转乾坤|  楼主 | 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)   但是出错啊。

使用特权

评论回复
9
戈卫东| | 2015-6-25 20:00 | 只看该作者
先把C语言弄熟悉吧。。。。。。。。。

使用特权

评论回复
10
戈卫东| | 2015-6-25 20:00 | 只看该作者
写操作系统这种事情先不要急。。。。。。

使用特权

评论回复
11
yklstudent| | 2015-6-25 21:32 | 只看该作者
斗转乾坤 发表于 2015-6-25 19:18
再问一下:我有下面这样类型数组,如何判定数组为空?
typedef struct {
    void(*funname)();

Task[id].funname == NULL
可以尝试这个

使用特权

评论回复
12
hnkf118| | 2015-6-25 22:50 | 只看该作者
是写法不安全造成的。 最基本的 C指针 你就没做安全处理。

使用特权

评论回复
13
菜鸟同学| | 2015-6-26 10:41 | 只看该作者
这个不算是调度,只能算是软时钟,这些问题调试就能出来,没有判断回调函数的合法性。

使用特权

评论回复
14
斗转乾坤|  楼主 | 2015-6-26 11:06 | 只看该作者
yklstudent 发表于 2015-6-25 21:32
Task.funname == NULL
可以尝试这个

嗯嗯,试试

使用特权

评论回复
15
斗转乾坤|  楼主 | 2015-6-26 11:08 | 只看该作者
hnkf118 发表于 2015-6-25 22:50
是写法不安全造成的。 最基本的 C指针 你就没做安全处理。

:handshake,如何进行安全处理?菜鸟求教:lol

使用特权

评论回复
16
斗转乾坤|  楼主 | 2015-6-26 11:10 | 只看该作者
菜鸟同学 发表于 2015-6-26 10:41
这个不算是调度,只能算是软时钟,这些问题调试就能出来,没有判断回调函数的合法性。 ...

调度是不是还要加上任务堆栈来保护数据?

使用特权

评论回复
17
斗转乾坤|  楼主 | 2015-6-26 11:12 | 只看该作者
戈卫东 发表于 2015-6-25 20:00
写操作系统这种事情先不要急。。。。。。

其实我就是没事瞎鼓捣:lol

使用特权

评论回复
18
戈卫东| | 2015-6-26 11:15 | 只看该作者
斗转乾坤 发表于 2015-6-26 11:12
其实我就是没事瞎鼓捣

好吧。。。。其实这样多写多练是进步最快的
不过,真的写操作系统其实相当耗费精力,很考验你的耐心和智力。。。。。。

使用特权

评论回复
19
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++;
     }
}


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

使用特权

评论回复
20
斗转乾坤|  楼主 | 2015-6-27 09:11 | 只看该作者
hnkf118 发表于 2015-6-26 11:55
/************************************************************************************************** ...

谢谢啦:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

70

帖子

2

粉丝