uC/OS-II是最早进入国内的一款开源RTOS,由于代码开源,又有配套的书本,加上不大的代码量,在嵌入式集体中最为盛行。在写“有用单片机体系”第一版之后,就触摸了uC/OS-II,尽管大致的了解其作业原理,但一向似懂非懂,特别有太多的宏界说,严峻的搅扰了源码的阅览,加上RTOS带来太多的概念,而这些概念都没有实践用过,不知道怎么运用,而且听说有许多圈套,所以心里有些空,掌握不住危险,一向都逃避RTOS。高频机开发的后期,菜单界面编程的杂乱性严峻的搅扰了事务逻辑,强逼我规划msOS的时分,考虑把事务逻辑与菜单界面分脱离,这必需求引进RTOS,而uC/OS-II由于广为人知又相对简略一些,所以挑选了uC/OS-II。
这一次正式选用uC/OS-II,必需求深化了解透彻每一个细节,不然由于自己对uC/OS-II的了解不到位,特别是使命之间的通讯等细节问题引起的缺点或许让自己的项目失利,这是不行承受的,所以参阅书本细心的阅览源码,但是一触摸这个源码,就让我犯晕,uC/OS-II为了完成可装备、可削减,运用了许多的宏界说,考虑到各种情况,这严峻的搅扰了我的阅览,一起也有许多网友向我反响相似的问题,由于要了解uC/OS-II的中心原理,却经常被许多没用的源码搅扰,他们迫切需求一份简略、明晰的源码,所以我决议先弄出一份能够明晰阅览的源码来。
第一步,去掉了绝大部分跟内核无关的事情办理功用,比方信号量、互斥型信号量、事情标志组、音讯邮箱、内存办理这几个功用,只保存了msOS往后需求用到的时间办理、音讯行列功用,这样一来,简直就剩余内核部分源码,阅览大大简化了,体系基本上没有什么宏界说了,下图为uC/OS-II的头文件,十分简略,只需求界说三个宏界说:使命数、事情数和音讯行列数,关于msOS来说,默许便是2、1、1,形式化了,不需求改动。

第二步,进一步去掉用不上的功用函数,比方时间办理中只保存OSTimeDly函数,音讯行列中只保存创立行列、发送音讯、等候音讯三个必需求用的函数。使命办理中只保存了一般的创立使命函数,其它的删去使命,挂起使命等都删去了,由于msOS中不行能用到删去使命,挂起使命这些函数,放着除了搅扰我之外,没有其他效果。这样一来,基本上就没有多少宏界说了,代码较简单看懂了,下图为前两步精简后的uC/OS-II接口函数。

第三步,由于能够看懂代码,就越觉得msOS不需求uC/OS-II这么多杂乱的功用,比方msOS一般来说只需求两个使命即可,uC/OS-II却支撑64个使命,由于支撑64个使命,需求一个8*8bit的安排妥当表,为了完成快速查找最高优先级使命,需求一个算法和一个256字节的查找表,尽管这些不是很杂乱,但却把许多人搞的稀里糊涂的,比较绕,严峻的搅扰了内核的阅览了解,所以要下降使命,只需求支撑8个即可,关于msOS来说,8个都现已太多了,彻底满意了,而实践的项目,一般都是几个使命即可,不主张我们开太多的使命,这样严峻影响功率,而且各个使命之间通讯,拜访资源等都简单引起许多抵触,了解不精确会导致一系列问题。
下图为msOS双使命查找表,数组中只需4个数据。实践上由于msOS只需两个使命,MenuTask是永久最低使命存在,只需LogicTask激活,就立刻履行LogicTask,处理完后再退到MenuTask,所以只需求辨认LogicTask即可,底子不需求算法中的查找表,仅仅为了保存与uC/OS-II一致,预留扩展8个使命,所以还保存了使命查找表风格。

第四步,由于只需8个使命,而uC/OS-II默许有两个内部使命:计算使命与闲暇使命,所以需求去掉这两个使命,msOS中必需求有事务逻辑与菜单界面两个使命,优先级最低的使命是菜单界面,这样还有6个使命能够供额定运用,6个现已足够了,非特别情况下,不主张用。
第五步,uC/OS-II的使命块和事情块是选用链表结构的,能够动态增删,但这一点关于绝大部分项目来说,没有意义,特别是对msOS来说,底子就不需求动态的,所以把链表结构改成数组结构,这样十分简单看懂,也节约资源。
第六步,按C#言语风格标准化,跟msOS一致编程风格。
经过以上六步操作操作之后,uC/OS-II十分简略明了,只需os.c、os.h和os_a.asm三个文件,os.c中只需寥寥15个函数,os_a.asm中只需4个汇编函数。考虑到扩展性,仍是保存了uC/OS-II的一些影子,其实若再精简下去,或许就只剩余一个内核切换,msOS只需求两个使命即可,彻底能够精简到跟uC/OS-II无关了。