搜索
bottom↓
回复: 54

自己写的一个利用函数指针实现任务调度的内核

  [复制链接]

出0入0汤圆

发表于 2015-11-5 16:51:38 | 显示全部楼层 |阅读模式
本帖最后由 轻若尘 于 2015-11-6 15:23 编辑

先来说说内核都有那些特点,首先实现了类似UCOS的延时功能,可以给每个任务设置不同的周期,调用延时函数后挂起任务不阻塞CPU,除此之外每个任务还可以主动放弃CPU使用权,等到其他任务都执行后再切回来,任务的数量没有限制,任务也没有优先级每个任务都是执行完后主动让出CPU的控制权。另外也实现了信号量,邮箱和消息队列现在还在考虑要不要加,我初步的想法是可以通过信号量实现任务与任务之间,以及任务与中断函数之间的同步,任务间的数据传输可以用全局变量,所以就没必要加邮箱和消息队列了。用户可以自己设置任务的数量,系统保留两个任务,一个作为空闲任务,一个作为统计任务计算CPU的使用率。整个内核总共也就几百行代码,任务通过函数指针切换不额外占用CPU时间,代码全部用C编写,不需要移植,只需要加入自己的工程中即可,使用非常简单方便。      


说一下写这个OS的初衷,叫程序架构可能更合适点,毕竟没有像UCOS、RT-Thread、FreeRTOS等RTOS那么完善。我就姑且叫它OS吧,我给他起了名字叫eTOS。很多时候我们可能会计较纠结一个问题,要不要在产品中使用RTOS,可能需要处理的事情对实时性并没什么要求,但要处理的事情却比较的多,使用传统的前后台系统所有要处理的事情都放在一个循环中就比较困难了,有时候不得不阻塞CPU,这样就会影响其他任务的处理。很多时候我们需要的仅仅是一个调度器来管理任务,并不需要一个完整的RTOS。我就遇到过好多人在产品中使用RTOS就是出于这个目的。最近工作不多,空闲时间比较富裕,就想到自己写个小内核,从构思到完成代码花了不到一个星期的时间。


我这里先说下写这个OS的一些思路,一些核心的代码我贴出来大家一起讨论,我再测试一段时间再把整个工程贴出来。

和RTOS一样,每个任务也都有一个自己的任务控制块TCB:


现在直接上工程,工程是基于STM32芯片完成的,但系统可以用在任何单片机上,不需要移植,对芯片RAM也没有要求(RAM会影响任务的数量)。


我现在只是实现了一些必须的功能,主要是让系统比较简洁,不过多占用资源,只是在一些不是很复杂的场合使用,并不是要取代RTOS。


用户和一通过eTconfig.h配置任务数量、信号量的数量、是否使用信号量、任务名长度以及是否使用统计任务(统计任务开机会先占用1S获取空闲任务最大计数值,可以在调试中开启,调试完后关闭即可)。


工程包括task.c、timer.c和task_ipc.c三个.文件和一些.h文件。使用时只需要将文件加入工程在用户代码中包含#include "user_api.h"文件,调用系统提供的API函数就可以。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-11-5 17:03:10 | 显示全部楼层
都没人回复,是不是对这都没什么兴趣!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2015-11-5 17:03:44 | 显示全部楼层
已经实用了吗?

出0入0汤圆

 楼主| 发表于 2015-11-5 17:07:54 | 显示全部楼层

这几天刚写的,这两天先通过软件仿真测试,测得的没什么大问题,就把工程传上来大家也帮忙一起测

出0入0汤圆

 楼主| 发表于 2015-11-5 17:11:53 | 显示全部楼层
我只是抛砖引玉,大家有什么想法一起讨论

出0入0汤圆

发表于 2015-11-5 18:25:13 | 显示全部楼层
简单的系统  用合作调度      复杂系统 上ucos之类的操作系统
楼主系统 本质上 是合作调度  

出0入0汤圆

发表于 2015-11-5 19:32:41 | 显示全部楼层
轻若尘 发表于 2015-11-5 17:11
我只是抛砖引玉,大家有什么想法一起讨论

现在的OS多如牛毛,稳定的可用的OS就好多个;
除了爱折腾的,本来就没几个人对OS感兴趣,你这样三两张没头没尾的图片,人气更没了;

出0入93汤圆

发表于 2015-11-5 19:35:32 | 显示全部楼层
顶一个表示支持

出0入0汤圆

发表于 2015-11-5 19:50:39 | 显示全部楼层
顶,把工程传上来,了解了解

出100入85汤圆

发表于 2015-11-5 19:53:20 | 显示全部楼层
上传上来看看吧。看过之后才会产生兴趣或者不感兴趣

出0入0汤圆

 楼主| 发表于 2015-11-6 08:30:00 | 显示全部楼层
4058665 发表于 2015-11-5 18:25
简单的系统  用合作调度      复杂系统 上ucos之类的操作系统
楼主系统 本质上 是合作调度   ...

本质上就是合作调度,可以用在实时性要求不高的场合

出0入0汤圆

 楼主| 发表于 2015-11-6 08:31:26 | 显示全部楼层
whatcanitbe 发表于 2015-11-5 19:53
上传上来看看吧。看过之后才会产生兴趣或者不感兴趣

我再测试下,稍后出一个简单的应用实例上传工程

出0入0汤圆

 楼主| 发表于 2015-11-6 08:33:44 | 显示全部楼层
kinsno 发表于 2015-11-5 19:32
现在的OS多如牛毛,稳定的可用的OS就好多个;
除了爱折腾的,本来就没几个人对OS感兴趣,你这样三两张没 ...

先在RTOS确实很多,我写这个的目的主要是用在一些实时性要求不高的场合,使用比较方便,可以降低管理任务的复杂度

出0入0汤圆

 楼主| 发表于 2015-11-6 08:35:18 | 显示全部楼层
ZhangFei1990//. 发表于 2015-11-5 19:50
顶,把工程传上来,了解了解

感谢支持,稍后上传工程

出0入0汤圆

 楼主| 发表于 2015-11-6 08:36:23 | 显示全部楼层
tim 发表于 2015-11-5 19:35
顶一个表示支持

感谢大家支持

出0入0汤圆

发表于 2015-11-6 09:21:01 | 显示全部楼层
也可以参考一点事件驱动方法 http://www.state-machine.com/zh/index.html

出0入0汤圆

发表于 2015-11-6 09:31:34 | 显示全部楼层
确实OS目前很多,个人感觉,如果是从做产品角度出发,并非所有产品都要用到复杂度高,通用性强的系统,只需要一套稳定经得住市场考验的软件架构。楼主的OS和时间触发、事件驱动、合作式系统类似,适合一些产品的开发。

出0入0汤圆

 楼主| 发表于 2015-11-6 09:58:15 | 显示全部楼层
makathy 发表于 2015-11-6 09:21
也可以参考一点事件驱动方法 http://www.state-machine.com/zh/index.html

有考虑事件驱动,可以通过信号量来完成,需要任务工作的时候直接发送信号量触发

出0入0汤圆

 楼主| 发表于 2015-11-6 10:01:46 | 显示全部楼层
fengyuganyu 发表于 2015-11-6 09:31
确实OS目前很多,个人感觉,如果是从做产品角度出发,并非所有产品都要用到复杂度高,通用性强的系统,只需 ...

我就是出于这个目的写的这个OS,比起前后台系统可以很大程度上降低编程的复杂度,稍后上传工程大家一起使用,争取做成一个通用性强,稳定的软件架构。

出0入0汤圆

 楼主| 发表于 2015-11-6 10:43:33 | 显示全部楼层
工程已经上传,大家有什么想法可以一起讨论。

出0入0汤圆

发表于 2015-11-6 10:55:39 | 显示全部楼层
谢谢分享,很好的思路。

出0入0汤圆

 楼主| 发表于 2015-11-6 10:57:44 | 显示全部楼层
yikeai 发表于 2015-11-6 10:55
谢谢分享,很好的思路。

多谢支持,有想法大家一起讨论,希望能做成一个稳定的系统架构

出0入0汤圆

发表于 2015-11-6 11:15:10 | 显示全部楼层
任务切换数据保护如何处理?

出0入0汤圆

 楼主| 发表于 2015-11-6 11:15:48 | 显示全部楼层
大家看后发表下自己想法,有什么好想法都可以加进去

出0入0汤圆

发表于 2015-11-6 11:24:26 | 显示全部楼层
等到其他任务都执行后再切回来,任务的数量没有限制,任务也没有优先级每个任务都是执行完后主动让出CPU的控制权。
个人认为这用实用会大打折扣,如一个任务执行中有多个延时处理,或某条件执行任务,而其它可执任务与当前运行任务无冲突,何不让延时去切换去做其它任务(当然这里并非指抢占式运行),还有一点任务应该有优先等级比较合适,如A任务循环N次,B任务只需运行一次时,优先就加合理延时就显的很方便.

出0入0汤圆

 楼主| 发表于 2015-11-6 11:31:47 | 显示全部楼层
lwb807 发表于 2015-11-6 11:24
等到其他任务都执行后再切回来,任务的数量没有限制,任务也没有优先级每个任务都是执行完后主动让出CPU的 ...

主要是考虑用在实时性要求不高的场合,任务之前属于合作调度,每个任务执行完都要主动出让CPU,系统将会选择就绪链表中最靠前的任务执行,每个任务都是公平的使用CPU。如果实时性要求高直接用RTOS就行,我这个考虑的重点是相比前后台系统能更方便的管理每个任务。

出0入0汤圆

 楼主| 发表于 2015-11-6 11:34:29 | 显示全部楼层
lwb807 发表于 2015-11-6 11:24
等到其他任务都执行后再切回来,任务的数量没有限制,任务也没有优先级每个任务都是执行完后主动让出CPU的 ...

有想法可以多尝试,以后逐步完善

出0入0汤圆

发表于 2015-11-6 11:56:32 | 显示全部楼层
看着不错,顶一个

出0入0汤圆

 楼主| 发表于 2015-11-6 12:37:04 | 显示全部楼层
mcu5i51 发表于 2015-11-6 11:56
看着不错,顶一个

多谢支持

出0入0汤圆

发表于 2015-11-6 13:11:48 | 显示全部楼层

有问题!如果一个任务是以下这种结构,你这个将无法支持;
task()
{
     led1();
     delayms(100);
     led2();
     delayms(100);
     led3();
     delayms(100);
     led4();
     delayms(100);
     led5();
     delayms(100);
}

出0入0汤圆

发表于 2015-11-6 13:20:10 来自手机 | 显示全部楼层
这种多任务调度对实时性不高的情况下用起来很方便,但是如楼上所说的,没有优先级,如果有些任务需要比较大延时的,比较浪费时间,不知可不可以写一个功能可以大致统计每个任务的运行时间,从而可以有利于进行任务镶嵌,用来替代长延时

出0入0汤圆

发表于 2015-11-6 13:23:06 来自手机 | 显示全部楼层
用户在编程的时候可以根据任务时间合理镶嵌

出0入0汤圆

 楼主| 发表于 2015-11-6 13:27:57 | 显示全部楼层
kinsno 发表于 2015-11-6 13:11
有问题!如果一个任务是以下这种结构,你这个将无法支持;
task()
{

是的这种情况无法支持,只能分成不同任务执行,其实增加一个任务开销也不大。这个需要将一起处理的事情作为一个任务,不同时处理的必须分开。任务调度没有压栈出栈,肯定没RTOS那么强大。

出0入0汤圆

 楼主| 发表于 2015-11-6 13:30:12 | 显示全部楼层
lgc150 发表于 2015-11-6 13:20
这种多任务调度对实时性不高的情况下用起来很方便,但是如楼上所说的,没有优先级,如果有些任务需要比较大 ...

延时的时候任务会挂起,延时大并不会浪费CPU

出0入0汤圆

 楼主| 发表于 2015-11-6 13:33:09 | 显示全部楼层
lgc150 发表于 2015-11-6 13:23
用户在编程的时候可以根据任务时间合理镶嵌

最主要的目的就是能够充分利用CPU,程序可以编写成事件驱动,任何情况下任务都不会阻塞CPU

出0入0汤圆

 楼主| 发表于 2015-11-6 13:59:13 | 显示全部楼层
lwb807 发表于 2015-11-6 11:15
任务切换数据保护如何处理?

这属于合作调度,非抢占式,所以不用保护数据

出0入0汤圆

发表于 2015-11-6 15:33:31 | 显示全部楼层
先表示支持,看看 写得如何再来 评论

出0入0汤圆

 楼主| 发表于 2015-11-6 16:26:24 | 显示全部楼层
wind2100 发表于 2015-11-6 15:33
先表示支持,看看 写得如何再来 评论

谢谢支持

出0入0汤圆

 楼主| 发表于 2015-11-6 16:39:02 | 显示全部楼层
希望大家能多讨论,稍后我会出一个使用手册

出0入0汤圆

发表于 2015-11-7 08:37:09 | 显示全部楼层
其实倒过来看看楼主的OS变成这样了,那存在意义有多大呢?差别在于任务最后的延时利用,但这种利用一个任务用一个寄存器就能解决了,还不存在任务切换带来风险.
while(1)
{
任务1;
任务2;
任务3;
}

出0入0汤圆

发表于 2015-11-7 09:07:52 | 显示全部楼层
谢谢分享,不错!

出0入0汤圆

发表于 2015-11-7 09:25:01 来自手机 | 显示全部楼层
lwb807 发表于 2015-11-7 08:37
其实倒过来看看楼主的OS变成这样了,那存在意义有多大呢?差别在于任务最后的延时利用,但这种利用一个任务用 ...

没错,就是把任务填写到主循环的过程放到函数指针填空了

出870入263汤圆

发表于 2015-11-7 09:43:59 | 显示全部楼层
看了30楼,就知道楼主你写的是一个状态机框框,本质上是用一个个小函数代替switch case。一旦函数退出,下次进入该函数必须重头运行,也就是没有任务自己的堆栈和局部变量。
说白了,就是一个简单的协作式OS。参考contiki、uip协议栈自带的pt、以及freertos的croutine模块。

出0入0汤圆

 楼主| 发表于 2015-11-7 20:12:33 | 显示全部楼层
lwb807 发表于 2015-11-7 08:37
其实倒过来看看楼主的OS变成这样了,那存在意义有多大呢?差别在于任务最后的延时利用,但这种利用一个任务用 ...

这个之前我已经说过本质就是合作调度,只是为更方便管理要处理的任务,所以要和UCOS之类的RTOS比较也没什么可比的意义,肯定不会像RTOS那样强大,我写这个主要是为方便以后自己在实时性要求不高的项目中使用,我觉得使用可以节约不少编程的时间,才分享出来希望也能给大家带来方便

出0入0汤圆

 楼主| 发表于 2015-11-7 20:22:25 | 显示全部楼层
armstrong 发表于 2015-11-7 09:43
看了30楼,就知道楼主你写的是一个状态机框框,本质上是用一个个小函数代替switch case。一旦函数退出,下 ...

确实和状态机框框本质差不多,但是比状态机框框使用要方便灵活的多,我是参考了一些RT-thread的思想,contiki、uip协议栈自带的pt、以及freertos的croutine模块却没有参考

出0入0汤圆

 楼主| 发表于 2015-11-7 20:27:54 | 显示全部楼层
我再重申下我写的这个就是一个简单的合作调度内核,使用也的确有很多局限,所以有些坛友非得在性能上和RTOS比较就没多大意义了,我这里主要的目的还是提供一些不同于前后台的编程思路

出0入0汤圆

发表于 2015-11-7 21:10:01 | 显示全部楼层
楼主何苦自己搞,现在的os,抢占的,非抢占的,到处都是,,其实操作系统的概念远非任务管理,还有包括IPC,fs,network,同步锁,这些都是与硬件无关的,,和硬件相关的还有很多很多,做个玩具还可以搞搞,做个项目找个合适的系统比较靠谱

出0入0汤圆

 楼主| 发表于 2015-11-7 21:16:54 | 显示全部楼层
moypray 发表于 2015-11-7 21:10
楼主何苦自己搞,现在的os,抢占的,非抢占的,到处都是,,其实操作系统的概念远非任务管理,还有包括IPC ...

很多时候根本用不到那么复杂的系统,我就是写一个简单的用在用不到复杂系统的场合,也主要是写着玩

出0入0汤圆

发表于 2015-11-7 21:20:33 | 显示全部楼层
感谢分享,期待楼主的测试代码。

出0入0汤圆

 楼主| 发表于 2015-11-7 21:23:46 | 显示全部楼层
creep 发表于 2015-11-7 21:20
感谢分享,期待楼主的测试代码。

我传的工程里面有个简单测试代码,建了4个任务,可以先看看,这两天会再出个使用说明文档

出0入0汤圆

发表于 2015-12-23 23:03:41 | 显示全部楼层
调度器更加适合

出0入0汤圆

发表于 2015-12-24 08:15:34 来自手机 | 显示全部楼层
没有时间片  任务要一次执行完跟前后台差不多了

出10入0汤圆

发表于 2015-12-24 08:37:36 来自手机 | 显示全部楼层
关注一下

出0入0汤圆

发表于 2016-3-27 12:17:28 | 显示全部楼层
挺好,支持一下

出0入0汤圆

发表于 2016-3-31 16:02:48 | 显示全部楼层
不用移植吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 09:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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