一个超简易的非抢占式OS

2019-10-15 01:54发布

本帖最后由 一只风筝 于 2017-2-15 19:12 编辑

这两天在论坛上看到几个帖子,先附上传送门:
http://www.openedv.com/thread-22990-1-1.html
http://www.openedv.com/forum.php ... id=89015&highlight=ϵͳ
感觉哇,程序居然还能怎样写,感觉非常神奇,然后我把这两个帖子的精华合成到一个程序里,再修改了下,感觉还不错。
其实我觉得这东西也不能算一个OS,太简陋了,只有个调度器,其他什么都没有、/囧........
话不多说,先附上程序吧,调度器是基于时间片轮询的机制,延时是状态机机制实现。我试着在精英板跑了两个小灯任务,感觉还不错,道友们可以试试,看有什么问题没

-----------------------------------------------------------分割线---------------------------------------------------------------------------
忘记说了,系统时钟用的滴答定时器,在delay.c文件里,道友们可以注意下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
无痕幽雨
2019-10-15 23:22
我也来捧个汤,这个是我做的系统延时服务:
/******************************************************************************
* Function:        void scheduler_software_timer_t(void)
*
* PreCondition:    None
*
* Input:           None
*
* Output:          None
*
* Side Effects:    None
*
* Overview:        None
*
* Note:            
    1、调度的时候,不能够添加任务,否则数据结构造到破坏,所以要加锁;
    2、timer_service调度实在定时器中断中,如果能够保证没有更高级的中断加入
       timer服务队列,则可以不加锁;
*****************************************************************************/
void scheduler_software_timer_t(void)
{
    #if (TIMER_SERVICE_IS_ENABLE_LOCK && TIMER_SCHEDULER_IS_ADD_LOCK)
        SAFE_ATOM_CODE(
            CLASS(software_timer_t)  **pptTask  = &s_pTaskList;
            CLASS(software_timer_t)  *ptTask    = s_pTaskList;   
            
            while(NULL  !=  ptTask){
                if(ptTask->delay){
                    ptTask->delay--;
                    pptTask     =   &ptTask->ptNext;
                    ptTask      =   ptTask->ptNext;
                }else{
                    #if (TIMER_SCHEDULER_IS_COMPATIBLE_TO_JOIN_CORE_TASK_FAILURE)
                        if(USER_NEW_TASK(ptTask->pCallTask,ptTask->pRam,ADD_TASK_FIFO_TAIL)){
                            *pptTask    =   ptTask->ptNext;
                            free_software_timer_t((software_timer_t*)ptTask);
                            ptTask      =   *pptTask;               
                        }else{
                            pptTask     =   &ptTask->ptNext;
                            ptTask      =   ptTask->ptNext;
                        }
                    #else
                        USER_NEW_TASK(ptTask->pCallTask,ptTask->pRam,ADD_TASK_FIFO_TAIL);//不保证添加成功
                        *pptTask    =   ptTask->ptNext;
                        free_software_timer_t((software_timer_t*)ptTask);
                        ptTask      =   *pptTask;
                    #endif
                }
            }
        )
    #else
        CLASS(software_timer_t)  **pptTask  = &s_pTaskList;
        CLASS(software_timer_t)  *ptTask    = s_pTaskList;   
        
        while(NULL  !=  ptTask){
            if(ptTask->delay){
                ptTask->delay--;
                pptTask     =   &ptTask->ptNext;
                ptTask      =   ptTask->ptNext;
            }else{
                #if (TIMER_SCHEDULER_IS_COMPATIBLE_TO_JOIN_CORE_TASK_FAILURE)
                    if(USER_NEW_TASK(ptTask->pCallTask,ptTask->pRam,ADD_TASK_FIFO_TAIL)){
                        *pptTask    =   ptTask->ptNext;
                        free_software_timer_t((software_timer_t*)ptTask);
                        ptTask      =   *pptTask;               
                    }else{
                        pptTask     =   &ptTask->ptNext;
                        ptTask      =   ptTask->ptNext;
                    }
                #else
                    USER_NEW_TASK(ptTask->pCallTask,ptTask->pRam,ADD_TASK_FIFO_TAIL);//不保证添加成功
                    *pptTask    =   ptTask->ptNext;
                    free_software_timer_t((software_timer_t*)ptTask);
                    ptTask      =   *pptTask;
                #endif
            }
        }
    #endif
}

一周热门 更多>