GithubHelp home page GithubHelp logo

msos's Introduction


msOS(嵌入式微系统)是王绍伟先生(网名:凤舞天,标识:wangsw)基于早期开发的“实用单片机系统(MS)”,经过多年的MTK手机开发经验,结合自己具体的项目应用,引入RTOS分离业务逻辑及菜单界面,业务逻辑基于消息机制,菜单界面采用面向对象。引入主流PC机编程**,代码编写风格及程序架构靠近C#,简单而又优雅。面向高可靠、高质量、可复用、标准化、开发、维护简单的行业,适合中小企业多人协同开发、长期维护的嵌入式C语言架构平台,主要定位于工业控制及仪器设备等领域。
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

msOS主要为了配合msPLC嵌入式PLC项目而开发,以作者前年开发的大功率6000W、1MHz超高频感应加热设备为具体设计对象设计,例子也是以它为参考设计。

作者介绍:
凤舞天,原名:王绍伟,标识:wangsw
1997年—2001年  毕业于兰州大学电信专业。在大学期间担任电子协会会长,为学校同学维修随身听、收音机等电子设备,奠定焊接、维修和做事一看、二想、三做、四检测的基础。
2001年          进入中科院半导体所光电中心工作。
2002年—2003年  进入手机行业,同时基于MCU51开发了实用单片机系统(MS)并开源推广,获得广大嵌入式初学者的好评。
2004年          创业做逆变器,虽然失败,但是从技术上、物料采购上、生产上积累了宝贵的经验。
2005年          再次创业,但是由于对市场不了解和对产品定位不明确,最终导致失败。
2006年—2009年  在深圳市华禹高科技有限公司工作,引入了MTK方案,开始手机开发。
2008年          发明了“电阻电容电感样品本”,解决广大电子爱好者基础元器件的采购、调试、存放问题。
2009年          创立了华禹工控科技有限公司,推出了P1300手机开发模块及相关手持POS产品。
2011年          与东莞市俊知机械有限公司合作,研发大功率(6KW)超高频(1MHz)感应加热焊接机。并于2012年,全面投入生产,同时获得工业自动化经验。
2013年          开始研发msPLC,针对工业自动化行业开源设计嵌入式PLC,并开发了通用开源平台架构嵌入式微系统(msOS)。 
2014年          应邀参加清华大学第二届开源操作系统技术年会推广msOS,编写msOS书籍,推广msOS。

msOS设计过程介绍:
msOS主要是为了msPLC设计开发的一套嵌入式微系统,面向嵌入式人员,是作者以前“实用单片机系统(MS)”的升级版本。在MS开源推广过程中,获得广大嵌入式群体的认可并大量使用,认为简单、易用,比较接地气。而简单易用接地气是作者的一贯风格,但随着项目的深入开发发现,基于前后台系统的MS,在开发大一些的中型项目,存在一些不足,提供的资源不够,分层不清晰,阻碍了项目的快速开发,并且产品的可靠性、可维护性也大大降低,这些都促使作者需要对MS系统进行进一步的升级,适合中型项目。
msOS相比MS,主要引入了以下功能特征:
1、全面引入C#标准开发风格,这样以C#编程风格为依托,采用长命名设计风格,便于软件编程风格长期的维护与统一,还能够提高英语用词的准确性,并且C#与JAVA风格类似,代表当前最先进的编程风格,这样学习了msOS,等于把上位机编程的基础也学会了,而具备C#、JAVA基础的,则比较容易接受msOS。
2、引入了RTOS,把业务逻辑与GUI界面设计分开,实现清晰的程序设计思路,RTOS的优先级提高了系统响应速度,目前参考uC/OS,彻底的精简,只保留了实际有效的部分,同时把容易引起混乱的宏定义尽可能的去掉,支持最多8个任务(实际不建议超过4个),只要做稍微的修改,就可以避开版权问题,当然也可以用其他第三方RTOS。
3、采用两个大的结构体:System和App,实现了类似C#的系统库与应用的完美分离,同时彻底解决了全局变量混乱问题。
4、引入GUI库,采用面向对象及链表方式设计方式如Form、Label及TextBox等控件,让图形界面设计非常简单而让设计者只关心业务逻辑设计。
5、完全按照CMSIS推荐的分层设计,便于维护程序。
6、保留MS系统的消息机制、软件定时器,实现完美升级。
7、MCU基于STM32F103最常用Cortex-M3开发

在msOS整个开发过程中,华禹工控的各位软件负责人提供了大量宝贵的经验,分别是郑德智、皮云仙、苏鹏、田飞峰及侯德平,他们各自擅长MTK手机平台、Linux、JAVA、C#及嵌入式,他们把他们认为精华的部分重点向我阐述,比如GUI面向对象的设计,结构化编程,程序的分层,在我向他们描述我想要的软件需求的时候提供咨询,尤其是苏鹏深入分析msOS架构,提出了不少宝贵的建议。此外华禹手持PDA交流群(群号15762255)的众多技术高手,提出了自己的一些意见和看法,在msOS开发的过程中一直给予强大的声援,尤其是山东-行千里路、深圳-智能家电、中山-阿雄,msOS的硬件开发板msPLC-DEMO发布的第一时间来购买支持msOS开发,在群内相互交流。
msOS里面涉及太多的指针、结构体、面向对象、OS、链表、分层等概念,不适合初学者,而是面向有工作经验的嵌入式群体,初学者建议从MS开始入手学习。

感谢大家的支持,欢迎网络交流,发现Bug请联系作者QQ:26033613,或加入msPLC开发群:291235815


msOS版本说明
MS:   原“实用单片机系统”MS3,基于MCU51开发,因MS3的客户群体广泛,为了引导客户向msOS方向转移,所以按照C#编程风格标准化,跟msOS风格统一,为msOS的基础入门版本。
msOS: 基于Stm32开发,引入C#编程风格,引入uC/OS-II,基于CMSIS软件架构模型设计,业务逻辑与菜单界面分离,菜单界面采用面向对象设计,是msOS体系的标准版本。

作者blog:
http://forum.eet-cn.com/BLOG_wangsw317_1268.HTM

配套开发板msPLC-DEMO
http://52edk.taobao.com

********************************************************************************

重要贡献者名单:
苏鹏(Tomsu):		参与msOS框架设计,对msOS模型深入分析,提出具体的GUI、分层、面向对象设计**,引入开源思维,对msOS的整体规划提出了重要贡献。
贡献者名单:
王修全(剑客):		参与msOS成型后的细节改进,尤其是FlashRom存储部分,对msOS进一步面向对象、分层提出建设性意见。
周磊(独钓千古愁):	
参与msOS成型后的细节改进,在Lite版本中,对无OS的中断优先级处理作出改进。
王国君(传说中的火枪手):		提出Lite版本需求,部分采用其代码。
彭祖云(claude):		基于PC端用C#开发虚拟屏原始模板,配套msOS,替代msPLC-DEMO中的LCD。

********************************************************************************

代码编写风格说明:
代码编写的风格,从根本上讲,应该要简单、易懂、无歧义为目的,此外因为编写大量代码是一个相对枯燥的工作,整天对着屏幕,一句一句的分析,很容易疲劳,所以代码编写还要重视优雅,符合自然审美,不为了过份追求严谨而破坏审美、扭曲人性为上,一些需要严谨的地方,可以通过编辑器,或者第三方检测手段实现。

msOS以C#命名规范为标准,以长命名为主,符合简单、易懂、优雅、无歧义的特点,以下是C#的三条命名规范
Pascal 规则,每个单词开头的字母大写(如 TestCounter)。
Camel 规则,除了第一个单词外的其他单词的开头字母大写(如 testCounter)
Upper 规则,仅用于一、两个字符长的常量的缩写命名,超过三个字符长度应该应用Pascal规则(如E,IO,PI,SN)

约定俗称,非常通用,英文字典中可以查到的一些缩写,比如Max,Min,Pwm,IO,SN,ID等,可以采用缩写字。

应用层定义的App结构体内的数据库,因为数据意思要表达清晰,所以尽可能长命名,除非十分通用缩写名(如Pwm)。为了方便其它地方使用,可以在数据库定义时,注明缩写方式,如下:
int Frequency;                 // Frq
int SerialNumber;              // SN
int ProductionDate;            // PD
int IdentifyNumber0;           // ID0
int IdentifyNumber1;           // ID1
int IdentifyNumber2;           // ID2
一些太长的全命名,确实不利于书写,可以在不影响阅读的情况下缩写(SetFrequency -> SetFrq),Frequency的缩写为Frq,在数据库中声明过。

一些常用的局部变量,比如TestCounter,可以缩写成TestCnt,这类在编程时常用,确实不影响阅读的。需要在readme中声明,这类词有
Counter				// Cnt
Receive				// Rcv

菜单界面的各类控件定义对象时,C#有一套比较规范的缩写标准,类似匈牙利命名法,如下:
static Label PowerLabel;		static Label lblPower;
static TextBox FrequencyTextBox;	static TextBox txtFrequency;	
msOS不是很推荐采用,因为msOS的菜单控件不会很多,并且一次性定义好了,全命名看上去优雅很多,但不排斥按C#风格的缩写方式。

指针类型变量定义,静态指针变量,后缀加Pointer,但有时候考虑Pointer太长,可以用前缀p(小写)代替。局部指针变量,因为在局部使用,未做严格定义,默认后缀Pointer,若实在觉得太长,可以后缀P(大写)代替

因Cortex-M3是32bit寄存器,所以尽量局部变量尽可能使用int数据类型,而不是使用byte或者short等类型,这是因为哪怕使用byte、short等数据类型,也不会节约内存,并且Cortex-M3内存足够多,没必要太省。
***************************************************************************************************************************************************************************************************
以下版本基于msPLC-Demo硬件开发板
V0.12.20150910:
1、Gui增加单精度浮点类型GuiDataTypeFloatDec,字符串直接显示类型GuiDataTypeString,采用sprintf解析数字,转换成字符显示,ModifyTextBoxData函数全新设计,支持对单精度数据类型float加减。
2、App和Menu中增加了单精度浮点数据类型的例子和直接字符串显示的例子。
3、增加data和menu数据类型,在系统层定义了data的全局指针AppDataPointer,这样便于在系统设备层直接通过指针操作数据库数据,避免频繁的数据注册,方便开发。
4、首次引入指针的缩写,全局变量前缀小写p,局部变量或者参数,后缀大写P,代替Pointer,但默认还是用Pointer,只是在不方便的时候,采用前后缀。
5、os.c中,改进了PostMessageQueue函数,增加了系统刚开始运行时,有按键消息产生,但业务逻辑没有运行到消息处理函数,出现消息错误的问题。

版本号管理说明
V0.12版本经过作者及同事实际项目开发完善后,感觉开发使用 非常方便,功能完善,所以正式采用通用版本命名法X1.X2.X3.Data_String,X1表示主版本号,X2表示次版本号,X3表示修订版本号,Data表示日期版本号,String表示希腊字母版本号,具体定义规则如下:
主版本号:      当功能模块有较大的变动,比如增加模块或是整体架构发生变化。此版本号由项目决定是否修改。
次版本号:      相对于主版本号而言,次版本号的升级对应的只是局部的变动,但该局部的变动造成程序和以前版本不能兼容,或者对该程序以前的协作关系产生了破坏,或者是功能上有大的改进或增强。此版本号由项目决定是否修改。
修订版本号:    一般是Bug的修复或是一些小的变动或是一些功能的扩充,要经常发布修订版,修复一个严重 Bug 即可发布一个修订版。此版本号由项目经理决定是否修改。
日期版本号:    用于记录修改项目的当前日期,每天对项目的修改都需要更改日期版本号。此版本号由开发人员决定是否修改。
希腊字母版本号:此版本号用于标注当前版本的软件处于哪个开发阶段,当软件进入到另一个阶段时需要修改此版本号。此版本号由项目决定是否修改。
上一级版本升级,下一级的版本号要清零。

希腊字母版本号说明
Base:   此版本表示该软件仅仅是一个假页面链接,通常包括所有的功能和页面布局,但是页面中的功能都没有做完整的实现,只是做为整体网站的一个基础架构。
Alpha : 软件的初级版本,表示该软件在此阶段以实现软件功能为主,通常只在软件开发者内部交流,一般而言,该版本软件的Bug较多,需要继续修改,是测试版本。测试人员提交Bug经开发人员修改确认之后,发布到测试网址让测试人员测试,此时可将软件版本标注为alpha版。
Beta :  该版本相对于Alpha 版已经有了很大的进步,消除了严重错误,但还需要经过多次测试来进一步消除,此版本主要的修改对象是软件的UI。修改的的Bug 经测试人 员测试确认后可发布到外网上,此时可将软件版本标注为 beta版。
RC :    该版本已经相当成熟了,基本上不存在导致错误的Bug,与即将发行的正式版本相差无几。
Release:该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式的版本,是最终交付用户使用的一个版本。该版本有时也称标准版。

***************************************************************************************************************************************************************************************************
以下版本基于msPLC-Demo开发
V1.0.0.20151003_Release
1、引入App.Data.SysTick1000数据库成员,利用此数据,Menu增加了定时刷新功能,避免系统忙与不忙时,Menu刷新速度不同的问题。
2、Gui采用%u格式打印uint类型数据。

V1.0.1.20151111_Release
1、改进device_usart1的数据发送问题,发送队列成员Entries存在双写入源,因数据回写问题导致非原子操作,会导致Entries数据错误而引起串口数据发送问题。

V1.0.2.20151123_Release
1、修改system.h中数据类型转换的的宏定义名字,Byte3,Ushort1,Float等,简单易用,此外为后续添加Modbus协议调整

V1.1.0.20151123_Release
1、增加Modbus Slave,配套Host为步科的HMI屏(ET070),显示参数有Frequency(4x,DWORD)、Voltage(2x,WORD)、Current(2x,WORD)、OnOff(0x,bool)。
2、USART2作为Modbus Slave的通讯端口,发送采用DMA,接收采用中断,成帧采用系统节拍超时。
3、本地数据与HMI屏交互采用0x、1x、3x、4x数据类型的四个数组,数组的序号就是数据的地址,序号0对应数据地址1,依次类推。
4、默认本设备客户端地址为1
5、HMI代码对应的为HMI_V1.0.0
***************************************************************************************************************************************************************************************************
以下版本基于msPLC-100C开发
V1.2.0.20151125
1、硬件平台为msPLC-100C
2、增加RTC万年历功能,时间为2013~2099年

V1.2.1.20151201 
1、修正device_di.c中的PortRegister函数端口注册错误
2、增加Adc、Di、Do的端口数据类型,并且理解节拍扫描获取端口信息
3、增加USART3驱动,为modbus_host准备
4、modbus_slave的交换数据改成三路端口(Adc、Di、Do)。

V1.3.0.20151228
1、增加modbus_host主机功能
2、统一了modbus主从机的编程风格

V1.3.1.20160323
1、IO端口位绑定采用静态指针变量操作
2、Menu初始化,分为多个函数,按页面初始化

V1.3.2.20161023
1、根据实际项目经验,增加类似AppDataPointer的页面指针AppMenuPointer,方便在设备层直接操作页面或者判断当前页面情况,提高开发效率。
2、在Gui中增加LCD屏打印调试功能控件Message,AddMessage实现类似printf打屏函数功能,利用vsprintf变参函数,方便参数打印,这个功能在实际项目中比较有意义,可以在任意页面打印。DeleteMessage取消打印信息。

V1.3.2.20161025
1、修改了ParseMessage中,X、Y坐标调换的错误。

V1.3.2.20161205
1、修改了ParseMessage代码,让它更加简单易用。
2、修改了device_rtc设备设置缺陷。

V1.3.3.20170227
1、logic.c中用message >> 24代替原来的Byte3(message),Byte3这种强制类型转换技巧,容易引起编译器优化错误
2、device_key.c中 InitKey函数 GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);代替GPIO_PinRemapConfig(GPIO_Remap_SW,J_Disable,ENABLE);解决SWD Debug时关闭SWD而导致无法调试的问题。
3、编译器默认为MDK5.15,便于JLINK_V9.2调试

V1.3.3.20170302
1、drive.h中,IO端口做了结构体化的BitBand处理,更便于理解

msos's People

Contributors

wangsw317 avatar

Stargazers

 avatar Fulgora avatar 三川 avatar  avatar Neighbor_Wang avatar Steven Wang avatar  avatar chenzhipeng avatar mico avatar  avatar  avatar the_real_Rui avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.