[ZLG-ARM] 一个ARM菜鸟在LPC2000上实现的MyOS

[复制链接]
5248|22
 楼主| vimman 发表于 2007-7-28 08:47 | 显示全部楼层 |阅读模式
这是本人在ZLG&nbsp;uc/OS-II移植模板基础上写的MyOS&nbsp;For&nbsp;LPC2000,在keil上编译通过,并能仿真运行,实现了最基本的按优先级的任务调度和消息同步,暂时只能对OS_TICK中断进行处理;本人纯粹出于学习ARM7的目的才编造了这份代码,希望大家不吝赐教。代码里面可能还有很多BUG,希望大虾们不要笑话本人啊。其中DEVICE管理借鉴了computer_00的ARM_OS,感谢ZLG和computer_00。声明:这是本人为了学习ARM7的处理器模式和中断所在,不是一个真正的OS。<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20077/200772884648286.rar'>https://bbs.21ic.com/upfiles/img/20077/200772884648286.rar</a>
zlgARM 发表于 2007-7-28 10:44 | 显示全部楼层

vimman

您好:<br />&nbsp;&nbsp;&nbsp;这是很好的学习方法,也是很有锻炼价值(对初学者)的挑战!
 楼主| vimman 发表于 2007-7-28 17:30 | 显示全部楼层

谢谢周工啊

希望您多多指教啊!我是今年五一才开始学ARM7TIMI的!
zlg315 发表于 2007-7-29 11:20 | 显示全部楼层

请注意:zlgARM并不代表我本人,而是整个技术支持团队。

&nbsp;&nbsp;&nbsp;&nbsp;因为我们公司所有的人都可以使用同一个账号登录做技术支持,我通常会使用zlg315,当然有时也会使用zlgARM。<br />&nbsp;&nbsp;&nbsp;&nbsp;谢谢大家的支持!上述这位网友很懂得寻找学习窍门,希望大家集思广益“秀”出自己的学习方法和精力,供后来者参考。
 楼主| vimman 发表于 2007-7-29 16:08 | 显示全部楼层

运行效果图

zlgARM 发表于 2007-7-29 17:50 | 显示全部楼层

vimman

您好:<br />&nbsp;&nbsp;&nbsp;&nbsp;可以百度一下“图片上传”,用专门的网站来贴图,21ic的图片上传有问题。
 楼主| vimman 发表于 2007-7-29 18:13 | 显示全部楼层

仿真运行效果图

zlg315 发表于 2007-7-29 18:32 | 显示全部楼层

以这样的方法和态度学习ARM,必有所成!

&nbsp;&nbsp;&nbsp;&nbsp;追寻细节,正确实践是非常重要的,更重要的是应该将自己写过的程序变成一本总结性开发文档,不应该仅仅满足于写程序,只有整理过的东西,只有经过沉淀的东西,才算是完整的,属于自己的。<br />&nbsp;&nbsp;&nbsp;&nbsp;欢迎给我们投简历,zlg3@zlgmcu.com。
 楼主| vimman 发表于 2007-7-29 18:36 | 显示全部楼层

您说的很对,我正准备总结呢!

  
 楼主| vimman 发表于 2007-7-29 18:50 | 显示全部楼层

谢谢啊

两年前的今天我搞过几个月的ARM,但那时候只是停留在写C语言代码的层次上,没有深入过整个内核;后来一年没有再接触过知道今年五一才再捡起来,至今还是个菜鸟水平!
 楼主| vimman 发表于 2007-8-1 11:09 | 显示全部楼层

core.c

/*********************************************************************************************************/<br />/*&nbsp;Copyright&nbsp;(C)&nbsp;Vimman&nbsp;.&nbsp;All&nbsp;Rights&nbsp;Reserved.&nbsp;*/<br />/*<br />File&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;core.c<br />Desc&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;A&nbsp;simple&nbsp;OS&nbsp;core<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />Author&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Vimman&nbsp;Wang<br />Date&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;05/01/2007<br />Notes&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;<br /><br />$Log&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;07/23/2007&nbsp;引入三个Index变量,用其位来标志任务的状态;缩小代码并提高了效率.<br />&nbsp;<br />*/<br />/*********************************************************************************************************/<br /><br />#include&nbsp;&quot;includes.h&quot;<br /><br />void&nbsp;SWI_Exception(void)<br />{<br />&nbsp;<br />}<br />void&nbsp;OsScheduleUserHook(void)<br />{<br />&nbsp;<br />}<br /><br />void&nbsp;OsAddTaskToIndex(uint32&nbsp;*&nbsp;pIndex,TCB&nbsp;*pTcb)<br />{<br />&nbsp;&nbsp;&nbsp;if(pIndex&nbsp;==&nbsp;&gReadyTaskIndex)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTcb-&gtTaskState&nbsp;=&nbsp;TASK_READY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else&nbsp;if(pIndex&nbsp;==&nbsp;&gWaitTaskIndex)&nbsp;pTcb-&gtTaskState&nbsp;=&nbsp;TASK_WAIT;<br />&nbsp;&nbsp;&nbsp;else&nbsp;if(pIndex&nbsp;==&nbsp;&gSuspendTaskIndex)&nbsp;pTcb-&gtTaskState&nbsp;=&nbsp;TASK_SUSPEND;<br />&nbsp;&nbsp;&nbsp;*pIndex&nbsp;|=&nbsp;((uint32)1&lt&ltpTcb-&gtTaskId);<br />}<br /><br />void&nbsp;OsDelTaskFromIndex(uint32&nbsp;*&nbsp;pIndex,TCB&nbsp;*pTcb)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;*pIndex&nbsp;&=&nbsp;~((uint32)1&lt&ltpTcb-&gtTaskId);<br />}<br /><br />void&nbsp;OsRefreshDelayTasks(void)<br />{<br />&nbsp;&nbsp;TCB&nbsp;*&nbsp;pTcb;<br />&nbsp;&nbsp;uint32&nbsp;i;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for(i&nbsp;=&nbsp;MAX_TASKS-1;&nbsp;i&nbsp;&gt=&nbsp;1;&nbsp;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(gWaitTaskIndex&nbsp;&&nbsp;(1&lt&lti))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTcb&nbsp;=&nbsp;TcbIndex;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pTcb)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pTcb-&gtDelayTime&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OsAddTaskToIndex(&gReadyTaskIndex,pTcb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OsDelTaskFromIndex(&gWaitTaskIndex,pTcb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTcb-&gtDelayTime&nbsp;--&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />TCB&nbsp;*&nbsp;OsGetHighReady(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;&nbsp;&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;TCB&nbsp;*&nbsp;pTcb&nbsp;=&nbsp;TcbIndex[0]&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;MAX_TASKS-1;&nbsp;i&nbsp;&gt=&nbsp;1;&nbsp;i--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(gReadyTaskIndex&nbsp;&&nbsp;(1&lt&lti))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(TcbIndex&nbsp;!=&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTcb&nbsp;=&nbsp;TcbIndex;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pTcb;<br />}<br /><br />void&nbsp;OsTickUpdateTCB(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OsRefreshDelayTasks();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTCBCur&nbsp;=&nbsp;&nbsp;OsGetHighReady();<br />}<br /><br /><br />void&nbsp;OsTaskGetDevice(DEVICE&nbsp;*&nbsp;pDevice,&nbsp;uint16&nbsp;nWaitTime)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TCB&nbsp;*pTcb&nbsp;=&nbsp;OSTCBCur;<br /><br />&nbsp;&nbsp;if(pTcb-&gtpOwnDevice&nbsp;==&nbsp;pDevice)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;while(DEVICE_BUSY&nbsp;==&nbsp;GetDeviceState(pDevice))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(nWaitTime&nbsp;==&nbsp;0)&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTcb-&gtpOwnDevice&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTcb-&gtDelayTime&nbsp;=&nbsp;nWaitTime;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OsDelTaskFromIndex(&gReadyTaskIndex,pTcb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OsAddTaskToIndex(&gWaitTaskIndex,pTcb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OsSchedule();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;if(DEVICE_IDLE&nbsp;==&nbsp;GetDeviceState(pDevice)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDeviceCmd(pDevice,DEVICE_CMD_OPEN,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;OsPending(uint16&nbsp;nPendTime)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TCB&nbsp;*pTcb&nbsp;=&nbsp;OSTCBCur;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;pTcb-&gtDelayTime&nbsp;=&nbsp;nPendTime;<br />&nbsp;&nbsp;&nbsp;&nbsp;OsDelTaskFromIndex(&gReadyTaskIndex,pTcb);<br />&nbsp;&nbsp;&nbsp;&nbsp;OsAddTaskToIndex(&gWaitTaskIndex,pTcb);<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;OsSchedule();&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />void&nbsp;OsTcbSchedule(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTCBCur&nbsp;=&nbsp;OsGetHighReady();<br />}<br /><br />void&nbsp;OsInit(void)<br />{<br />&nbsp;&nbsp;&nbsp;CreateTask(IdleTask,&Tcbs[0],0,(uint32)&StackIdle[31],0,0);<br />&nbsp;&nbsp;&nbsp;OSTCBCur&nbsp;=&nbsp;&Tcbs[0];<br />}<br /><br />
 楼主| vimman 发表于 2007-9-28 16:39 | 显示全部楼层

自己再顶一下

自己再顶一下
quray 发表于 2007-9-28 18:50 | 显示全部楼层

不错

不错
keer_zu 发表于 2007-9-30 10:05 | 显示全部楼层

下不到啊

  
 楼主| vimman 发表于 2007-9-30 11:36 | 显示全部楼层

给我邮件发给你

  
keer_zu 发表于 2007-10-31 11:03 | 显示全部楼层

vimman你的邮箱是?

我的:zkq1905@sina.com.cn
crystal848 发表于 2007-11-1 09:33 | 显示全部楼层

My_OS 询问

我想请问下,在LPC2000写的MyOS程序,如果全部移植到其他的芯片上,如LPC23xx系列的,会不会有问题?有没有什么地方需要修改的?
computer00 发表于 2007-11-1 09:53 | 显示全部楼层

支持一个~~~~~~

  
 楼主| vimman 发表于 2007-11-12 11:58 | 显示全部楼层

17楼,很惭愧!原则上应该不算OS

没问题,只用到了定时中断来产生OS_tick,其他中断你自己处理吧!
yjtks 发表于 2007-11-20 18:29 | 显示全部楼层

回复

学习精神可谓啊!&nbsp;有经过严格测试过吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

81

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部