OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3698|回复: 12

一个超简易的非抢占式OS

[复制链接]

39

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-4-21
在线时间
129 小时
发表于 2017-2-15 18:23:11 | 显示全部楼层 |阅读模式
本帖最后由 一只风筝 于 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文件里,道友们可以注意下

My_STM32.rar

2.58 MB, 下载次数: 138

本人交流群:136045527,欢迎各位大佬和萌新
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-2-15 18:29:25 | 显示全部楼层
关注一下,晚上抽时间看看。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复 支持 反对

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2017-2-15 19:16:04 | 显示全部楼层
不错的protothread!
我也写了一个类似的,希望能一起交流一下
http://www.openedv.com/thread-78139-1-1.html
https://github.com/ianhom/MOE/blob/master/README_CHINESE.md
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复 支持 反对

使用道具 举报

39

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-4-21
在线时间
129 小时
 楼主| 发表于 2017-2-15 19:22:17 | 显示全部楼层
ianhom 发表于 2017-2-15 19:16
不错的protothread!
我也写了一个类似的,希望能一起交流一下
http://www.openedv.com/thread-78139-1 ...

哇,大神,我在很多地方见过你呀,眼熟
本人交流群:136045527,欢迎各位大佬和萌新
回复 支持 反对

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2017-2-15 19:28:12 | 显示全部楼层
一只风筝 发表于 2017-2-15 19:22
哇,大神,我在很多地方见过你呀,眼熟

我不是大神。。。。。我只是个社会主义接班人
我比较大众脸,所以看起来比较眼熟
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复 支持 反对

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2017-2-15 19:45:03 | 显示全部楼层
不知楼主的上传的代码流程是不是这样的:
创建三个task放到链表中,Scheduler_Tasks中历遍调用所有的task,而在每个task中判断延时是否结束,如果未结束就直接返回,去执行另一个task,如果结束则继续运行后续的代码,如果task后续没有代码,因为Os_Delay宏定义中line = 0, 返回该task开始处继续运行。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复 支持 反对

使用道具 举报

3

主题

177

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1604
金钱
1604
注册时间
2016-1-28
在线时间
265 小时
发表于 2017-2-15 19:51:20 | 显示全部楼层
不错,跟着楼主学习
宠辱不惊看庭前花开花落去留无意望天上云卷云舒。
回复 支持 反对

使用道具 举报

39

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-4-21
在线时间
129 小时
 楼主| 发表于 2017-2-16 15:06:01 | 显示全部楼层
ianhom 发表于 2017-2-15 19:45
不知楼主的上传的代码流程是不是这样的:
创建三个task放到链表中,Scheduler_Tasks中历遍调用所有的task ...

是的,就几行很简单的代码,见笑了
本人交流群:136045527,欢迎各位大佬和萌新
回复 支持 反对

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2017-2-16 15:19:59 | 显示全部楼层
一只风筝 发表于 2017-2-16 15:06
是的,就几行很简单的代码,见笑了

我觉得你写的比我写的有意思,真的
我需要多学习别人的代码,期待楼主的OS进一步进展
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2017-2-16 20:37:30 来自手机 | 显示全部楼层
就是一个调度器而已
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2017-2-17 20:13:17 | 显示全部楼层
我也来捧个汤,这个是我做的系统延时服务:
/******************************************************************************
* 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
}
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

17

主题

170

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2020-7-12 22:51:07 | 显示全部楼层
非常谢谢分享
回复 支持 反对

使用道具 举报

17

主题

170

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2020-7-26 09:51:37 | 显示全部楼层
请问在添加点注释就好了,还有就是动态分配在单片机中是不是不太好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表