免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6369 | 回复: 7
打印 上一主题 下一主题

把我闲着没事捣鼓的小系统cn.os拿上来晒晒,贴上代码和电路图~欢迎大家提问学习讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-05 12:48 |只看该作者 |倒序浏览
借djyos的宝地,把我闲着没事捣鼓的小系统cn.os拿上来晒晒,贴上代码和电路图~
1,该系统目前支持精确延时,实时性能优秀
2、可以实现在程序运行过程中调频
3、可以实现在程序运行过程中从实时状态无缝切换到分时状态,在实时性要求不是 很高的时候可以使CPU的性能得到很好的发挥
4、可剥夺型实时操作系统
但是不足之处是目前我的系统不支持内存管理,动态创建任务,我在设计之出已经做出了可以解决的保留措施,后期可以方便的加入这些功能~~~
视频网址http://so.tudou.com/isearch.do?kw=cn.os


内核的代码不多,几十行汇编,一百多行c,没什么商业用途和价值,但是对于理解操作系统比较有帮助~
压缩包里面有电路图,源代码,还有arm的ads工程,串口驱动,lcd驱动,不过文档很少~呵呵


------------------传说中的分隔线------------------
应楼主要求删除本帖无意义回复.
bitmilong 2009.1.8

[ 本帖最后由 bitmilong 于 2009-1-8 15:15 编辑 ]

_CN_OS.rar

530.96 KB, 下载次数: 1082

评分

参与人数 1可用积分 +30 收起 理由
bitmilong + 30 精品文章

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2009-01-06 13:12 |只看该作者
感谢楼主分享

无耐国内的福利不好,限制了很多高手的发展,大家只能靠兴趣和毅力坚持,毕竟我们也要生活

希望大家能把自己的潜力发挥出来,真真正正的做点东西.

论坛徽章:
0
3 [报告]
发表于 2009-01-06 13:28 |只看该作者

回复 #2 bitmilong 的帖子

多谢斑竹提供空间,本人在此解答一切关于cn.os的问题,写的时候比较仓促,内核前后共两三个星期,没有什么文档,希望能和大家交流一下,增加对操作系统的对任务管理部分的理解,开源,开源,随便修改吧,只要改完之后能拿出来免费供国人交流就行~

论坛徽章:
0
4 [报告]
发表于 2009-01-06 13:42 |只看该作者

回复 #3 .kaka 的帖子

做项目的人往往在文档上花大量时间的,绝对大于写代码的时间,为的就是可读性好一点,毕竟做大了之后看起来还是相当费劲的,并且每个人的思路和想法是有差异的


但是我坚决支持个人写程序一气呵成,代码先出来,完善,推广时再加注释及文档的, 原因就是个人精力有限,而成果是必须的

我最近没有时间研究,置顶,希望大家可以互相学习讨论.

论坛徽章:
0
5 [报告]
发表于 2009-01-06 23:31 |只看该作者
有参照的系统吗?
ecos?

论坛徽章:
0
6 [报告]
发表于 2009-01-07 11:48 |只看该作者

回复 #9 emmoblin 的帖子

之前总是对操作系统很好奇,很好奇她怎么就能管理那么多任务而不出错,所以写之前通读了ucos的代码,理解了操作系统对任务调度的思想(呵呵,毕竟偶不是学计算机的,没学过操作系统原理啥的),然后从汇编到c都是从头开始;

假设cn.os上跑三个任务 a, b, c(优先级a > b > c > 0), 还有一个任务0,
cn.os对任务调度属:硬调度。我觉得可以说成是剥夺性;
比如:c 运行时,a 等待的时间到了(高优先级的任务由于某些原因需要运行了),cn.os将 c 压入堆栈(每个任务都有各自的堆栈),然后使a得到cpu时间,a 运行;cn.os在每个时钟中断的时候都会查任务列表,以确定那几个任务就绪,然后根据优先级使高优先级的任务得到cpu时间;

a运行完之后,a 调用 调度函数,通知系统进行调度(主动告诉系统“我over了”,而不用等到时间中断的时候才去调度),cn.os接到通知之后,查看一下任务就绪表,如果此时b没有就绪,那就把刚才被中断的c从堆栈中恢复出来,接着跑c;

。。。。。。。
当系统的中的所有任务都不需要运行(都在等待某个条件)时,任务0 开始运行,所以,通过监视任务0的运行情况可以得到系统的负载情况~~~

[ 本帖最后由 .kaka 于 2009-1-7 11:55 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-01-10 19:53 |只看该作者
/*
程序切换,就是将当前的程序状态保存到当前程序的
堆栈中,这里讲的程序状态指的是当前的寄存器,包
括通用寄存器和特殊寄存器等,然后把下一个要执行
的程序从相应的堆栈中取出来,将相应的状态恢复到
寄存器中,然后cpu开始运行该程序。这样就可以举一
反三,使cpu管理多任务了;
--62行之前都是对程序变量的声明部分,没什么可讲的
当进行任务调度的时候,cpu跳到63行执行---->(let's go)





*/
;//=================================================
;//                :Cn.oS[Operating System from China]
;//file        :        Cn_oS_switch.s
;//function:        Just to see this function,it looks like timer.s ,but it don't
;//                        use the timer5 to switch the processes .
;//                       
;//                       
;//                       
;//                       
;//                       
;//author        :        kaka(sn.kaka@yahoo.com)
;//date        :        20080718
;//=================================================



        AREA    Cn_oS_sw, CODE, READONLY
        CODE32

        IMPORT  kaka                                                        ; //show that this variable has been defined
                                                                                        ;//in other files
        IMPORT        Current_Task_P
        IMPORT        Current_PCB_P
        IMPORT        Current_PCB_P_NEXT
        IMPORT        Current_Task_ID
        IMPORT        Task_Max
        IMPORT        K_State
        IMPORT        Save_Info
        IMPORT        Cn_oS_Start
        IMPORT        Save_Info
        IMPORT        Recover_Info
        IMPORT        Switch_Task
        IMPORT        Task_Create
        IMPORT        t
        IMPORT        TEST

        EXPORT        TASK_SWITCH
       EXPORT   ATTEMPER_first                                                ;//this variable can be called in other file

NoInt       EQU 0x80         
INTT                 EQU 0x01e00024
                                               ; //no interrupt(for CPSR)
SYS32Mode           EQU 0x1f                                            ; //SYS32Mode
IRQ32Mode           EQU 0x12                                                 ; //IRQ32Mode
SVC32Mode           EQU 0x13

TASK_SWITCH                                                               
        STMFD        SP!,{R0-R3,R12,R14};//将寄存器0-3,r12,r14压入堆栈
                                                        ;//因为后面马上会用到这几个寄存器
                                                        ;//所以先保存,避免数据丢失
        MRS         R12,CPSR                                                ;//将cpsr的值放入r12
        LDR                 R0,=Current_PCB_P                                ;//得到当前程序控制块的标号
        LDR          R0,[R0]                                             ;//得到当前程序控制块的地址
                                                                              ;//其实你Current_PCB_P
                                                                              ;//就是一个指针,


        STR                R12,[R0],#8                                                ;//之所以会有8个便宜是Current_PCB

                                                                             ;//的结构决定

                                                                             
        LDR              R3,=kaka                                                ;//简单的实现kaka++
        LDR              R2,[R3,#0]
        ADD             R2,R2,#1
        STR             R2,[R3,#0]

        LDMFD         SP!,{R2,R3}
        STMIA         R0!,{R2,R3}                                                ;//这里其实是把r0,r1的值放到pcb中
        LDMFD         SP!,{R2,R3,R12,R14}                       ;//把r2,r3,r12,r14的值从堆栈中推出  

                                                                            ;//这里值得推敲一下,为什么我们
                                                                            ;//进入汇编之后没有看到对sp寄存器
    STR                 R14,[R0,#-12]                                 ;//操作,好了,你可以数一下,
                                                                            ;//我们一共压入6次sp,然后又陆续
                                                                            ;//推出6次,所以sp的值回复到了
                                                                            ;//刚进汇编时候的值
                                                                           
        STMIA         R0,{R2-R14}^                                        ;//把r2~r14的值放到pcb中
                                                                                    
   
        BL                 Switch_Task                                                ;//这个函数的主要作用就是
                                                                              ;//得到下一个要执行的程序
                                                                              ;//的程序号



ATTEMPER_first
        LDR                 R1,=Current_PCB_P_NEXT                       ;//下面做的就是把状态从内存
        LDR                 R1,[R1]                                                        ;//中(也就是pcb中)恢复到cpu寄存器
                                                                             ;//中,其实和上面是正好反过来的   

        LDMIA         R1!,{R12,R14}                                        ;/
        MSR         CPSR_cxsf,R12                                        ;//
                                                                                        ;
        LDMIA         R1,{R0-R14}^                                        ;//
        NOP                                                                                ;//
                                                                                        ;//
        MOV         PC,R14                                                        ;//
                                                                                        ;//将r14的内容放到pc指针中
                                                                                        ;//cpu跳到指定地址去执行,
                                                                                        ;//周而复始。。。。哈哈
                                                                             ;//下一回,我们分解
                                                                             ;//函数Switch_Task,和
                                                                             ;//ProcessesControlBlock(PCB)的数据结构
                                                                             ;//
                                                                             ;//
                                                                                


                                                            

                END

论坛徽章:
0
8 [报告]
发表于 2009-03-12 13:55 |只看该作者
兩個月沒有回複,關注度不是很高,先取消置頂,有興趣可以繼續回貼討論
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP