本帖最后由 一只风筝 于 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文件里,道友们可以注意下
/******************************************************************************
* 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
}
一周热门 更多>