搜索
bottom↓
回复: 69
打印 上一主题 下一主题

类OS调度器V2.0版本,等不及了,先上KEIL版本的吧.

  [复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2014-7-26 08:56:46 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

低级版本在此处,包括stm8s,stm32f103,和51的例程,和说明书.

http://www.amobbs.com/thread-5534907-1-1.html

之前陆陆续续进行了一些不痛不痒的改进.这次升级为V2.0,主要变化如下:

1.为适应KEIL,将原来的查询消息列队状态"SCH_UINT8 SCHTaskGetQFree()"改由宏定义,其它大部分也改为宏定义实现.

  更改后,原来的直接获取状态由一步变为两步:

  更改前:
        if (SCHTaskGetQFree(&UartTxTcb) == SCH_Q_FREE)      //检查UART_TX发送任务队列是否可用
  更改后:

      SCHTaskGetQFree(UartTxTcb, u8RetStatus)                        //"u8RetStatus"为新定义的局部变量
        
      if (u8RetStatus == SCH_Q_FREE)                                       //检查UART_TX发送任务队列是否可用

2.根据坛友的建议,增加了初始化任务时,同时也初始化任务计数的初始值以提高效率.如下,更改后"SCHTaskCreate"函数增加第三个参数.


//初始化任务的计数器为不同值,可使得各个任务错开运行,从而提高效率。
//原理:A和B两个任务都是间隔10个"SCH_SYS_TICKS_MS"运行一次,如果计数器初值相同,则会同时在第10个"SCH_SYS_TICKS_MS"时满足运行条件,
//则A,B会先后运行.但如果初始化时,A任务计数器初值为0,B任务计数器初值为1个"SCH_SYS_TICKS_MS",则A,B任务总会相差一个"SCH_SYS_TICKS_MS"
//满足运行条件,即A,B永远不同时满足运行条件,也就是让它们错开运行时间,从而提高效率.
//注:前提条件是任务执行间隔时间都大于"SCH_SYS_TICKS_MS"。
//下例STC89C52RC系统中,因为"SCH_SYS_TICKS_MS"为10ms,而大部分任务运行间隔也是10ms,所以是没有效果的.("SCH_SYS_TICKS_MS"为1ms则有效)
       
void vUserTaskCreate(void)
{
  //任务创建的顺序即为任务运行的优先级顺序(从高优先级到低优先级)

  SCHTaskCreate(&WdtClearTcb, vWdtClear, 0 * SCH_SYS_TICKS_MS);
  
  SCHTaskCreate(&UartTxTcb, vUartDataSend, 1 * SCH_SYS_TICKS_MS);
  
  SCHTaskCreate(&UartRxTcb, vUartReceiveData, 2 * SCH_SYS_TICKS_MS);
  
  SCHTaskCreate(&AdcResultSendTcb, vAdcResultSend, 3 * SCH_SYS_TICKS_MS);
  
  SCHTaskCreate(&AdcTreatmentTcb, vAdcTreatment, 4 * SCH_SYS_TICKS_MS);
  
  SCHTaskCreate(&LedTestTcb, vLedTest, 5 * SCH_SYS_TICKS_MS);   
}

       

原来的51单片机的IAR例程,也改为了KEIL例程,毕竟51使用KEIL的人员可能更多些,特别是学生.KEIL版本是V4.60.6.10

本来想等到重新整理好STM8S、STM32F103的例程和说明书再上传,但实在没时间,再拖恐怕就是几个月之后的事了.

所以就先上51单片机的KEIL版本了。其它STM8S/STM32F版本和说明书,哪位同学有兴趣也可以帮忙整理。

51单片机的KEIL版本:



欢迎测试并指出八哥。

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

2
 楼主| 发表于 2014-7-26 10:00:10 | 显示全部楼层
本帖最后由 summarize 于 2014-7-26 10:02 编辑
aming2046 发表于 2014-7-26 09:09
期待STM32 KEIL MDK版本的早点出来啊 ,呵呵,楼主辛苦了


也许明年会有时间做,最好还是你自己参考旧的说明书来做,说明书哪里写得不够明白,欢迎指正。

-------------------------------------------
补充:或者参考51-KEIL版本,修改部分低层配置即可,不难。

出0入0汤圆

3
 楼主| 发表于 2014-7-28 06:38:35 | 显示全部楼层
fengyunyu 发表于 2014-7-28 06:23
LZ的调度器,是抢占式,还是?protothread,单片机用用就不错了。

结合时间触发+消息+protothread思想+支持优先级的非抢占调度器.

1. 支持优先级调度是指:当运行中的任务释放CPU后,优级级高的任务可以最先取得CPU控制权,而不是一般的顺序执行,等待轮到自己才能运行.

2. 本来就是针对单片机的,全C语言,移植方便.

出0入0汤圆

4
 楼主| 发表于 2014-7-28 06:56:02 | 显示全部楼层
embeddev_1 发表于 2014-7-28 06:51
好东西啊 ,准备试试stm8的,不知道bug多吗?
占用内存多少啊

我也想知道8哥多不多,占用内存看TCB就知道了.

出0入0汤圆

5
 楼主| 发表于 2014-7-28 12:30:48 | 显示全部楼层
embeddev_1 发表于 2014-7-28 09:53
在stm8s207上面移植了一下。可用!粗看了一下,tim4_init里面时钟中断100us一次,太快了!
能 ...

1. 100us中断是留给要求快速响应的事务,直接在中断里执行.

2. 已经支持简单的消息队列,后续不想增加更多功能了,不然越来越臃肿.

出0入0汤圆

6
 楼主| 发表于 2014-8-15 21:58:11 | 显示全部楼层
dxgdsx 发表于 2014-8-15 09:10
非常赞赏楼主的共享精神,仔细阅读了源码,有几个问题想请教一下,谢谢。
1、任务节拍处理函数void SCHTime ...

1.会出错,那么我们要问: 会出什么错,出了这个错会造成什么后果,这个后果系统能接收不?

2.一般的系统都是几个任务而已,所以浪费的资源并不多,如果你的系统连这么点资源都浪费不起,那就在宏定义中关闭这个功能吧。

出0入0汤圆

7
 楼主| 发表于 2014-8-16 21:12:50 | 显示全部楼层
dxgdsx 发表于 2014-8-16 11:17
我可能有些钻牛角尖了。
1、举个比较极端的例子。
如果g_u8SchedTicksCnt = 255; SCH_TIM_TO_TICKS_CMP = ...

1.a. 255*0.1=25.5ms,如果你的系统跑一个循环超过了这个时间,也许应该考虑上OS了.一般情况是小于5ms,多点的最多也是小于10ms.

1.b. 时间发生偏移的概率是很小的,就算发生了,对于0.1ms的定时中断,偏移也就是0.1ms,假设任务A本来间隔10ms执行一次,下次变成了间隔10.1ms再执行,这个影响忽略不计.

2.如你所说.

出0入0汤圆

8
 楼主| 发表于 2014-8-17 21:28:57 | 显示全部楼层
dxgdsx 发表于 2014-8-17 12:22
嗯,经过楼主这么解释,我发现我确实钻了牛角尖了。
这个统一框架确实非常方便了,我之前一直想着在这基 ...

谢谢支持!

出0入0汤圆

9
 楼主| 发表于 2014-8-29 12:18:52 | 显示全部楼层
tjulg 发表于 2014-8-29 11:44
我也在用这个调度器,看到有消息,如果我自己加信号量怎么弄呢?刚学,不是很懂  别见怪 ...

消息也可以当作信号量来使用.

出0入0汤圆

10
 楼主| 发表于 2014-9-12 10:30:19 | 显示全部楼层
本帖最后由 summarize 于 2014-9-12 10:42 编辑
动车组 发表于 2014-9-12 10:02
我看你之前的那个版本,感觉非常不错,并且在一些小系统上应用起来了,当然只是用其中的调度器(没有使用消 ...


基本都正确,但有一点补充下:
2、任务中定义的变量一定要是静态变量(static),但是可以在任务调用的函数中使用局部变量.

且不能使用局部变量的原因是任务在调用延时,或等待消息命令时,任务会返回,则局部变量值可能会改变,下次进来继续使用局部变量值就会出错.

由此可知只要保证在任务中,局部变量在使用前要赋值,铕一次性运行直到得出结果再调用延时或等待消息命令,则也可以使用局部变量,如果这段话看不懂,任务中就直接使用静态变量.

另: 新版本有初始化定时计数器.

问: 任务的优先级怎么确定的,跟任务创建的先后有关?

答:如你有两儿子,长子的优先级高(因为他先出生),当每次你买好吃的东西回来后,都会先问下长子,是否要吃,之后才轮到次子.所以不管你买的东西是否有多份,长子如果想吃都能吃得到.

任务创建先后顺序优先级,就如长次了出生先后的优先级.


----------------------------------------------------------------------------------------
编辑原因:补充 "2、"

出0入0汤圆

11
 楼主| 发表于 2014-9-12 10:52:46 | 显示全部楼层
动车组 发表于 2014-9-12 10:40
哈哈哈 谢谢你的点拨,明白了~你的这个比喻太洽淡了

不谢!
上面的回复作了一些补充.

你不使用消息会显得更简洁,方便就晒晒你的成果哈.

出0入0汤圆

12
 楼主| 发表于 2014-11-7 11:42:31 | 显示全部楼层
Vmao 发表于 2014-11-5 20:16
楼主在线赶快回复小弟下

晕,我记得回复了啊.难道被吃了?

再次回复:
是这样.

出0入0汤圆

13
 楼主| 发表于 2014-11-7 12:25:27 | 显示全部楼层
fengyunyu 发表于 2014-11-7 11:59
简单些的,一般用pt thread

是的,相当于只作了优化.

出0入0汤圆

14
 楼主| 发表于 2014-11-10 10:55:44 | 显示全部楼层
guolun 发表于 2014-11-9 21:04
你的调度器,我算初步弄懂了。现在想用于公司的产品。可以吧?
有个问题请教:给一个任务发送消息,先用g ...

1.可以.

2.这个调度器确实有不完善的地方,只能用变通的方法来处理

   如:数码管设定为等待消息(不延时),另一个要向它发送消息的任务,固定时间(如10ms)整理好数据并给数码管任务发消息,这样,数码管任务每次都是接收到新的消息后再执行.

   你看这样行不?

出0入0汤圆

15
 楼主| 发表于 2014-11-14 08:58:09 | 显示全部楼层
guolun 发表于 2014-11-13 11:42
我把它用于C++环境,任务指针指向对象函数,出现提示:Error: a pointer to a bound function may only be  ...

本人对C++不懂啊,呼叫论坛高手给你解答.

出0入0汤圆

16
 楼主| 发表于 2014-12-26 08:58:47 | 显示全部楼层
byrin219 发表于 2014-12-25 21:16
想问楼主,目前这个调度器是貌似只能传递单个消息的。用在按键或触摸中断任务中,很可能前一次的消息还没来 ...

传递消息指针,指针指向数组,数组可以存放很多数据.对于你的要求,这样做可否?

出0入0汤圆

17
 楼主| 发表于 2015-7-9 21:12:46 | 显示全部楼层
hyf88 发表于 2015-7-9 16:50
是不是每个任务执行的时间不能超过 10ms?  

看了上面的回复,不知道我的理解是不是这样的? ...

是这样.  

出0入0汤圆

18
 楼主| 发表于 2015-7-13 10:47:36 | 显示全部楼层
hyf88 发表于 2015-7-13 09:54
要是这样的话,好像有些应用还不适合的,是吗?

还是说把任务分成小时间段? ...

正常情况下的应该都不会超过10ms,主要是在刷显示屏的情况下才会用比较长的时间。

如你所说,这个时间可以分成小时间段来解决,如刷新了1/5时,先退出,下次再刷新1/5。如此循环。

当然具体是不是1/5,和显示屏总的刷新时间有关,请自行计算。

出0入0汤圆

19
 楼主| 发表于 2015-11-22 12:21:43 | 显示全部楼层
bondxie3 发表于 2015-11-16 09:09
楼主, 大致看了一下,keilC51中貌似没有使用OVERLAY哦,使用没有问题吗?
"当函数指针用在Keil C51中时,一定 ...

出来工作就没有用过KEIL软件了,这也是临时重新搞了一下,自己测试过没问题,当然只是一般的测试,并没有很深入的测试.欢迎讨论.

出0入0汤圆

20
 楼主| 发表于 2017-8-17 18:45:55 | 显示全部楼层
rootxie 发表于 2017-8-9 16:09
那个行数类型看起来有点小问题,现在一个.c 文件很容易超过255行,而超过65535行的几率基本没有,建议改成u ...

这个是函数内的,一个函数很少超过255行的.如果特殊应用超过255行,可以自行修改定义即可.

出0入0汤圆

21
 楼主| 发表于 2017-11-6 20:35:16 | 显示全部楼层
lattice2008 发表于 2017-10-23 23:45
请问下大神,如果我用这个OS 然后有些标志位用全局变量,是否要设为互斥的变量? ...

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

本版积分规则

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

GMT+8, 2024-7-5 17:09

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

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