itomsu / msos Goto Github PK
View Code? Open in Web Editor NEWThis project forked from raindi-wangsw/msos
This project forked from raindi-wangsw/msos
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处理,更便于理解
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.