好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

ucos操作系统在ARM上的移植.docx

19页
  • 卖家[上传人]:206****923
  • 文档编号:91576724
  • 上传时间:2019-06-30
  • 文档格式:DOCX
  • 文档大小:35.60KB
  • / 19 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • UC/OS-II嵌入式系统在ARM上的移植UC/OS-II操作系统是一款完全公开的源代码,它非常精简,整个操作系统的代码只有几千行,是专门针对于嵌入式开发而产生的一款代码它有几个特点,分别是可移植性(Portable)、可固化(ROMable)、可裁剪(Scalable)、多任务、可确定性、任务栈、系统服务、中断管理、稳定性可靠性UC/OS-II主要就是一个内核,由ANSIC语言编写而成负责任务管理和任务调度,没有文件系统和界面系统它的代码是公开的,系统的实时性强、移植性好、可多任务UC/OS-II作为基于优先级的抢占式多任务的实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步和内存管理的功能它使得任务的独立性,不相互干涉,非常的准时和高效,且易于设计和扩展UO/OS-II共有16个内核文件,11个与CPU类型无关,就是说可以直接使用不需要修改还有3个内核文件与CPU有关系,要根据需要作出相应的改动剩下的两个内核文件和具体的应用有关如图所示UC/OS-II的16个内核文件的层次应用程序 与处理器类型无关的内核代码OS——CORE.C OS_FLAG.COS_MBOX.C OS_MEN.COS_MUTEX.C OS_Q.COS_SEM.C OS_TASK.CμC/OS-II.COS_TIME.C μC/OS-II.C 与应用有关的内核配置文件OS_CFG.HINCLUDE.H与处理器类型有关的内核代码OS_CPU.H OS_CPU.ASM OS_CPU_C.CCPU定时器 软件硬件μC/OS-II内核文件多任务操作的核心是系统调度器,利用TCB来管理任务调度功能。

      它的主要功能是保存任务的当前态、优先级、等待事件、代码起始地址、初始堆栈指针等程序的设计关键就是确定划分多任务的问题,以及任务优先级和任务通信优先级的意思是每个任务都是无限循环的,有运行态度、就绪态、休眠态、挂起态和中断五种状态当有高一级优先级的任务就绪后,低优先级立即停止运行,转为挂起态或就绪态这就是可剥夺型的内核当中断一个高优先级任务,中断时挂起,中断结束后任务继续运行,并立即剥夺低优先级的任务对于这种可剥夺型内核,CPU的使用时可以确定的,可优化任务级响应在很多单片机或ARM板上很容易就可以移植UC/OS-II当然本次设计使用的TQ2440,也可以完美的移植它移植程序在网上都可以找得到,所以设计中就不做解释了本次设计实现的是串口协议和网口协议组合成的一个数据网关其主要的流程图如下所示:以太网现场数据网RJ45接口IP分组封帧RS232接口封帧解帧解帧开始系统初始化OSInit()OS_InitMisc()混合变量初始化OS_InitRdyList()就绪表初始化OS_InitTCBList()任务控制块初始化OS_InitEventList()事件控制块初始化根据延时或消息调度运行OS_FlagInit()事件标志初始化OS_MemInit()内存管理OS_SemInit()消息初始化OS_InitTaskIdle()创建空闲任务定时器初始化串行口初始化创建任务TASK_UipRec 以太网接收 优先级:4 TASK_UipTimeOut 定时任务 优先级:3TASK_UipProcess:uip协议处理 优先级: 2 OSStart()启动调度开始运行UART中断DM9000外部中断断 如图所示可以很清楚的看出内核操作系统对于整个系统的控制过程,下面我们要介绍一下UC/OS-II里面的一些程序。

      用户应用程序任务定义代码如下:void MyTask( void *pdata) //开始定义用户任务{ for(;;) {... }}void main(){ TargetInit(); //完成初始化目标开发板 OSInit (); //完成初始化UCOS-II OSTimeSet(0); //完成初始化系统时基 OSTaskCreate (MainTask,(void *)0, &MainTaskStk[MainTaskStkLengh - 1], MainTaskPrio); //开始创建系统初始任务 OSStart (); //整个任务开始 return 0;}void Task0(void *pdata) //主任务建立:taks0 和 task1{ #if OS_CRITICAL_METHOD == 3 /* 分配CPU状态寄存器*/ OS_CPU_SR cpu_sr; #endif OS_ENTER_CRITICAL(); Timer0Init(); //初始化报时信号 ISRInit(); //初始化中断优先级 OS_EXIT_CRITICAL(); OSPrintfInit(); //用户任务给串口 DM9000_init(); OSStatInit(); while(1) { OSPrintf("\nEnter Main Task\n"); //测试Dm9000 //打印DM9000寄存器 OSTimeDly(OS_TICKS_PER_SEC); }}需要注意的是,μC/OS-II的应用程序要使用空闲任务OSTaskldle(),而它是不可删除的系统文件。

      下面开始对应用程序进行移植了本次设计是在ARM开发板上实现串口、网口数据转换的的功能在TQ2440上有串口和网口通信过程简单的描述就是PC串口发送数据给ARM板,ARM接到串口数据后,从网口再传给PC相反也是同样的道理,由网口发送数据,有ARM控制由串口发回数据首先是TCP/IP协议的移植在编写移植程序前,有必要解释一下基本的协议栈作用和意义`就常见的网络通信方式一般来说有两种:1、UART-RS232,此时只需要pc上有串口调试助手即可2、TCP/IP,这时候和普通pc与pc通信一样 可以用socket套接字编程也可用别人写好的软件侦听而现在我们要实现的是串口控制单片机与PC机的通信,在这里用PC来代替以太网接下来还要介绍一下以太网接口以太网技术如今已经相当的成熟了,其相应的网络产品价格低廉、技术完善而数据总线如今越来越难以满足人们日益提升的需要,这时以太网控制网络技术得到了快速的发展,并形成了现场总线的新标准加上国内大部分局域网是以太网,给予以太网实现现场总线有了雄厚的物质基础以太网的接口就是以太网同信的基础,是通信介质通信的中间处理部件,实现报文的发送与接收功能,位于TCP/IP协议栈的数据链路层。

      每一个以太网接口(有时候也叫网卡),在连通后就可以随时的发送和接收网络上的数据,执行EEE802.3标准TCP/IP对应的ISO结构如图所示:应用层数据链路层会话层传输层网络层应用层物理层网络接口层 传输层 网络层表示层 TCP/IP协议栈而单片机与计算机的TCP/IP协议的实现也有很大的不同,原本在计算机里编写的程序可以不考虑代码的大小和效率,但在嵌入式开发板上都要考虑到这些问题在操作系统、内存分配、指针、参数传递、协议支持以及硬件接口的设计方面有些不同首先就是操系统,嵌入式的特点之一就是简洁高效,有很强的专业功能相对而言计算机上的操作系统的侧重点就是兼容性,所以资源要求全面支持,所以很复杂其次就是内存上的分配,计算机像windows系统它的内存分配是动态的,而在单片机上却不能同样如此,应为RAM的容量所限,所以其中存放以太网的数据包是固态的由于ARM相对于单片机的能力而言有了很大的提升,所以可以突破单片机的一些约束如下图所示,TCP/IP协议栈中的内容,从上往下分别对应应用层、传输层、网络层和网络接口层用户进程用户进程用户进程TCPUDPICMPIPARP硬件接口 TCP/IP协议栈在本次设计中采用Lwip协议栈来实现ARM与以太网的连接。

      完成移植后,需要介绍一下以太网的初始化过程和数据收发过程LWIP的初始化要在UC/OS-II之后,在其它任务创建之前因为LWIP要对以太网协议栈初始化以及新线程的建立,LWIP初始化如图所示LwIP_Init()Sys_mbox_new()Low_level _Init()Tcpip_Init()EMACInit()Low_level_output()netif->linkoutputlwip_init()Ethernetif_Init()netif->outputSys_thread_new () 以太网初始化流程(1)(3)(4)(8)(2)(7)(9)(5)(6)(10)(11)etharp_output ()netif->inputtcpip_input ()(12)(13)(14)指向指向指向LWIP程序可以实现很多功能,在本设计中没有实现他的全部功能而简单的PING通需要DM9000来实现以太网的接收是通过中断方式,如果有数据进入以太网中断函数其主要任务就是读取和分析数据包如果数据有效则在Tcpip_input()函数把数据发送出去,并在LWIP初始化创建的线程中就可以得到此消息。

      然后通过ip_input()函数进入传输层后,再把把数据传到应用层具体流程如下图所示:Mbox方式传递数据,tcpip_thread()消息识别分类通过网络接口函数netif->output直接指向netconn_write ()tcp_write ()tcp_enqueuet()tcp_output ()应用层TCPIP_APIMSG ()tcpip_apimsg()do_write ()以太网数据发送流程etharp_output ()etharp_send_ip ()ETH_TxPkt_ChainMode ()low_level_output ()ip_output ()ip_output_if ()通过网络接口函数netif->linkoutput直接指向ETH_IRQHandlert()Ethernetif_input()以太网数据接收流程Tcpip_input()Low_level_input()ethernet_input()EMACReadPacket ()Get。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.