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
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.