打印
[ZLG-ARM]

一个ARM菜鸟在LPC2000上实现的MyOS

[复制链接]
4143|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vimman|  楼主 | 2007-7-28 08:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是本人在ZLG uc/OS-II移植模板基础上写的MyOS For LPC2000,在keil上编译通过,并能仿真运行,实现了最基本的按优先级的任务调度和消息同步,暂时只能对OS_TICK中断进行处理;本人纯粹出于学习ARM7的目的才编造了这份代码,希望大家不吝赐教。代码里面可能还有很多BUG,希望大虾们不要笑话本人啊。其中DEVICE管理借鉴了computer_00的ARM_OS,感谢ZLG和computer_00。声明:这是本人为了学习ARM7的处理器模式和中断所在,不是一个真正的OS。
相关链接:https://bbs.21ic.com/upfiles/img/20077/200772884648286.rar

相关帖子

沙发
zlgARM| | 2007-7-28 10:44 | 只看该作者

vimman

您好:
   这是很好的学习方法,也是很有锻炼价值(对初学者)的挑战!

使用特权

评论回复
板凳
vimman|  楼主 | 2007-7-28 17:30 | 只看该作者

谢谢周工啊

希望您多多指教啊!我是今年五一才开始学ARM7TIMI的!

使用特权

评论回复
地板
zlg315| | 2007-7-29 11:20 | 只看该作者

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

    因为我们公司所有的人都可以使用同一个账号登录做技术支持,我通常会使用zlg315,当然有时也会使用zlgARM。
    谢谢大家的支持!上述这位网友很懂得寻找学习窍门,希望大家集思广益“秀”出自己的学习方法和精力,供后来者参考。

使用特权

评论回复
5
vimman|  楼主 | 2007-7-29 16:08 | 只看该作者

运行效果图

使用特权

评论回复
6
zlgARM| | 2007-7-29 17:50 | 只看该作者

vimman

您好:
    可以百度一下“图片上传”,用专门的网站来贴图,21ic的图片上传有问题。

使用特权

评论回复
7
vimman|  楼主 | 2007-7-29 18:13 | 只看该作者

仿真运行效果图

使用特权

评论回复
8
zlg315| | 2007-7-29 18:32 | 只看该作者

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

    追寻细节,正确实践是非常重要的,更重要的是应该将自己写过的程序变成一本总结性开发文档,不应该仅仅满足于写程序,只有整理过的东西,只有经过沉淀的东西,才算是完整的,属于自己的。
    欢迎给我们投简历,zlg3@zlgmcu.com。

使用特权

评论回复
9
vimman|  楼主 | 2007-7-29 18:36 | 只看该作者

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

使用特权

评论回复
10
vimman|  楼主 | 2007-7-29 18:50 | 只看该作者

谢谢啊

两年前的今天我搞过几个月的ARM,但那时候只是停留在写C语言代码的层次上,没有深入过整个内核;后来一年没有再接触过知道今年五一才再捡起来,至今还是个菜鸟水平!

使用特权

评论回复
11
vimman|  楼主 | 2007-8-1 11:09 | 只看该作者

core.c

/*********************************************************************************************************/
/* Copyright (C) Vimman . All Rights Reserved. */
/*
File    : core.c
Desc    : A simple OS core
          

Author    : Vimman Wang
Date    : 05/01/2007
Notes    : 

$Log    : 07/23/2007 引入三个Index变量,用其位来标志任务的状态;缩小代码并提高了效率.
 
*/
/*********************************************************************************************************/

#include "includes.h"

void SWI_Exception(void)
{
 
}
void OsScheduleUserHook(void)
{
 
}

void OsAddTaskToIndex(uint32 * pIndex,TCB *pTcb)
{
   if(pIndex == &gReadyTaskIndex)
       {
          pTcb->TaskState = TASK_READY;
       }
   else if(pIndex == &gWaitTaskIndex) pTcb->TaskState = TASK_WAIT;
   else if(pIndex == &gSuspendTaskIndex) pTcb->TaskState = TASK_SUSPEND;
   *pIndex |= ((uint32)1<<pTcb->TaskId);
}

void OsDelTaskFromIndex(uint32 * pIndex,TCB *pTcb)
{
    *pIndex &= ~((uint32)1<<pTcb->TaskId);
}

void OsRefreshDelayTasks(void)
{
  TCB * pTcb;
  uint32 i;
  
  for(i = MAX_TASKS-1; i >= 1; i--)
      {
      if(gWaitTaskIndex & (1<<i))
          {
            pTcb = TcbIndex;
          if(pTcb)
              {
              if(pTcb->DelayTime == 0)
                  {
                  OsAddTaskToIndex(&gReadyTaskIndex,pTcb);
                  OsDelTaskFromIndex(&gWaitTaskIndex,pTcb);
                  }
              else
                    pTcb->DelayTime -- ;
              }
          }
      }
}

TCB * OsGetHighReady(void)
{
    uint32    i;
    TCB * pTcb = TcbIndex[0] ;
    for(i = MAX_TASKS-1; i >= 1; i--)
      {
      if(gReadyTaskIndex & (1<<i))
          if(TcbIndex != NULL)
              {
                pTcb = TcbIndex;
              break;
              }
        }
    return pTcb;
}

void OsTickUpdateTCB(void)
{
    OsRefreshDelayTasks();
    OSTCBCur =  OsGetHighReady();
}


void OsTaskGetDevice(DEVICE * pDevice, uint16 nWaitTime)
{
    TCB *pTcb = OSTCBCur;

  if(pTcb->pOwnDevice == pDevice) 
     {
         return;
     }
  while(DEVICE_BUSY == GetDeviceState(pDevice))
      {
      if(nWaitTime == 0) break;
      OS_ENTER_CRITICAL();
        pTcb->pOwnDevice = 0;
      pTcb->DelayTime = nWaitTime;
      OsDelTaskFromIndex(&gReadyTaskIndex,pTcb);
      OsAddTaskToIndex(&gWaitTaskIndex,pTcb);
      OS_EXIT_CRITICAL();
      OsSchedule();
      }
 if(DEVICE_IDLE == GetDeviceState(pDevice) )
     {
     SendDeviceCmd(pDevice,DEVICE_CMD_OPEN,0);
     }
}

void OsPending(uint16 nPendTime)
{
    TCB *pTcb = OSTCBCur;
    OS_ENTER_CRITICAL();
    pTcb->DelayTime = nPendTime;
    OsDelTaskFromIndex(&gReadyTaskIndex,pTcb);
    OsAddTaskToIndex(&gWaitTaskIndex,pTcb);
    OS_EXIT_CRITICAL();
    OsSchedule();    
}
void OsTcbSchedule(void)
{
    OSTCBCur = OsGetHighReady();
}

void OsInit(void)
{
   CreateTask(IdleTask,&Tcbs[0],0,(uint32)&StackIdle[31],0,0);
   OSTCBCur = &Tcbs[0];
}

使用特权

评论回复
12
vimman|  楼主 | 2007-9-28 16:39 | 只看该作者

自己再顶一下

自己再顶一下

使用特权

评论回复
13
quray| | 2007-9-28 18:50 | 只看该作者

不错

不错

使用特权

评论回复
14
keer_zu| | 2007-9-30 10:05 | 只看该作者

下不到啊

使用特权

评论回复
15
vimman|  楼主 | 2007-9-30 11:36 | 只看该作者

给我邮件发给你

使用特权

评论回复
16
keer_zu| | 2007-10-31 11:03 | 只看该作者

vimman你的邮箱是?

我的:zkq1905@sina.com.cn

使用特权

评论回复
17
crystal848| | 2007-11-1 09:33 | 只看该作者

My_OS 询问

我想请问下,在LPC2000写的MyOS程序,如果全部移植到其他的芯片上,如LPC23xx系列的,会不会有问题?有没有什么地方需要修改的?

使用特权

评论回复
18
computer00| | 2007-11-1 09:53 | 只看该作者

支持一个~~~~~~

使用特权

评论回复
19
vimman|  楼主 | 2007-11-12 11:58 | 只看该作者

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

没问题,只用到了定时中断来产生OS_tick,其他中断你自己处理吧!

使用特权

评论回复
20
yjtks| | 2007-11-20 18:29 | 只看该作者

回复

学习精神可谓啊! 有经过严格测试过吗?

使用特权

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

本版积分规则

12

主题

81

帖子

0

粉丝