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

2020-01-15 19:19发布

11734 70 70

低级版本在此处,包括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版本:

schedule-8051-Keil 20140719.rar (96.93 KB, 下载次数: 544) 2014-7-26 08:53 上传 点击文件名下载附件

欢迎测试并指出八哥。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
69条回答
summarize
1楼-- · 2020-01-17 17:45
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人赞 举报
dxgdsx
2楼-- · 2020-01-17 21:41
 精彩回答 2  元偷偷看……
0人赞 举报
summarize
3楼-- · 2020-01-18 02:04
dxgdsx 发表于 2014-8-17 12:22
嗯,经过楼主这么解释,我发现我确实钻了牛角尖了。
这个统一框架确实非常方便了,我之前一直想着在这基 ...

谢谢支持!
0人赞 举报
tjulg
4楼-- · 2020-01-18 03:43
我也在用这个调度器,看到有消息,如果我自己加信号量怎么弄呢?刚学,不是很懂  别见怪
0人赞 举报
summarize
5楼-- · 2020-01-18 06:06
tjulg 发表于 2014-8-29 11:44
我也在用这个调度器,看到有消息,如果我自己加信号量怎么弄呢?刚学,不是很懂  别见怪 ...

消息也可以当作信号量来使用.
0人赞 举报
动车组
6楼-- · 2020-01-18 09:09
我看你之前的那个版本,感觉非常不错,并且在一些小系统上应用起来了,当然只是用其中的调度器(没有使用消息),然后我总结一些注意事项,您老看一下会不会对。
注意事项:
                1、任务中不能使用switch 语句(因为任务框架使用switch实现的),但是可以在任务调用的函数中使用
                2、任务中定义的变量一定要是静态变量(static)
                3、每个任务一定要有  延时SCHCurTaskDly()或者  SCHCurTaskPend();
                4、要在启动任务调度之前建立好所有的任务
历史修改: 2014-2-28  修改创建任务没有初始化定时计数器的BUG(因为有些处理器上电Ram值不等于0)
还有问题不太清楚,就是任务的优先级怎么确定的,跟任务创建的先后有关?
0人赞 举报

一周热门 更多>