自己写的一个合作调度器内核
本帖最后由 轻若尘 于 2015-12-23 10:14 编辑前段时间发表过一篇帖子《自己写的一个利用函数指针实现任务调度的内核》http://www.amobbs.com/thread-5636298-1-1.html 。坛友提出了很多问题,我自己也一直在改进,并且用在公司的新开发项目中。从我这段时间的使用来看,使用这个调度器内核比之前用前后台系统开发确实方便了不少,首先比前后台系统更容易实现模块化编程,可以充分利用CPU很大程度上提高了软件的效率,最重要还是节约了很多开发时间。
通过这段时间的使用,我对之前的内核做了一些改进:
1.增加了优先级,每个任务可以设置不同优先级,也可以不同任务设置相同优先级。
2.每个任务都可以单独设置超时时间,和超时处理函数,这个功能在通信的时候比较有用。
3.之前坛友提出不能在一个任务有多个挂起任务操作,通过改进现在这个问题已经解决。以下是我测试的一部分代码:
不知道为什么用火狐浏览器上传不了附件,知道的告诉我下。
先做个记号 支持,但是没见到附件 lw2012 发表于 2015-12-23 09:40
支持,但是没见到附件
我的火狐浏览器传不了附件,稍后再试试 轻若尘 发表于 2015-12-23 09:45
我的火狐浏览器传不了附件,稍后再试试
是的,火狐对论坛的代码做了校验,对老的代码版本不支持,我以前提过建议,莫大说等动力升级后再说 上传时取消右边的“纯文本” 楼主很执着。 一看到while(1)之外的TASK_START和TASK_END就猜想是用了pt。
其实freertos不但是一个抢占式rtos,而且提供了协程的调度方法,就是利用了pt。
在ram很有限的mcu用这个协程调度,大大节省了ram。
本帖最后由 zsmbj 于 2015-12-23 10:15 编辑
看看freertos的协程写法:
main里建立一个协程任务,优先级为0
#include "task.h"
#include "croutine.h"
#define PRIORITY_0 0
void main( void )
{
// In this case the index is not used and is passed
// in as 0.
xCoRoutineCreate( vFlashCoRoutine, PRIORITY_0, 0 );
// NOTE:Tasks can also be created here!
// Start the RTOS scheduler.
vTaskStartScheduler();
}
任务的写法:
void vFlashCoRoutine( CoRoutineHandle_t xHandle,
UBaseType_t uxIndex )
{
// Co-routines must start with a call to crSTART().
crSTART( xHandle );
for( ;; )
{
// Delay for a fixed period.
crDELAY( xHandle, 10 );
// Flash an LED.
vParTestToggleLED( 0 );
}
// Co-routines must end with a call to crEND().
crEND();
} zsmbj 发表于 2015-12-23 10:08
一看到while(1)之外的TASK_START和TASK_END就猜想是用了pt。
其实freertos不但是一个抢占式rtos,而且提供 ...
恩是参考了PT的方法 附件已上传,火狐上传不了,还是用IE上传 asbzhang 发表于 2015-12-23 10:00
楼主很执着。
既然写了这东西,就尽量写的完善些,不能让自己之前白忙活 其实楼主可以参考QP架构,合作式事件触发,能够实现简单的数据结构和方法继承,用起来应该比 eTOS更灵活 changer15309 发表于 2015-12-23 10:47
其实楼主可以参考QP架构,合作式事件触发,能够实现简单的数据结构和方法继承,用起来应该比 eTOS更灵活 ...
对QP架构不了解,能否提供些资料看下 唉看了很多这种调度器就是 用不来理解不了 现在还是用的 while代码写的一点逼格也没有惭愧啊 轻若尘 发表于 2015-12-23 10:52
对QP架构不了解,能否提供些资料看下
参考链接http://www.state-machine.com/index.html 轻若尘 发表于 2015-12-23 10:52
对QP架构不了解,能否提供些资料看下
对应的电子书下载 http://www.state-machine.com/psicc2/ ayumi8 发表于 2015-12-23 10:54
唉看了很多这种调度器就是 用不来理解不了 现在还是用的 while代码写的一点逼格也没有惭愧 ...
我这个还算比较简单,不涉及底层堆栈,都是用C写的,耐心点肯定能理解{:smile:} changer15309 发表于 2015-12-23 10:59
对应的电子书下载 http://www.state-machine.com/psicc2/
粗略看了下,感觉挺不错,有时间好好研究下 不错,明天试试点个灯{:lol:} wmm20031015 发表于 2015-12-23 18:03
不错,明天试试点个灯
直接用我传的例程改下端口就可以 先mark 先mark跑起来需要多少ram? ztg328 发表于 2015-12-23 21:08
先mark跑起来需要多少ram?
具体看有几个任务,和裸奔差不多 关注关注… 学习学习。感谢分享 eTOS,学习一下,感谢楼主分享!! sunnyczp 发表于 2015-12-24 09:26
eTOS,学习一下,感谢楼主分享!!
多谢支持 mark,学习啊。 状态机编程的兼容性是关键 mark!谢谢楼主分享 mark一下 minier 发表于 2016-1-16 10:39
状态机编程的兼容性是关键
有哪些兼容性需要考虑,能说详细点吗? mark一下 收藏了,谢谢楼主 看了一下楼主的代码, 和 contiki 差别不大, 而且 contiki 有更多的资源, 建议楼主读一读 contiki onepower 发表于 2016-1-26 10:58
看了一下楼主的代码, 和 contiki 差别不大, 而且 contiki 有更多的资源, 建议楼主读一读 contiki ...
好的,有时间看看 最近根据项目中的实际使用,对信号量做了部分修改,并加入了获取任务指针功能等。。。。
现在这么多人搞os? neqee 发表于 2016-2-1 17:32
现在这么多人搞os?
自己写着玩{:lol:}
Protothreads结构…… 支持楼主,精神可嘉 类似于proto的系统,局限性很强 学习一个,最近正在学习纯C的调度器,比RTOS来说移植简单不少,资源也很省。楼主自己做的调eTOS已经用在项目中了? 支持创新 其实楼主的调度器,很适合用于项目,比裸奔清晰,又比rtos简单,大部分中小型项目非常适合。希望楼主能出一个使用说明和注意事项 项目并不是用了RTOS就高大上,合适才是硬道理。我现在的一个汽车电子项目,之前与领导建议上ucos,但领导告诉我:1.os要有汽车级认证,2.你本人要对os有深刻的认识,如果用不好,产品出了问题很难查找错误。我现在就用定时器做了一个极简单的任务调度。 楼主的方案,非常好,准备试试。 jia_xuan 发表于 2017-2-22 10:12
项目并不是用了RTOS就高大上,合适才是硬道理。我现在的一个汽车电子项目,之前与领导建议上ucos,但领导告 ...
我也是出于这种想法写的,很多时候并没必要用RTOS,为了提高编程效率和良好的代码结构,有一个占用资源少的通用的软件框架还是很有必要的{:smile:} wang1216 发表于 2016-3-9 14:36
类似于proto的系统,局限性很强
确实有些局限性,可以用在资源少简单的系统,复杂的直接上FreeRTOS之类的了
轻若尘 发表于 2017-2-22 14:59
确实有些局限性,可以用在资源少简单的系统,复杂的直接上FreeRTOS之类的了
...
请问一下楼主,eTOS中,我有外部50ms溢出的看门狗,喂狗放在哪里合适。 轻若尘 发表于 2016-2-1 17:23
最近根据项目中的实际使用,对信号量做了部分修改,并加入了获取任务指针功能等。。。。
...
“加入获取任务指针功能等。。。。”。楼主,这个功能在那种情况下能用到? 楼主,这个可以调用子运务吗?{:smile:}
MARK,学习
页:
[1]