打印
[STM32F0]

分享自己写的链表+时间片任务架构程序<希望跟大家多交流...

[复制链接]
2208|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yklstudent|  楼主 | 2017-5-12 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AN, ST, TI, ck, ic
一言不合直接上代码,代码如下所示:

void sTaskListInit(void)
{
    p_head = NULL;
}

bool sTaskListAdd(INT16U handle, INT32U period, INT32U tick, TaskFunc_Type func, void *para)
{
    ListTask_Type *pvTaskHandle = (ListTask_Type *)malloc(sizeof(ListTask_Type));
    if(pvTaskHandle == NULL)
    {
        return false;
    }
    else
    {
        memset(pvTaskHandle, 0x00, sizeof(ListTask_Type));
    }
   
    ListTask_Type *pvTaskPoint = p_head;
    pvTaskHandle->handle = handle;
    pvTaskHandle->period = period;
    pvTaskHandle->tick   = tick;
    pvTaskHandle->func   = func;
    pvTaskHandle->para   = para;
    pvTaskHandle->p_next = NULL;
    pvTaskHandle->n_next = NULL;
    if(pvTaskPoint == NULL)
    {
        p_head = pvTaskHandle;
    }
    else
    {
        while (pvTaskPoint->p_next)
        {
            pvTaskPoint = pvTaskPoint->p_next;
        }
        pvTaskPoint->p_next = pvTaskHandle;     //链表最后加入了新节点
    }
   
    return true;
}

void sTaskExecute(ListTask_Type *pvTaskHandle, INT32U tick)
{
    switch(pvTaskHandle->line)
    {
        case 0:
        {
            while(1)
            {
                do
                {
                    pvTaskHandle->tick = tick;
                    pvTaskHandle->line = 1;
                    case 1:
                    {
                        if(tick - pvTaskHandle->tick > pvTaskHandle->period)
                        {
                            pvTaskHandle->func(pvTaskHandle->para);
                            pvTaskHandle->line = 0;
                            break;
                        }
                        return;
                    }
                }while(0);
            }
        }
        default:
            pvTaskHandle->line = 0;
            break;
    }
}

void sTaskSchedule(void)
{
    ListTask_Type *pvTaskHandle;
   
    for(;;)
    {
        pvTaskHandle = p_head;
   
        do
        {
            sTaskExecute(pvTaskHandle, ultick);
            pvTaskHandle = pvTaskHandle->p_next;
        }while(pvTaskHandle);
    }
}
沙发
gyh974| | 2017-5-12 17:24 | 只看该作者
不懂

使用特权

评论回复
板凳
feelhyq| | 2017-5-12 19:04 | 只看该作者
为什么要自己造轮子呢? 用成熟的东西不好吗?自己造的轮子还要经过长时间的测试验证

使用特权

评论回复
地板
yklstudent|  楼主 | 2017-5-12 19:51 | 只看该作者
feelhyq 发表于 2017-5-12 19:04
为什么要自己造轮子呢? 用成熟的东西不好吗?自己造的轮子还要经过长时间的测试验证 ...

请问有什么成熟的程序架构可以免费使用????

使用特权

评论回复
5
feelhyq| | 2017-5-12 22:54 | 只看该作者
yklstudent 发表于 2017-5-12 19:51
请问有什么成熟的程序架构可以免费使用????

如果需要链表可以直接去linux里面找,如果需要时间片任务架构 可以去UCOS和RT_thread里面找

使用特权

评论回复
6
shizaigaole| | 2017-5-13 07:20 | 只看该作者
没必要这样写,封装成这样有什么意义?

使用特权

评论回复
7
shizaigaole| | 2017-5-13 07:21 | 只看该作者
怎么任务切割是关键吧

使用特权

评论回复
8
yklstudent|  楼主 | 2017-5-13 07:55 | 只看该作者
shizaigaole 发表于 2017-5-13 07:21
怎么任务切割是关键吧

就是一个裸机下 的时间片处理程序,别想太多

使用特权

评论回复
9
yklstudent|  楼主 | 2017-5-13 07:56 | 只看该作者
feelhyq 发表于 2017-5-12 22:54
如果需要链表可以直接去linux里面找,如果需要时间片任务架构 可以去UCOS和RT_thread里面找 ...

你平时都用ucos,rtthread????

使用特权

评论回复
10
mmuuss586| | 2017-5-13 08:29 | 只看该作者
谢谢分享

使用特权

评论回复
11
icecut| | 2017-5-13 09:45 | 只看该作者
木有抢断,基本不能用

使用特权

评论回复
12
ctsdswk| | 2017-5-13 10:44 | 只看该作者
替代裸奔的应用应该够了,不过貌似容易被阻塞。

使用特权

评论回复
13
msblast| | 2017-5-13 11:00 | 只看该作者
有点眼熟,pt-thread供参考

使用特权

评论回复
14
feelhyq| | 2017-5-14 22:59 | 只看该作者
yklstudent 发表于 2017-5-13 07:56
你平时都用ucos,rtthread????

linux和RT_thread,我们自己的芯片跑的是RT_thread

使用特权

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

本版积分规则

39

主题

3256

帖子

22

粉丝