打印

嵌入式微系统(msOS)正式发布

[复制链接]
楼主: lldwsw
手机看帖
扫描二维码
随时随地手机跟帖
41
楼主牛人啊 !~特来膜拜 !~~

使用特权

评论回复
42
lemonsuan| | 2013-8-10 11:24 | 只看该作者
看了看源码,只能说,祝你好运吧。。。

使用特权

评论回复
43
lldwsw|  楼主 | 2013-8-10 12:32 | 只看该作者
界面设计对于小项目来说不复杂,但对于稍微大一些的项目,界面一多,尤其是一些动态数据需要显示,参数需要设置,界面设计就变得相当复杂,此外LCD驱动一般总线速度不高,显示刷新还不能太快,不然动态数据无法看清,这个导致界面显示必须要与业务逻辑独立分离。复杂的界面需求没有一个简单、统一的标准开发模版,导致在大部分嵌入式项目中,界面部分的代码最难被别人看懂,传承性难度大。虽然现在有uc/GUI等标准化的界面设计库,但它适合于彩色点阵屏,并且系统过于复杂而没有多少人会用。而很多工业类嵌入式项目,一般都用黑白屏,具有简单、可靠,开发难度低,对处理器要求低的优点,毕竟重点不是界面的色彩,而是系统本身的性能。高频感应加热项目就采用128*64点阵的黑白字库屏,支持8*4个汉字或者是16*4个字母。
因为界面的这些需求,导致项目修改的越来越复杂,时间长了自己都迷糊,而现实又逼我不得不抽身离开高频感应项目组去开拓新的产业,所以必须要把这些软件教给继承者,而他的软件基础基本没有,虽然在我的指点下加上他对高频感应设备本身的熟悉,所以能看懂业务逻辑并能稍做修改,但对于界面设计基本上一头雾水。这些都促使我不得不重新设计全新的系统,解决界面问题。
因为MS4是基于NXP的芯片,这是因为我原来的朋友圈都是推广NXP的,想着好采购,但通用性,资料毕竟没有ST多,客户群体也没有ST的广泛,所以在设计升级的时候,就基于ST最常用的STM32F103R8T6或者是STM32F103RBT6来设计。先是基于STM32F103的驱动库把MS4移植上来,再增加一些功能,如为串口设计了一个发送BUFFER,把要发送的数据打印到BUFFER中来,再用系统节拍SystemTick每秒1000次的把数据发送走。引入了高频感应加热项目中做的一些界面分层设计思想,让界面显示与业务逻辑实现独立,但这个是基于消息机制的,没有实现优先级。升级后的叫MS5,在去年年底发布推广。
为了进一步解决界面的分层独立显示,去年年底着手学习RTOS,参考了多家RTOS,最终选择客户群体最为广泛的uC/OS-II,因为它有书可以参考。很多网友向我抱怨uC/OS看都看不懂,谈何用啊,心里抵触感很强。分析发现他们主要是被过多的宏定义、数据结构、指针、过多的不常用的附属功能所困扰严重的影响了对程序的阅读,他们甚至不知道那些函数是重点,这个问题对我来说,同样头疼,导致思维不清晰,于是我从精简入手,先把跟系统关系不大的一些不常用的附属功能去掉,再去掉一些没用的宏,甚至在开发msOS时期,把任务数从64个变成了8个,去掉了复杂的优先级计算,去掉了复杂的链表结构而改用数组,去掉了很多删除函数,如删除任务、删除事件之类,最后一个uC/OS只剩下最核心的内核和必要的功能函数,文件只有3个,看起来简单易懂,语法非常简单。之后把MS5与初步精简化的uC/OS整合在一起出了一个版本,MS5作为uC/OS的最低优先级任务,当时就叫msOS,也放在了网上,但考虑到种种原因,尤其是感觉有点两个东西强行合在一起的感觉,所以基本上没有推广而放弃了。
做到这儿,自己迷惑了,如何把MS5的优点与uC/OS完美的结合起来,解决GUI与业务逻辑的分层问题,但第一版的msOS这种粗粗的结合,很不协调,不能解决分层问题,还需要深入分析GUI到底是什么,于是转向跟华禹工控的几位软件负责人沟通,我把我的需求告诉了苏鹏,他长期做Linux,曾师从RTLinux/GPL维护人Prof. Nicholas McGuire,具有对开源和互联网天然的敏感性。因为来公司后长期负责MTK手机开发和JAVA设计,所以对界面有非常深入的理解,我们讨论之后,他建议我在MS4下重新构建高频感应加热设备的程序,尤其是界面部分, GUI与业务逻辑要想实现分层,在MS4的消息机制下,会导致一个问题,那就是每次刷屏显示都要从头到尾完整的来一次完整的程序执行,中间不能打断退出,这会导致业务逻辑响应速度降低,此外这个从设计思维上讲属于并行设计,每次进来都需要全部解析一遍,费用很高,而C语言程序设计常规的是串行设计思维,顺序执行下来的,所以在编程初期非常痛苦。经过将近一个月的开发,在MS4上实现了独立的GUI(此时的GUI概念还不是很清晰,跟后来msOS的GUI完全两码事情)设计,完成了高频感应项目的界面需求,但感觉很是别扭,一是没有彻底的基于RTOS优先级的分层设计,二是并行再入写法,让思维不适应,别人很难学。所以最后这个版本就停了,没有再继续下去。
虽然这次GUI的设计失败,但让我有了实际经验,进一步加深了对GUI的理解,于是我再一次开始寻找我想要的GUI。GUI在PC上位机编程中技术非常成熟,早期有VB、DEPHI、VC等,现在流行的有JAVA、C#。我之前接触过一点点JAVA,虽然也类此C语言,但差异还有点大,用起来觉得不是很爽就没学了,恰好华禹工控有WINCE项目,一般用C#开发,而C#则是微软总结了自己这么多年的开发经验,吸收了VB、DEPHI、JAVA、VC的优点整合起来的接近C语言的一门新语言,特点是简单、易用、接地气,这个符合我的理念,于是向他们请教了一些C#的概念,在网上搜索了不少资料对比了一下当前的这些语言特性,觉得C#很适合我,一是语法来自于C语言,具有兼容性,而是它的命名法则非常好、长命名看词识意,提高了阅读性,三是整个架构设计非常完美,命名空间给我留下很深的影像,可以很好的解决大一些项目的重名问题,尤其是全局变量,四是面向对象设计,各种GUI控件,可以很好的解决GUI问题、五是若按照C#模版设计,这样公司内若普及msOS,则同时把上位机C#编程也学了,今后公司内部可以有很好的语言统一性,而C#跟JAVA又类似,这些都可以水到渠成,这些正是我想要的,之后买书Step by Step学习了2个月差不多时间.

使用特权

评论回复
44
hallyin| | 2013-8-10 22:35 | 只看该作者
虽然当前不用,但是想您致敬

使用特权

评论回复
45
hynwind| | 2013-8-11 19:10 | 只看该作者
非常好

使用特权

评论回复
46
le062| | 2013-8-11 20:29 | 只看该作者
学rtos中
rt-thread有点复杂,先拿您的作品啃一啃:lol

使用特权

评论回复
47
lldwsw|  楼主 | 2013-8-11 21:27 | 只看该作者
楼上,里面的uC/OS精简版本非常容易看懂,只有三个文件,去掉了太多不常用的功能,并且任务只有8个,去掉了很多复杂的链表结构

使用特权

评论回复
48
lldwsw|  楼主 | 2013-8-11 21:29 | 只看该作者
书的前言部分已经更新完了,接下来把MS3按msOS风格处理一下,正式开始写书了。

使用特权

评论回复
49
greadber| | 2013-8-11 22:01 | 只看该作者
本帖最后由 greadber 于 2013-8-11 22:07 编辑

修改了一下 上下文切换码,去掉了跳转指令:
;;;;;;修改后
OsStartHighReadyTask                         ;第一次切换任务
        LDR     R4, =NVIC_SYSPRI2         ; set the PendSV exception priority
        LDR     R5, =NVIC_PENDSV_PRI
        STR     R5, [R4]
        LDR     R4, =OsRunning            ; OSRunning = TRUE
        MOV     R5, #1
        STRB    R5, [R4]
       ;;
       LDR     R4, =OsCurrentPriority
       LDR     R5, =OsHighReadyPriority
       LDRB    R6, [R5]
       STRB    R6, [R4]
       movs r0, #0x02
       msr control, r0
  
      ;切换PSP指针
      LDR     R6, =OsHighReadyTaskPoint
      LDR     R6, [R6]
      LDR     R4, =OsCurrentTaskPoint
      STR     R6, [R4]
  
      LDR     R2, [R6]
      MOV     SP, R2       ;获取了任务栈顶  
      ;加载任务数据
      POP     {R4-R7}
      POP     {R0-R3}
      MOV     R8,R0
      MOV     R9,R1
      MOV     R10,R2
      MOV     R11,R3       ; POP R4-R11
      ADD     SP,SP,#16
      POP     {R0-R3}
      MOV     R12,R0
      MOV     LR,R2
      SUB     SP,SP,#32
      POP     {R0-R3}
      ADD     SP,SP,#16  
      BX      LR
      NOP
     B       .                ;should never get here



;上下文切换
PendSV_Handler
    CPSID  I
    mrs r0, psp      
    ldr r3, =OsCurrentTaskPoint            ;取出当前任务的 TCB 地址  
    ldr r2, [r3]      
    ;入栈
    STMDB R0!, {R4-R11}       ;Save the remaining registers
    str r0, [r2]        ;OSTCBCur->OSTCBStkPtr = SP;              
      
    LDR     R0, =OsCurrentPriority              ;OsCurrentPriority = OsHighReadyPriority;
    LDR     R1, =OsHighReadyPriority
    LDRB    R2, [R1]
    STRB    R2, [R0]
    ;就是把SP切换到优先级高的堆栈中(切换SP的指向)
    LDR     R6, =OsHighReadyTaskPoint
    LDR     R6, [R6]
    LDR     R4, =OsCurrentTaskPoint         
    STR     R6, [R4]                      ;OsCurrentTaskPoint = OsHighReadyTaskPoint
    LDR     R0, [R6]                    
    ;出栈
    LDMIA R0!, {R4-R11}
    msr psp, r0                        ; PSP=[R0]        
    CPSIE   I
    BX      LR                            ; Exception return will restore remaining context
    NOP
;修改完

使用特权

评论回复
50
lldwsw|  楼主 | 2013-8-11 22:05 | 只看该作者
谢谢,我对比一下

你这个确认过是吧

使用特权

评论回复
51
greadber| | 2013-8-11 22:05 | 只看该作者
确认过

使用特权

评论回复
52
lldwsw|  楼主 | 2013-8-11 22:30 | 只看该作者
测试了一下,可以使用,谢谢,我长期测试看看,确认可以后使用您提供的版本。

这部分汇编代码我是直接采用原来uCOS里面的,没有做过改动。

使用特权

评论回复
53
greadber| | 2013-8-11 22:33 | 只看该作者
任务没有优先级,是协作式的调度OS吧,为什么会在代码中用DelayMs(100);

void Delay(uint delayClock)
{
while(delayClock--);
}
void DelayUs(uint delayTime)
{
while(delayTime--)
{
  Delay(DelayUsTick);
}
}
void DelayMs(uint delayTime)
{
while(delayTime--)
{
  Delay(DelayMsTick);
}
}


提点见意:为了在使用 OS DEBUG时方便,请增加任务堆栈check及任务名称、hardfault异常处理!


这种处理是为了不了解OS的人方便处理操作中的问题!
以前LZ的MS系列让我受益良多,所以在此多说了几句!
谢谢!

使用特权

评论回复
54
lldwsw|  楼主 | 2013-8-11 22:40 | 只看该作者
本帖最后由 lldwsw 于 2013-8-11 22:48 编辑

任务有优先级的,第一个初始化的,优先级最高,为0,第二个为1,以此类推的。

这个要在文档中描述的,现在都在写文档,因为我去掉了uC/OS内部的链表结构而直接用数组替代。把uC/OS不常用的功能都取消了。


其次,你那个OS_A.ASM那部分我看了一下代码,按你这个改,意义不大,因为这个函数只是在START初始化的时候简单了一些,没有大的意义,我就不改了。

你说测试那部分,我再看看,明白你意思,不过我这部分汇编还没有深入看,并且对Cortex-M3的汇编还不是太熟悉,需要你的帮助,请加我QQ:26033613,谢谢!


使用特权

评论回复
55
Wayner| | 2013-8-11 22:46 | 只看该作者
小白因你而进步。谢谢,辛苦了!

使用特权

评论回复
56
greadber| | 2013-8-11 22:49 | 只看该作者
呵呵,等说明文档!

使用特权

评论回复
57
lldwsw|  楼主 | 2013-8-11 22:52 | 只看该作者
楼上客气了,能得到你们的认可是我最大的动力,一定把msOS推广好,之前MS系列的时候,经常有网友让我写书,我一直推说没时间,事实上也确实忙,精力不能分,毕竟这么多人等着吃饭。现在公司都交给同事管理了,加上msOS设计的感觉很满意,获得整个公司的认同,他们也都参与了这个项目,并且我们的很多客户群体都很支持,所以想着这个既然做了,就把他做好。

本人真正完STM32是从去年底开始的,之后一直忙着学C#,构思整个架构,在STM32本身上,理解的反而不深,需要大家多多支持,多提意见,msOS到今天不是一个人写的,而是一群人合作的了。

使用特权

评论回复
58
sdwys| | 2013-8-12 09:43 | 只看该作者
支持楼主,下载学习。

使用特权

评论回复
59
greadber| | 2013-8-12 19:23 | 只看该作者
crazy2012 发表于 2013-8-9 14:41
第七章:集中的函数退出途径

虽然被某些人声称已经过时,但是goto语句的等价物还是经常被编译器所使用, ...

晕,goto都出来了

使用特权

评论回复
60
sanguo147| | 2013-8-12 23:15 | 只看该作者
过来支持一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则