summarize 发表于 2014-7-26 08:56:46

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


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



欢迎测试并指出八哥。

bbglx 发表于 2014-7-26 09:03:40

前排。楼主高手,不知道什么问题我才能想楼主那样。

aming2046 发表于 2014-7-26 09:09:17

期待STM32 KEIL MDK版本的早点出来啊 ,呵呵,楼主辛苦了

summarize 发表于 2014-7-26 10:00:10

本帖最后由 summarize 于 2014-7-26 10:02 编辑

aming2046 发表于 2014-7-26 09:09
期待STM32 KEIL MDK版本的早点出来啊 ,呵呵,楼主辛苦了

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

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

Vampireyifeng 发表于 2014-7-26 14:03:44

顶楼主,强大

2012Ehome 发表于 2014-7-26 14:25:58

谢谢了!最近正在看一个基础的OS熟悉后准备上UCOSII

ppdd 发表于 2014-7-27 18:16:29

谢谢楼主! 自己边学变弄,进度太差了!
下载测试下。

minier 发表于 2014-7-27 21:17:05

楼主辛苦!

fengyunyu 发表于 2014-7-28 06:23:00

LZ的调度器,是抢占式,还是?protothread,单片机用用就不错了。

summarize 发表于 2014-7-28 06:38:35

fengyunyu 发表于 2014-7-28 06:23
LZ的调度器,是抢占式,还是?protothread,单片机用用就不错了。

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

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

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

embeddev_1 发表于 2014-7-28 06:51:40

本帖最后由 embeddev_1 于 2014-7-28 06:55 编辑

好东西啊 ,准备试试stm8的,不知道stm8s207可以用吗?{:biggrin:}
占用内存多少啊

summarize 发表于 2014-7-28 06:56:02

embeddev_1 发表于 2014-7-28 06:51
好东西啊 ,准备试试stm8的,不知道bug多吗?
占用内存多少啊

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

minier 发表于 2014-7-28 07:12:40

调度器耗费的代价非常低

embeddev_1 发表于 2014-7-28 09:53:40

在stm8s207上面移植了一下。可用!粗看了一下,tim4_init里面时钟中断100us一次,太快了!{:biggrin:}
能不能改到5ms一次~
好东西呀!还要细细研究下!希望楼主能继续完善,加入信号量,队列,邮箱之类的,做到真正的实时抢占多任务系统!{:biggrin:}

summarize 发表于 2014-7-28 12:30:48

embeddev_1 发表于 2014-7-28 09:53
在stm8s207上面移植了一下。可用!粗看了一下,tim4_init里面时钟中断100us一次,太快了!
能 ...

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

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

dxgdsx 发表于 2014-8-15 09:10:25

非常赞赏楼主的共享精神,仔细阅读了源码,有几个问题想请教一下,谢谢。
1、任务节拍处理函数void SCHTimeTick(void)在极端条件下可能会出错,因为这个函数会被中断函数打断,而此处变量g_u8SchedTicksCnt是一个共享资源。当SCH_TIM_TO_TICKS_CMP取值比较凑巧时,就会导致出错了。我考虑了一下,使用一个备份变量来备份g_u8SchedTicksCnt也许可以改善,但还是不能完全消除,除非此处禁用中断,但是会导致延时。
原始代码
/* 任务节拍处理 */
void SCHTimeTick(void)
{
SCH_MAX_TASK_TYPE i;

SCH_TCB *pTCB;

if (g_u8SchedTicksCnt >= SCH_TIM_TO_TICKS_CMP)
{
    g_u8SchedTicksCnt -= SCH_TIM_TO_TICKS_CMP;
   
    pTCB = pFirstTCB;
    for (i = 0; i < TaskNumberSum; i++)
    {
      if ((pTCB->TimeCounter != SCH_TASK_PEND)
          && (pTCB->TimeCounter > 0))
      {
      pTCB->TimeCounter--;
      }

      pTCB = pTCB->pNextTCB;
    }
}
}

改动后的代码
/* 任务节拍处理 */
void SCHTimeTick(void)
{
SCH_MAX_TASK_TYPE i;
SCH_UINT8 backup;

SCH_TCB *pTCB;


backup = g_u8SchedTicksCnt;

if (g_u8SchedTicksCnt >= SCH_TIM_TO_TICKS_CMP)
{
    /*
    这个地方有一个潜在bug,如果SCH_TIM_TO_TICKS_CMP的值取得比较凑巧,
    当进入这个if语句但尚未执行第一条语句时,发生了中断,而中断服务函数会对
    g_u8SchedTicksCnt这个变量加1,一旦凑巧使其溢出,然后中断返回执行此处
    第一条语句时,会产生问题。
   
    使用一个备份变量会有所改善,但是并不能彻底解决,除非关闭中断,但是会影响实时性能
    */
      //
      backup -= SCH_TIM_TO_TICKS_CMP;
      g_u8SchedTicksCnt = backup;
      //g_u8SchedTicksCnt -= SCH_TIM_TO_TICKS_CMP;
      //

    pTCB = pFirstTCB;
    for (i = 0; i < TaskNumberSum; i++)
    {
      if ((pTCB->TimeCounter != SCH_TASK_PEND)
          && (pTCB->TimeCounter > 0))
      {
      pTCB->TimeCounter--;
      }

      pTCB = pTCB->pNextTCB;
    }
}
}

2、任务控制块SchTcb结构体类型中内建了消息,可以通过宏定义使能。其本质上就是一个全局变量,通过对这个全局变量标志进行读写设置,使得各个任务之间进行消息传递。
但是从源码看,如果使能该功能,则每一个任务控制块都会分配这个消息,这是否会造成一些浪费。
struct SchTcb
{
    /*
    讨论:
    并不是所有的任务都需要使用消息这个功能,但是如果使能了这个功能
    就会为所有任务都分配一个消息块,这样会造成浪费,
    1、是否可以做成由创建任务时进行选择,这样的话在创建任务时需要多传入一个标志参数,
    创建函数根据标志来确定是否需要使用消息功能,如此可以节省内存,但是灵活性还是不够
   
    2、或者可以自动创建,但是可以将它挂载到某个任务上,这样做使得消息创建与任务创建是独立的,不耦合的
    可以自动改动,哪个任务需要使用,就自行创建消息并与之发生联系(挂载)
    */
#if SCH_CFG_Q_EN > 0u
void          *pData;       //消息指针
SCH_UINT8         Size;         //消息的大小
#endif

    SCH_DLY_TYPE    TimeCounter;//定时计数器,时基为 "SCH_SYS_TICKS_MS"
void          (*pTask)();   //任务指针
struct SchTcb *pNextTCB;    //下一个任务控制块指针
};

y1z2f4 发表于 2014-8-15 09:57:01

看看,收藏,谢谢。

summarize 发表于 2014-8-15 21:58:11

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

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

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

dxgdsx 发表于 2014-8-16 11:17:37

summarize 发表于 2014-8-15 21:58
1.会出错,那么我们要问: 会出什么错,出了这个错会造成什么后果,这个后果系统能接收不?

2.一般的系 ...

我可能有些钻牛角尖了。
1、举个比较极端的例子。
如果g_u8SchedTicksCnt = 255; SCH_TIM_TO_TICKS_CMP = 255;
程序刚进入if语句块,此时发生中断,g_u8SchedTicksCnt加1则溢出,然后返回执行g_u8SchedTicksCnt -= SCH_TIM_TO_TICKS_CMP; 这样g_u8SchedTicksCnt的值就乱了。
至于后果,应该就是产生了一一些时间上的偏移,不会有致命的后果。不知道分析的对不对。

2、楼主可能更关注一个统一的格式。一般任务也不会很多,实际这样应该就可以了。

summarize 发表于 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.如你所说.

dxgdsx 发表于 2014-8-17 12:22:20

summarize 发表于 2014-8-16 21:12
1.a. 255*0.1=25.5ms,如果你的系统跑一个循环超过了这个时间,也许应该考虑上OS了.一般情况是小于5ms,多点 ...

嗯,经过楼主这么解释,我发现我确实钻了牛角尖了。
这个统一框架确实非常方便了,我之前一直想着在这基础上加入一些附加功能,现在想想其实是不必要的。

summarize 发表于 2014-8-17 21:28:57

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

谢谢支持!

tjulg 发表于 2014-8-29 11:44:53

我也在用这个调度器,看到有消息,如果我自己加信号量怎么弄呢?刚学,不是很懂别见怪{:smile:}

summarize 发表于 2014-8-29 12:18:52

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

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

动车组 发表于 2014-9-12 10:02:28

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

summarize 发表于 2014-9-12 10:30:19

本帖最后由 summarize 于 2014-9-12 10:42 编辑

动车组 发表于 2014-9-12 10:02
我看你之前的那个版本,感觉非常不错,并且在一些小系统上应用起来了,当然只是用其中的调度器(没有使用消 ...

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

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

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

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

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

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

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


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

动车组 发表于 2014-9-12 10:40:35

summarize 发表于 2014-9-12 10:30
基本都正确,但有一点补充下:
2、任务中定义的变量一定要是静态变量(static),但是可以在任务调用的函数 ...

哈哈哈 谢谢你的点拨,明白了~你的这个比喻太洽淡了

summarize 发表于 2014-9-12 10:52:46

动车组 发表于 2014-9-12 10:40
哈哈哈 谢谢你的点拨,明白了~你的这个比喻太洽淡了

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

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

aasf3 发表于 2014-9-12 11:03:57

好东西,先收藏了,有机会用到产品上

动车组 发表于 2014-9-12 15:31:39

summarize 发表于 2014-9-12 10:52
不谢!
上面的回复作了一些补充.



谢谢!我之前把你的这个调度器的调度机制理解了一下,任务创建就是构建一个任务控制块的链表,然后启动任务调度器的时候就是就是沿着这条链表查询有否需要运行的任务,
有的话就运行这个任务,然后挂起或者延时,之后又从链表头开始查询。(之前刚开始任务中的延时或者挂起没看明白,后来把宏全部替换回来,就清楚了)
你说的那个不用静态变量的情况大概也知道,现在你再指点了一下,理解更透彻了。
下面是我之前做的一个小玩意的一个代码(不是最终代码),第一次用stm8及IAR,请多指教!


蓝蓝的恋 发表于 2014-10-17 16:12:31

看一下高版本~

阿文 发表于 2014-10-17 17:45:15

谢谢分享。

Vmao 发表于 2014-11-5 20:14:43

准备用这个移植到stm32f0 系类上    看了下代码 除了串口adc 啥的额外的东西 好像就修改时钟定时器就行

#define SchedTicksInc()       g_u8SchedTicksCnt++

void TIM0_OVF_IRQ(void)        interrupt 1 //using 1
{
SchedTicksInc();

//mWdtClr(); //清狗

TF0 = 0;               
}


修改到----->


void SysTick_Handler(void)
{
    SchedTicksInc();
}

就行了是吗?

Vmao 发表于 2014-11-5 20:16:01

楼主在线赶快回复小弟下

cpwander 发表于 2014-11-5 21:51:43

顶下,标记后折腾

baoya1 发表于 2014-11-7 10:17:12

感谢你的发布啊

rongade2008 发表于 2014-11-7 11:16:12

顶下,谢谢分享!

summarize 发表于 2014-11-7 11:42:31

Vmao 发表于 2014-11-5 20:16
楼主在线赶快回复小弟下

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

再次回复:
是这样.

fengyunyu 发表于 2014-11-7 11:59:04

简单些的,一般用pt thread

summarize 发表于 2014-11-7 12:25:27

fengyunyu 发表于 2014-11-7 11:59
简单些的,一般用pt thread

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

guolun 发表于 2014-11-9 21:04:38

summarize 发表于 2014-9-12 10:52
不谢!
上面的回复作了一些补充.



你的调度器,我算初步弄懂了。现在想用于公司的产品。可以吧?
有个问题请教:给一个任务发送消息,先用getQfree,check那个任务是否处于挂起状态。
但如果任务是每隔一段时间就需要运行的。如数码管显示任务。那么这个任务就不会挂起,只是延时。
我要给这个显示任务传递消息,怎么办?

summarize 发表于 2014-11-10 10:55:44

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

1.可以.

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

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

   你看这样行不?

guolun 发表于 2014-11-10 11:31:54

summarize 发表于 2014-11-10 10:55
1.可以.

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


谢谢回复。
那么我写个计时的任务,专门向各个任务发送时间的消息。

guolun 发表于 2014-11-13 11:42:34

我把它用于C++环境,任务指针指向对象函数,出现提示:Error: a pointer to a bound function may only be used to call the function。好像是回调函数的问题。无法解决。

summarize 发表于 2014-11-14 08:58:09

guolun 发表于 2014-11-13 11:42
我把它用于C++环境,任务指针指向对象函数,出现提示:Error: a pointer to a bound function may only be...

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

蓝蓝的恋 发表于 2014-11-27 10:28:24

刚好测试51.哈~

chun_hua82 发表于 2014-11-27 17:52:04

学习学习 谢了!

byrin219 发表于 2014-12-25 21:16:39

想问楼主,目前这个调度器是貌似只能传递单个消息的。用在按键或触摸中断任务中,很可能前一次的消息还没来着及处理就会被后一次的覆盖掉,这种情况下消息队列就应该顶上,试着改了一下,貌似这种结构下有些困难。求指教!

yjbin 发表于 2014-12-25 21:28:28

编译出现这个啊?
RAMSIZE(256)
******************************************************************************
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 0981H BYTE (118%) *
******************************************************************************
Program Size: data=9.0 xdata=194 code=3154
LINK/LOCATE RUN COMPLETE.0 WARNING(S),0 ERROR(S)
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
    MODULE:D:\KEIL\C51\LIB\C51L.LIB (-----)
    LIMIT:   0800H BYTES
Target not created

yjbin 发表于 2014-12-25 21:33:01

原来是我的KEIL没破解。晕

summarize 发表于 2014-12-26 08:58:47

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

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

byrin219 发表于 2014-12-28 20:52:23

本帖最后由 byrin219 于 2014-12-28 20:54 编辑

summarize 发表于 2014-12-26 08:58
传递消息指针,指针指向数组,数组可以存放很多数据.对于你的要求,这样做可否? ...

对呀 对呀 我也是这样考虑的。以前写程序一直用的是基于时间片的调度器。没有优先级这个概念。看到楼主这个有优先级感觉比较好,有时间再弄一弄!

hyf88 发表于 2015-7-9 16:50:21

是不是每个任务执行的时间不能超过 10ms?

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

summarize 发表于 2015-7-9 21:12:46

hyf88 发表于 2015-7-9 16:50
是不是每个任务执行的时间不能超过 10ms?

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

是这样.

hyf88 发表于 2015-7-13 09:54:42

summarize 发表于 2015-7-9 21:12
是这样.

要是这样的话,好像有些应用还不适合的,是吗?

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

summarize 发表于 2015-7-13 10:47:36

hyf88 发表于 2015-7-13 09:54
要是这样的话,好像有些应用还不适合的,是吗?

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

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

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

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

hyf88 发表于 2015-7-13 11:41:44

summarize 发表于 2015-7-13 10:47
正常情况下的应该都不会超过10ms,主要是在刷显示屏的情况下才会用比较长的时间。

如你所说,这个时间可 ...

哦哦,,明白了,

BOERLBH 发表于 2015-9-29 23:09:51

NB 下载 试试谢谢

nuncle 发表于 2015-9-30 14:42:31

mark{:lol:}

bondxie3 发表于 2015-11-16 09:09:05

楼主, 大致看了一下,keilC51中貌似没有使用OVERLAY哦,使用没有问题吗?
"当函数指针用在Keil C51中时,一定要注意编译器自动生成的函数调用树通常是不正确的,需要手动调整。否则可能造成无法预知的后果。"

summarize 发表于 2015-11-22 12:21:43

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

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

rootxie 发表于 2017-8-9 16:09:48

那个行数类型看起来有点小问题,现在一个.c 文件很容易超过255行,而超过65535行的几率基本没有,建议改成uint16,或者根据宏定义修改

阿鲁文 发表于 2017-8-13 19:20:31

mark,学习一下

summarize 发表于 2017-8-17 18:45:55

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

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

su33691 发表于 2017-8-31 08:40:42

前后浏览了几个调度器的帖子,还是先玩玩楼主的类OS调度器。

Phonse 发表于 2017-9-12 08:48:05

最近在看这方面的东西。。学习一下

EE_Duan 发表于 2017-9-13 17:39:03

请教大家, 此宏定义工作机理是什么? 怎么判断当前的任务应该执行?

#define SCHTaskQpend() {SchLc=SCH_CURR_LINE;\   
pCurTCB->TimeCounter=SCH_TASK_PEND;\               
pCurTCB->pData=(void *)0;}return;\                        
case SCH_CURR_LINE:

EE_Duan 发表于 2017-9-13 17:46:19

明白了, 挂起后pCurTCB->pData=(void *)0; 调度器不再访问此函数. 直到发送消息的函数将其唤醒

lattice2008 发表于 2017-10-23 23:45:13

请问下大神,如果我用这个OS 然后有些标志位用全局变量,是否要设为互斥的变量?

summarize 发表于 2017-11-6 20:35:16

lattice2008 发表于 2017-10-23 23:45
请问下大神,如果我用这个OS 然后有些标志位用全局变量,是否要设为互斥的变量? ...

是否要设为互斥的变量,要看你的实际应用要不要设置为互斥访问,和OS无关啊。
页: [1]
查看完整版本: 类OS调度器V2.0版本,等不及了,先上KEIL版本的吧.