搜档网
当前位置:搜档网 › 基于VxWorks的模块自动加载机制

基于VxWorks的模块自动加载机制

基于VxWorks的模块自动加载机制
基于VxWorks的模块自动加载机制

—264

基于VxWorks 的模块自动加载机制

于 康,宁 洪,邓胜兰,张 毅

(国防科学技术大学计算机学院,长沙 410073)

摘 要:选择具有广泛应用的VxWorks 嵌入式实时操作系统,基于其模块动态加载机制,从中获取并管理模块的加载信息和依赖关系,支持用户进行设置和查询,扩展实现模块动态加载管理系统,以保证动态加载能够在系统实际运行时正常工作。在此基础上,允许用户设置模块自动加载状态,通过该系统进行管理和保存,实现系统重启后自动加载预设模块。 关键词:重启自动加载;动态加载;模块管理系统;VxWorks 操作系统

Module Automatically Loading Mechanism Based on VxWorks

YU Kang, NING Hong, DENG Sheng-lan, ZHANG Yi

(School of Computer, National University of Defense Technology, Changsha 410073, China)

【Abstract 】This paper expands the mechanism of dynamic module loading of VxWorks, a widely used real-time embedded operating system, to achieve a dynamic loading management system, which gets the loading information and the modules’ dependencies and supports users to query and set, so that the dynamic loading can work well during the real run time. On this basis, it allows the users to set the modules’ automatically loading state, saves and controlls by the management system, to support the automatical loading after reboot eventually.

【Key words 】automatical loading after reboot; dynamic loading; module management system; VxWorks operating system

计 算 机 工 程 Computer Engineering 第36卷 第18期

Vol.36 No.18 2010年9月

September 2010

·开发研究与设计技术· 文章编号:1000—3428(2010)18—0264—03

文献标识码:A

中图分类号:N945

1 概述

在常见的PC 操作系统,例如Windows 中,系统启动后会自动加载预设的启动项,并支持用户配置系统初始化完成之后即运行的软件,一般包括防火墙、杀毒软件、驱动程序和其他一些用户添加的软件。

对于嵌入式系统,有时候也需要有与PC 操作系统类似的启动项设置。在航空航天、数据网络、指挥与控制这些智能化要求较高的领域,嵌入式系统面临的任务环境变得越来越复杂,用户的需求也越来越多变,因而更加需要系统具有运行中可配置的特性,例如卫星在执行任务时需要根据当前任务环境或者地面指挥中心发出的指令调整姿态、更改任务目标、修正计算参数等[1]。在这种情况下,嵌入式系统重启后的恢复将变得更加困难。因此,本文选择在这些领域内应用广泛、具备较高可靠性的VxWorks 嵌入式操作系统,重点讨论如何改造其原有的动态加载机制,实现对加载模块的管理,最终支持系统重启后的模块自动加载。

2 VxWorks 嵌入式操作系统的动态加载机制

在VxWorks 中,为了方便用户开发调试程序,加入了模块动态加载的功能。用户可以将自己写好的模块直接加载到正在运行的系统中,并且通过主机进行交叉调试。在开发调试过程中,当目标板上的应用测试错误时,只需从主机重新加载修改后的应用,继续进行调试而不是重新编译系统映像进行烧录后调试,从而大大加速了嵌入式应用的开发[2]。

VxWorks 的动态加载机制主要针对应用的调试开发,若将它应用到实际的嵌入式系统运行过程中还存在许多问题。例如,需要对下述VxWorks 原有的加载策略进行修改:

(1)允许加载已加载模块的同名模块。VxWorks 原有策略为加载时将先前加载的模块置为不可用,方便调试时重复加载新的应用模块,并且支持加载模块的回滚。但若在系统运

行时,必须考虑重名加载时对原始模块内存空间的处理问题。如果回收原始模块的空间,则新模块出错时无法实现加载回退,重名加载仅相当于卸载掉原模块后的加载操作;而如果不对原始模块的空间进行回收,当重名模块数较多或模块较大时,内存空间将被大量占用。

(2)模块加载时有无法重定位的未定义符号,给出警告但并不终止加载,允许开发人员对应用进行不完整调试。然而,在系统运行过程中,未完成重定位的函数被调用时会引发内存溢出错误,对嵌入式系统的运行会造成不可预知的影响。

(3)模块卸载时卸载相关信息结构,取消内存空间保护,但不处理调用它的其他函数。在模块卸载后,其他函数内可能仍有指向该模块的悬挂指针,当该函数被调用时将调用不可预知的代码,影响系统的稳定性。

因此,为使VxWorks 能够更好地适应运行中的动态配置,需要对它的动态加载机制进行改造,设计动态加载管理系统管理并保存相应模块信息,并且允许外部用户对其进行查询和设置,使得系统重启后能够从中得到快速恢复。

3 动态加载管理系统的设计

本节重点讨论的动态加载管理系统,是在VxWorks 原有的动态加载机制基础上,通过对运行过程中加载的模块进行管理,并向用户提供查询和设置的shell 命令,最终支持系统重新启动时模块的自动加载。

3.1 动态加载管理系统概述

如图1所示,整个动态加载管理系统主要由用户层、管

作者简介:于 康(1987-),男,硕士研究生,主研方向:嵌入式操作系统;宁 洪,教授;邓胜兰,研究员;张 毅,硕士研究生 收稿日期:2010-03-02 E-mail :ykff8725@https://www.sodocs.net/doc/8c4290093.html,

—265—

理层和系统层三部分组成。用户层设计了面向用户的界面,提供给用户包括查询和设置接口函数在内的管理命令,系统层则负责将模块信息从系统底层剥离出来提供给管理层,管理层对从系统层得到的信息进行处理,并且响应用户层的请求,返回用户所需信息和完成相关设置。

图1 动态加载管理系统框图

3.2 系统层

系统层负责从VxWorks 本身的模块管理中提取出所需的信息,它们包括:

(1)模块在系统中的信息。模块加载时,VxWorks 为模块创建相应的数据结构,并将模块的相关信息存储在其中。系统层将指向该模块的指针MODULE_ID 提供给管理层,使得管理层可以共享VxWorks 本身的模块管理信息。

(2)模块之间的依赖关系。在VxWorks 本身的动态加载机制中,系统维护一个数组kernelModuleListId 保存模块集合,数组项为模块指针。在系统符号表sysSymTbl 中[3],每一个符号的数据结构有一项成员变量group 对应定义该符号的模块在模块集合中的下标。确定模块间依赖关系的具体方法为:在动态加载模块的过程中,系统会对模块中的未定义符号进行重定位,在系统符号表中找到该符号,由此可以根据该符号数据结构中的group 定位到该符号所属模块,从而得到当前模块所依赖模块的结构指针。例如,如图2所示,在系统对模块B 中的符号a 进行重定位时,发现符号a 在模块A 中定义,因而得到模块B 依赖模块A 。

图2 模块之间的依赖关系

3.3 管理层

如图3所示,作为整个动态加载模块管理系统运行的核心,管理层根据从系统层获取的信息,响应用户层的操作,返回用户查询信息和执行实际的模块加载和卸载工作,并且维护模块的自动加载信息。

管理层的主要功能如下:

(1)在模块加载(卸载)时,根据系统层提供的内容进行模块部分信息及其依赖关系的管理。在管理系统中,模块的相关信息主要存储在2类表中:

1)模块信息表。模块信息表借鉴VxWorks 对模块的管理方式,通过数组存储信息成员结构。该结构中包含模块名、加载参数等相关信息,并且通过自动加载标志位标记该模块是否添加到自动加载列表,通过自动加载链接位指向自动加载链表中的下一项。

2)模块依赖关系表。模块的依赖表和被依赖表。模块加载和设置时需要根据模块的依赖信息来判断合法性,模块卸载和取消模块自动加载时需要根据模块的被依赖信息来判断合法性。这2张表均通过数组保存,每个数组成员后接依赖

关系链表,链表中保存相应依赖模块在模块信息表中的下标。

图3 管理层功能示意图

管理层改变了VxWorks 原有的加载策略,即在模块加载前对它进行检查,禁止重名模块进行加载;在模块加载的过程中,若发现有无法重定位的符号,则退出加载,给出加载失败提示;在模块被卸载时,检查模块依赖关系表,若发现该模块被依赖,则退出卸载,给出卸载失败提示。

(2)返回用户查询信息,包括自动加载链表、已加载模块和模块间依赖关系。

(3)实现自动加载模块信息的管理:包括创建模块时的初始化、用户设置时文件的存取和数据的修改。当用户设置模块自动加载标志位时,进行逻辑和模块依赖关系检查,若正确则修改相应模块的自动加载标志位和自动加载链表存储文件,在文件末尾添加或删除相应项。文件中每一项的内容为文件路径名和加载参数,采用定长存储的方式以便于文件操作的定位。

3.4 用户层的功能

用户层设计了面向用户的界面,提供给用户包括信息查询(模块信息、模块依赖信息、自动加载信息)、模块操作(加载和卸载)、模块设置(自动加载属性设置)以及用户帮助在内的管理命令,如表1所示,它们均设计为VxWorks 的shell 命令[4]。

表1 用户命令

命令

功能

说明

mld 加载模块文件 默认将全局符号加入系统符号表

调用系统层函数添加模块信息和

依赖关系

munld 卸载模块文件

调用系统层函数清除模块信息和

依赖关系

mdshow 显示相关模块的依赖关系

包括依赖关系和被依赖关系,

列出相关模块

mshowall 显示系统当前所有加载模块 无 autoset 设置自动加载标志位 支持将标志位置1或置0 autoshow 显示自动加载链表 按照加载顺序显示,满足依赖关系help 提供shell 命令帮助 显示以上各命令的格式和说明

—266

— 4 系统重启自动加载模块的实现

基于以上设计的动态加载管理系统,可以支持系统重启时对用户预定义模块的自动加载。如图4所示,系统开机时,首先从文件中读取加载模块项,依次添加到自动加载链表中;文件中的每一项都保持正确的依赖关系,因而只需要分析读取加载参数,调用加载命令进行加载,相应模块仍设置为重启自动加载模块。加载完毕后进入模块管理系统,允许用户进行查询、管理和设置。

图4 自动加载流程

系统基于VxWorks6.6版本实现,通过开发平台Workbench 自带的虚拟机simpc 进行模拟验证[5],支持重启自

动加载的策略如下: (1)若启动时系统未找到指定自动加载文件(如系统首次启动)

,则向用户返回提示信息,并将自动创建文件。

(2)若启动时,系统成功读取文件信息,则自动加载成功。如图5所示,按模块自动加载次序向用户显示执行自动加载的模块名。 (3)启动后,在动态加载系统管理系统中,对模块的加载和设置遵循依赖关系,由用户设置自动加载链,每次设置完后自动更新自动加载文件。如图5所示,通过autoshow 命令显示当前自动加载链,通过mshowall 命令显示所有模块(星号显示为自动加载模块)。

图5 自动加载的重启与用户管理

5 结束语

本文通过增强VxWorks 操作系统的动态加载机制,为用户提供对加载模块的查询和管理功能,并且成功实现了对用户定义模块的重启自动加载,可用于支持嵌入式系统的故障后自动恢复。应用本文实现的动态加载管理系统,可以方便用户对模块进行透明的管理,保证模块加载的合理性。不仅如此,在管理系统中增添模块的版本信息,可以支持模块的升级和回退;进一步将模块和使用它的任务联系起来,还可以实现包括动态的任务注入、删除、定时发起等在内的任务定制管理系统,使得嵌入式系统的运行变得更加灵活。

参考文献

[1] 刘 勇, 李华旺, 尹增山, 等. 动态可重配置的星上嵌入式实时

计算系统[J]. 计算机应用研究, 2006, 23(1): 204-205.

[2] 杨 伟, 罗 蕾. 嵌入式系统中的模块动态加载技术[J]. 单片机与嵌入式系统应用, 2005, 5(11): 8-10.

[3] 宁 涛, 王 铮, 龙 川. 面向一般应用的动态加载机制[J]. 计算机工程, 2008, 34(17): 79-81. [4] WindRiver Systems Inc.. VxWorks Application Programmers Guide

6.6[Z]. 200

7. [5] WindRiver Systems Inc.. WindRiver VxWorks Simulator User’s Guide 6.6[Z]. 2007. 编辑 任吉慧~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(上接第263页) 5 结束语

互联网的社区化是人类社会在互联网上的一种真实反映。本文以网络流量识别为基础,从互联网应用的角度出发,通过对不同应用社区的分析,设计和实现了一种新的社交网络发现算法,并基于真实流量进行了实验分析,证实了基于流量的社交网络也具有无标度网络的特性。本文只是通过可视化的方式来展示这种社区化的情形,这种方式对于中小型网络还可胜任,但对于大规模网络将很难展示。因此,新的社交网络表现形式和量化的度量指标体系将是下一步的研究内容。

参考文献

[1] Watts D J, Strogatz S H. Collective Dynamics of Small-world

Networks[J]. Nature, 1998, 393(6684): 409-410.

[2] Zhao Yang, Hou Xiaoxiao, Yang Mao, et al. Measurement Study and

Application of Social Network in the Maze P2P File-sharing

System[C]//Proceedings of the 1st Int’l Conf. on Scalable Information Systems. New York, USA: ACM Press, 2006.

[3] Karagiannis T, Papagiannaki K, Faloutsos M. BLINC: Multilevel

Traffic Classification in the Dark[C]//Proceedings of ACM SIGCOMM’05. New York, USA: ACM Press, 2005: 229-240. [4] 鲁文斌, 杨家海, 刘洪波. 基于节点连接模式的P2P 节点识别算

法[J]. 清华大学学报: 自然科学版, 2009, 49(7): 1045-1049. [5] Agostini A, Moro G . Identification of Communities of Peers by

Trust and Reputation[C]//Proceedings of ICAI’04. [S. 1]: Springer- Verlag, 2004: 95-100.

[6] Gao Wei, Wong K, Xia Yunqing, et al. Clique Percolation Method

for Finding Naturally Cohesive and Overlapping Document Clusters[C]//Proceedings of Int’l Conf. on Computer Processing of Oriental Languages. Singapore: Springer-Verlag, 2006: 97-108.

编辑 索书志

VxWorks常用命令汇总

VxWorks常用的命令 1.与任务相关的命令 sp function,[arg1],...,[arg9] -启动任务,最多接受9个参数,默认的优先级100、堆栈20000字节 period n,function,[arg1],...,[arg8] -创建一个周期调用function的任务,周期为n秒,最多接受8个参数 repeat m,function,[arg1],...,[arg8] -创建一个反复调用function的任务,调用次数为m,m=0时永久调用,最多也是8个参数 ts tidX -挂起任务 tr tidX -恢复挂起的任务 td tidX -删除任务 i tidX -显示任务基本信息,参数为0时显示全部任务 ti tidX -显示任务详细信息,包括寄存器、堆栈等 tt tidX -显示任务的函数调用关系 checkStack tidX -显示任务堆栈使用的历史统计,参数为0时显示全部任务 [其中tidX可以为任务ID 也可以为任务名] 2、系统信息 lkup ["string"] -在系统符号表中查找并列出含有"string"字符的函数及全局变量,有两个特殊参数: 0,给出符号表统计;""(空字符串),列出全部符号 lkAddr addr -显示addr地址附近的符号表 l addr,[n] -显示addr地址开始的n条指令的反汇编,n省略时默认为10条指令 h [n] -n为0时列出最近执行的shell命令,默认20条;n非0时,设定shell记录的历史命令的数目 d [addr,[number],[width]] -显示addr地址开始的number个单元的内容,width定制每个单元的宽度,可以是1、2、4、8 m addr,[width] -按width宽度修改addr地址的内容,width可以是1、2、4、8 memShow 1 -显示系统分区上空闲和已分配空间的总数等 printErrno value -打印系统定义的错误码的宏 3、与网络相关的命令 ifShow ["ifname"] - show info about network interfaces inetstatShow - show all Internet protocol sockets tcpstatShow - show statistics for TCP udpstatShow - show statistics for UDP ipstatShow - show statistics for IP icmpstatShow - show statistics for ICMP arpShow - show a list of known ARP entries

单片机_C语言函数_中断函数(中断服务程序)

单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。 (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。 80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。 80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制 (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1 (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP 具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。 在这里我们讲下注意的事项 (1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。 (2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。 (3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。 (4)单片机复位后,TCON,SCON给位清零。 C51语言允许用户自己写中断服务子程序(中断函数) 首先来了解程序的格式: void 函数名() interrupt m [using n] {} 关键字 interrupt m [using n] 表示这是一个中断函数 m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。 n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3 中断号中断源 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1中断 4 串行口中断 (在上一篇文章中讲到的ROM前43个存储单元就是他们,这5个中断源的中断入口地址为: 这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不

vxWorks开发环境构建步骤及开发资源

vxWorks开发环境构建步骤及开发资源 技创科技(Technique Innovator Inc.) https://www.sodocs.net/doc/8c4290093.html, 一、Tornado集成开发环境构成 Tornado是集成开发环境的名称,主要由帮助及参考文档、操作系统vxWorks、开发工具(编译器、调试器、编辑器、target server等,据统计,挂接在Tornado下的可选工具和第三方有数百个)等三部分构成,分别对应三个目录: i.docs/ 所有文档都集中在该目录中, books.html是根索引,入门级开发请务必查看 以下文档: ●如果要熟悉使用界面及Tornado使用、创建工程,请参考:Tornado用户手册 及Tornado集成开发环境的HELP->content调出来的联机帮助文档; ●vxWorks的编译是使用标准GNU Makefile来编译连接的,要了解Makefile语 法请参考”GNU Make”;具体的Make rules存放在target/h/make/目录下。 ●如何调试?请参考“Debugging with GDB” ●vxWorks构成、特点及kernel,编程等:请参考:VxWorks Programmer's Guide, 系统调用、库函数接口标准等,请参考:VxWorks Reference Manual ●有关BSP(board support package)的构成、初始化、底层驱动等,请参考“BSP Reference” ●网络应用编程指南(socket编程): “VxWorks Network Programmer's Guide” ii.host/ 该部分存放主机端(开发机)的工具,如Tornado.exe,make.exe,编译器、调试器及TCL命令解释器等等,开发中要用到的工具都存放在目录 host\x86-win32\bin 下,部分命令是.exe文件,部分是.bat的,其中有torvars.bat文 件,是设置Tornado集成开发环境的环境变量用的,在使用其他工具前,要运行它 设置正确的环境变量及可执行文件搜索路径。 iii.target/ vxWorks操作系统、源码、BSP、设备驱动、头文件、配置文件等config/ BSP的存放地方,底层开发者绝大部分时间在该目录下度过,该目录下除了all/和comps/外,其他每个目录对应一种硬件板的BSP,开发者在 做BSP开发时,原则上除了对应BSP目录能修改外,target/目录下的其他 所有目录都不应该作出改动,否则会影响到其他BSP,常用BSP有: pid7t/ →ARM公司推出的pid7 ARM7TDMI评估板的BSP integratorX/ →ARM公司推出的integratorXXX评估板的BSP tk4510a/ →我们要使用的S3C4510B板的BSP SNDS100/ →三星公司推出的SNDS100(KS3C50100/S3C4510B)板的 BSP h/ 头文件存放地点,包括vxWorks的及所有其他组件的 arch/arm/ ARM体系结构相关头文件 make/ 编译连接时要用到的规则都存放在这里 vxWorks.h wind Kernel(vxWorks的核心”Wind Kernel”的API及常量说明) lib/ vxWorks是一个商用操作系统,其不开放源码部分的.o文件及.a(库文件)文件存放在这里(当然,除了config/目录外,所有其他目录下的*.c源码在编

中断服务程序流程图

第一讲: 第六章I/O接口原理-接口、端口、编址 回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。 重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。 讲授内容: 6. 1 输入/输出数据的传输控制方式 一、输入/输出的一般概念 1.引言 输入/输出是微机系统与外部设备进行信息交换的过程。输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。因此,CPU与外部设备之间的信息交换技术比较复杂。 CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。 2.输入/输出端口的寻址方式 微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。

根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式 这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。 方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。优点: ①CPU对I/O端口的读/写操作可以使用全部存储器的读/写操作指令,也可 以用对存储器的不同寻址方式来对I/O端口中的信息,直接进行算术、逻辑运算及循环、移位等操作。 ②内存与外设地址的分配,可以用统一的分布图。 ③不需要专门的输入、输出操作指令。 缺点: ①内存与I/O端口统一编址时,在地址总线根数一定的情况下,使系统中 实际可以直 接寻址的内存单元数减少。 ②一般情况下,系统中I/O端口数远小于内存单元数,所以在用直接寻址方 式来寻址这些端口时,要表示一个端口地址,必须用与表示内存单元地址相同的字节数,使得指令代码较长,相应地读/写执行时间也较长,这对提高系统的运行速度是不利的。 Mortorola公司的M6800CPU等均采用这种寻址I/O端口的方式。 3. CPU与外设之间所传送的信息类型 CPU与I/O端口之间所交换的信息,可以有下列几种类型: ①数据信息:包括数字量、模拟量、开关量等,可以输入、也可以输出 ②状态信息:这是I/O端口送给CPU的有关本端口所对应的外设当前状态 的信息。供CPU进行分析、判断、决策。 ③控制信息:这是CPU送给I/O端口的控制命令,使相应的外部设备完成 特定的操作。 数据信息、状态信息和控制信息是不同类型的信息,它们所起的作用也不一样。但在8086/8088微机系统中,这三种不同类型的信息的输入、输出过程是相同的。为了加以区分,可以使它们具有不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入/输出的数据中设置特征位。

VxWorks下几种定时延时方法的小结

编程过程中,出于需要,大家或多或少要用到定时/延时。VxWorks下提供了几种定时/延时机制,根据收集的一些资料和VxWorks相关文档,在学习和上机实验的基础上,对它们的使用以及我所遇到的问题做一个总结,希望对大家能有所帮助。不正确之处,恳请斧正。 1 taskDelay taskdelay()提供了一个简单的任务睡眠机制,也常用于需要定时/延时机制的应用中。它的格式是STATUS taskDelay(int ticks /* number of ticks to delay task */),可以看出使用该函数实现延时的单位为tick(一般系统中一个tick都是ms级的)。在VxWorks下可以这样使用taskDelay()函数:taskDelay(sysClkRateGet()*1)。函数sysClkRateGet()返回系统的时钟速率,单位是tick数/每秒(利用函数sysClkRateSet()可以改变系统的时钟速率)。在POSIX中有一个与taskdelay()相对应的函数――nanosleep()(下文中有介绍)。这两个函数仅仅是延时单位不同,效果是相同的。 利用taskdelay(),可以将调用的任务移动到具有相同优先级的就绪队列尾部。特别的,可以通过调用taskdelay(0),将cpu交给系统中其他相同优先级的任务。延时为0的调用只能用于taskdelay()中,nanosleep()认为这种调用是错误的。 taskdelay()会导致调用的任务在指定的延时期间(以ticks计数)放弃cpu,使任务处于DELAY状态(因此,其不能用于中断服务程序中)。通常其受到任务调度的影响,但在等待一些与中断无关联的外部条件时,其是有用的。如果调用的任务受到一个信号,指出其没有被阻塞或被忽略,taskDelay()将返回ERROR,并在信号处理程序运行后设置errno为EINTR。 2 WatchDog VxWorks提供了一个看门狗定时器(watchdog timer)机制,利用提供的函数,任何任务都可以创建一个看门狗定时器,经过指定的延时后,实现在系统时钟ISR的上下文中运行指定的程序。在VxWorks中,看门狗定时器作为系统时钟中断服务程序的一部分来维护。因此,与看门狗定时器相联系的函数运行在系统

EPON常用命令讲解

EPON常用命令讲解 ?数据业务基本排查 ?语音业务基本排查 ?930软件脚本简介 ?其他常用命令 ?典型案例分析 数据业务基本排查 基本思路: 在PON系统内GSWC、EC2、ONU各业务环节上应保证: 配置正确 配置生效 MAC地址正确转发 ?FTTH型ONU ?FTTB型ONU 配置核查 Onu switch目录: show vlan all显示所有端口vlan; show vlan 查看交换芯片单个vlan及其所属端口的信息,如果此端口配置为出口剥离vlan,相应端口显示为UN;反之显示为VF show vlan default 显示所有端口的untag属性的vlanid; Onu Debug下相关命令: ddd show port [|all] vlan config显示系统QinQ不使能下的Fe端口vlan的配置信息show port [|all] vlan service显示系统QinQ使能下的Fe端口vlan的配置信息show port [|all] vlan translation table显示端口的软件vlan转换表 EC2 Pon目录: show qinq_config <1-2> <1-24> 查询qinq模式下ONU端口业务信息 端口检查 show port status查看交换芯片端口的状态,可以查看用户端口是否接了终端,工作模式是否正确等 查看地址转发表

ONU swtich目录 show arl查看mac地址转发表,会显示学习到的端口、vlanid和mac地址,如果用户的vlan id同时上下行数据中学到,其中26端口( CPU端口)表示下行数据正常,用户端口1-24表示上行数据正常; OLT fdb目录 show fdb slot <1-8,11-18>查看上行数据时,查看业务卡(EC2)fdb表 show fdb slot 29查看下行数据时,查看上联口fdb表 主控盘学的地址的VID应该是最外层VLAN的VID。 如果,上下行fdb表都正确,但是拨号拨不上去,可以在OL T的上连口抓包,查看进出的包内容。如果有出去的包而无回来的包,则可以判断出是上游设备出问题。 如果fdb表学习不正确,则VLAN配置有问题,可以根据fdb表的情况,先判断问题出现在哪一个设备上,再查看VLAN配置有无问题。 其他处理方式: 如时延大、丢包、组播业务等问题,可分别在EPON系统与其他系统的接口处利用抓包工具查看定位,由于上联口只能封装单层vlan,Qinq和单层vlan方式会略有差别。 FTTN型ONU 与其他ONU差异 FTTN型ONU相对其他类型ONU比较独立,对于普通的数据、语音业务,OLT相当于“透传”的通道。 配置核查: FSWB Profile目录下 创建/修改/查看ADSL2+端口模板参数: add xaplus profile ; set dsl-profile ; show dsl-profile ; 主要查看4个方面: 1.编码类型(lineCoding) 一般编码类型在开通的下行速率低于8Mb/s时采用G .dmt,大于8M时采用adsl2plusauto。 2.线路类型(channelMode) 线路类型采用interleaved更为稳定 3.训练速率(dnFastMaxTxRate,dnIntlMaxTxRate,upFastMaxTxRate,upIntlMaxTxRate) ADSL 一般最大上行可达速率为800Kb/s,下行可达速率为8Mb/s ADSL2+一般最大上行可达速率为1Mb/s,下行可达速率为28Mb/s 配置时上行速率不要超过1Mb/s,推荐640Kb/s

VxWorks网络驱动配置及分析

VxWorks网络驱动配置及分析 VxWorks支持两种形式的网络驱动,一种是BSD驱动支持通用的 BSD4.4网络,API,结构等和大多数BSD网络的驱动类似.另一种是END 网络驱动,是VxWorks独有的,根据VxWorks MUX接口编程,不过END驱动在底层也要转换成BSD的形式. VxWorks网络驱动可参见VxWorks网络驱动 1.BSD4.4网络驱动设置. 网络设备驱动的调用主要在/target/src/config/usrNetwork.c文件中,下面说明BSD4.4驱动在VxWorks系统调用. 主要调用过程如下: VxWorks系统执行的第一个任务target\config\all\usrConfig.c文件中 usrRoot()=======>>target\src\config\usrNetwork.c文件中的usrNetInit ( )通过数组表netIf[]初始化相应的BSD网卡驱动. 在usrNetwork.c中的调用过程如下: usrNetInit()函数中调用usrNetIfAttach(): #ifdef INCLUDE_BSD if (!attached) { if ( (usrNetIfAttach (pNetDev, params.unitNum, pBootString) !=OK))

return (ERROR); attached = TRUE; } #endif /*INCLUDE_BSD*/ usrNetIfAttach ()函数中调用数组表usrNetIfTbl for (pNif = usrNetIfTbl; pNif->ifName != 0; pNif++) { if (strcmp (buf, pNif->ifName) == 0) break; } 网络BSD驱动数组表usrNetIfTbl在文件 /target/src/config/usrNetwork.c中的定义初始化: ... LOCAL NETIF netIf [] = /* 网络接口,定义网卡驱动 */ { /* 下面是定义包含的各种网络驱动 */ #ifdef INCLUDE_DC /* 从DEC 芯片启动,即系统有NVRAM存在,现在已过时*/ { "dc", dcattach, (char*)IO_ADRS_DC, INT_VEC_DC, INT_LVL_DC, DC_POOL_ADRS, DC_POOL_SIZE, DC_DATA_WIDTH, DC_RAM_PCI_ADRS, DC_MODE }, #endif /* INCLUDE_DC */ #ifdef INCLUDE_FEI /* 如果定义了INCLUDE_FEI,初始化Intel 网卡 */ { "fei", feiattach, (char*)FEI_POOL_ADRS, 0, 0, 0, 0}, #endif /* INCLUDE_FEI */ #ifdef INCLUDE_EX /* Excelan 网卡 */ { "ex", exattach, (char*)IO_ADRS_EX, INT_VEC_EX, INT_LVL_EX, IO_AM_EX_MASTER, IO_AM_EX }, #endif /* INCLUDE_EX */ #ifdef INCLUDE_ENP /* CMC 网卡 */ { "enp", enpattach, (char*)IO_ADRS_ENP, INT_VEC_ENP, INT_LVL_ENP, IO_AM_ENP }, #endif /* INCLUDE_ENP */

VxWorks操作系统MakeFile

VxWorks操作系统MakeFile(一) 时间:2008-8-24 夜 版权申明:本文为水煮鱼为水煮鱼@博客园撰写,不得用于商业用途,如需摘用,请与水煮鱼联系。 1、介绍 本文将介绍为什么要将你的C源代码分离成几个合理的独立文档,什么时候需要拆分,那又怎么拆分呢? 然后再介绍如何使用GUN Make使你的编译和链接步骤自动化。可能你使用的是其他的make工具,但是其实道理都差不多。当然如果你对自己的编程工具有怀疑的话,可以不妨实际的试试。 2、多文件项目介绍 a. why? 为什么使用多文件项目?他们有什么好处呢? 从表面上看,多文件项目是够复杂的了,又要头文件,又需要extern申明,并且如果你要查找一个文件的话,还需要在更多的文件里搜索。 但是如果把其考虑成一个项目,那一个项目根据功能划分为小的模块,那就不难理解了。 想想如果是一个一万行代码,如果你把其放到一个文件里,则在编译的时候,则需要对一万行代码进行重新编译。不过如果你如果把其放到不同的文件里,那修改一行,则只需要编译一个文件就可以了。可能你会说,一万行代码,就算全部编译,那点时间也基本可以忽略不计,但是实际情况是,在一个大的系统里,可能代码达到几十万甚至上百万,千万行代码的规模。以我们的项目为例,目前代码规模已经达到了上千万行的级别,如果全部重新编译,则将耗费几个小时甚至半天的时间。如果将其划分多多个文件,则修改一行所引入的编译代码,将不会随着你代码规模的增大而增大。所以多个文件的优点不言自明了。 不过对于不便于搜索的问题,其实只要文件划分得当,也并不会造成多大的困难。其实,从多个目标文件生成一个程序包比从一个单一文件生成程序包要好的多。当然,实际上这是不是一个优势还与你所使用的系统有关。但是当使用gcc/ld(一个GUN C编译器/连接器)把一个程序包连接到一个程序时,在连接的过程中,它会尝试不去连接没有使用到的部分,但它每次只能从程序包中把一个完整的目标文件排除在外。因此,如果你修改了一个程序包中某一个目标文档中任何一个符号的话,那么这个目标文件整个都会被连接进来。要是一个程序包被非常充分的分解的话,那么经过链接后,得到的可执行文件会比从一个大目标文件组成的程序包连接得到的文件小的多。 并且常常我们的程序是模块化的,高内聚,低耦合,使得文件之间共享部分被减少到了最少,因此采用多文件的方式,可以比较容易的找到代码中的bug。 b.when? 那什么时候分解你的项目? 如果你开发的是一个大项目,在开始前,应该好好考虑一下你将如何实现,并且将生成几个文件来存放你的代码。当然,在项目的开发过程中,你可以建立新的我文件,但是这将打乱你的整体布局,可能造成你整体结构的调整。因此特别建

计算机组成原理中断实验报告

北京建筑大学 2015/2016 学年第二学期 课程设计 课程名称计算机组成原理综合实验 设计题目微程序控制器设计与实现 系别电信学院计算机系 班级计141 学生姓名艾尼瓦尔·阿布力米提 学号 完成日期二〇一六年七月八日星期五 成绩 指导教师 (签名) 计算机组成综合实验任务书

指令执行流程图; ?5、利用上端软件,把所编写的微程序控制器内容写入实验台中控制器中。 ?6、利用单拍测试控制器与编程的要求是否一致。如果有错误重新修改后再写入控制器中。 7、编写一段测试程序,测试控制器运行是否正确。 实验目的 1.融合贯通计算机组成原理课程,加深对计算机系统各模块的工作原理及相互联系(寄存器堆、运算器、存储器、控制台、微程序控制器)。 2.理解并掌握微程序控制器的设计方法和实现原理,具备初步的独立设计能力;3.掌握较复杂微程序控制器的设计、调试等基本技能;提高综合运用所学理论知识独立分析和解决问题的能力。 实验电路 1. 微指令格式与微程序控制器电路 2.微程序控制器组成 仍然使用前面的CPU组成与机器指令执行实验的电路图,但本次实验加入中断系统。这是一个简单的中断系统模型,只支持单级中断、单个中断请求,有中断屏蔽功能,旨在说明最基本的原理。

中断屏蔽控制逻辑分别集成在2片GAL22V10(TIMER1 和TIMER2)中。其ABEL语言表达式如下: INTR1 := INTR; INTR1.CLK = CLK1; IE := CLR & INTS # CLR & IE & !INTC; IE.CLK= MF; INTQ = IE & INTR1; 其中,CLK1是TIMER1产生的时钟信号,它主要是作为W1—W4的时钟脉冲,这里作为INTR1的时钟信号,INTE的时钟信号是晶振产生的MF。INTS微指令位是INTS机器指令执行过程中从控制存储器读出的,INTC微指令位是INTC机器指令执行过程中从控制存储器读出的。INTE是中断允许标志,控制台有一个指示灯IE显示其状态,它为1时,允许中断,为0 时,禁止中断。当INTS = 1时,在下一个MF的上升沿IE变1,当INTC = 1时,在下一个MF的上升沿IE变0。CLR信号实际是控制台产生的复位信号CLR#。当CLR = 0时,在下一个CLK1的上升沿IE变0。当 CLR=1 且INTS = 0 且 INTC = 0时,IE保持不变。 INTR是外部中断源,接控制台按钮INTR。按一次INTR按钮,产生一个中断请求正脉冲INTR。INTR1是INTR经时钟CLK1同步后产生的,目的是保持INTR1与实验台的时序信号同步。INTR脉冲信号的上升沿代表有外部中断请求到达中断控制器。INTQ是中断屏蔽控制逻辑传递给CPU的中断信号,接到微程序控制器上。当收到INTR脉冲信号时,若中断允许位INTE=0,则中断被屏蔽,INTQ仍然为0;若INTE =1,则INTQ =1。

Vxworks中断服务程序解析

Vxworks中断服务程序解析 中断服务程序用来处理来自硬件的中断,是设备驱动程序的重要组成部分。为及时响应外部中断,防止中断丢失.中断服务程序应该尽量的小,只把最必要的任务放在中断服务程序里面执行。一般在系统启动,硬件设备成功初始化之后将ISR与中断向量挂上:也可以在系统启动后的任何时刻挂中断向量。调试中经常采用后一种方式。在VxWorks中有两个不同的函数可提供挂中断:intConnect和pciIntConnect。两者的区别是intConnect使用的中断向量是独占的,pcilntConnect则可在各个不同的ISR之间共享中断向量。实际上pcilntConnect 内部调用了 intConnect函数,在内部使用一个链表来管理多个不同的ISR。pcilntConnect 要求每次进入ISR都要检查硬件的寄存器,证实中断的确是由ISR服务的硬件产生。如果硬件的寄存器表明该硬件并未产生中断,则ISR立即退出,以让挂在同一个中断向量上的其它ISR有机会检查是否有中断产生。pcilntLib.c中的代码清楚的说明了这个问题:void pciInt (int irq ){ PCLlNT RTN *pRtn; for (pRm = (PCI_INT_RTN*)DLL_FIRST(&pcilntList[irq]); pRtn!=NULL; pRtn =(PCI_INT_RTN*)DLL_NEXT(&pRtn->node)) (*pRtn->routine) (pRtn->parameter); } 当PCI总线上有中断发生时,系统调用void pcilnt(int irq)函数,再由pciInt使用内部的链表来依次调用挂在该中断上的ISR。如果某个ISR不能正常退出,就会影响到其它ISR的运行。在调试时为了检查中断向量是否已经和ISR可靠的连接上,可以在命令行上或程序中直接调用pciInt来查看ISR是否被触发。在硬件确定的情况下,可以小心设计保证各个硬件使用不同的中断,这样对PCI上的设备也可直接使用intConnect来挂中断。 需要说明的是ISR挂上中断向量的过程不是简单的在向量表中设置中断向量值。VxWorks 除了设置中断向量值以外,还在与中断向量相连的ISR加上了一层薄薄的包装,包括IsR执行前保存寄存器值.设置堆栈以及IsR执行后恢复寄存器和堆栈。在中断频繁的场合,系统中中断堆栈有可能被耗尽而溢出。为了避免上述情况发生,必须修改系统的中断堆栈大小,即在config.h中加入以下代码: #define INCLUDE_KERNEL #define ISR_STACK_SIZE 0xl000 //表示系统中中断堆栈的大小为4k 由于中断处理程序的特殊性,中断处理程序中不能使用可能导致阻塞的函数,如printf,semTake等,具体不可使用的函数列表可以在<>中查到。有时候为了调试方便,希望在ISR中打印一些信息,系统提供了一个与prinf等价的函数sysLog,该函数可接受 7个参数。它是非阻塞的。比较而言,prinf函数要在打印任务完成后才返回,sysLog只把打印任务放到系统的打印队列中就返回。在ISR中虽然不可以使用semTake,但可以使用semGive(互斥类型的除外)。一般使用semTake和semGive在ISR和普通程序间通信:当一个中断产生,ISR 完成必要的任务后,调用semGive通知另外一个使用semTake等待ISR信号的任务,该任务收到semGive释放的信号后,继续完成ISR中不便处理的任务。

MPC8377硬件环境下vxworks仿真的建立过程

MPC8377硬件环境下vxworks仿真的建立过程 2012-8-7 U-BOOT常用命令: 重启:reset 查看环境变量:printenv 修改环境变量:例如修改PC机IP,setenv serverip “……” 保存环境变量:saveenv 下载bootrom:run laodvx 如果需要用到其他命令,在命令行输入“?”查看。 1.首先,需要在FLASH中烧写好U-BOOT,把串口和网线连接好(如果多串口和网口的话,请检查并接在正确的位置),打开串口调试工具并设置在数据读取状态,然后上电,在倒计时读秒完成前在命令输入行输入任何信息进入U-BOOT层。 命令行 U-BOOT读秒区 2.在命令行输入printenv命令会显示U-BOOT的信息,如果ip不是我们想要的,可以通过setenv serverip “……”来修改,如下图中就把ip从192.168.1.24

改为192.168.1.43,修改完成后需要saveenv,然后reset,整个修改完成。 Printenv命令后的ip信息 Setenv serverip ”192.168.1.43” 后的结果 3.下载bootrom。先找到vxworks编译好的bootrom.bin文件,例如:本PC 上的路径C:\WindRiver-GPPVE-3.6-PPC-Eval\vxworks-6.6\target\config\mds837x,如下图。 需要的bootrom文件 把bootrom复制到tftp软件所在的位置,如下图。

放置好的bootrom文件 然后启动tftp软件,并在命令行输入:run loadvx,成功后如下图,至此bootrom 下载完毕。 下载成功后tftp显示信息 4.Vxworks下载。首先启动Vxworks6.6自带的ftp server,并配置好登陆用户和密码以及相关设置,主要有两部分设置,如下图。

vxWorks下设备驱动模板

基于vxBus的设备驱动模板 vxWorks6.x 设备驱动采用了新型的vxBus构架,该构架和原来的设备驱动有很大不同,初上手会有很多不方便。下面提供的模板有助于快速形成一个vxBus 设备驱动 设备驱动在3个地方体现: 头文件,代码文件,hwconfig.c,根据下面模板,把所有DEVICE换成自己的设备,并做相应操作即可,免去很多重复代码的苦恼,开发者仅需要关注功能即可。 这个模板处理了中断,但没有提供处理基本IO的方法,模板不是用来学习的,怎样完整地写一个vxbus的驱动,还是需要学习的。 头文件 #ifndef DEVICE_h #define DEVICE_h #define DEVICE_CARD_NAME "设备名" #define DEVICE_CARD_DESC "设备描述" #define DEVICE_CARD_VXBNAME "设备vxBus名" #define DEVICE_CARD_INT_PIN [中断管脚] 页脚内容1

#define DEVICE_CARD_INT_CORE_PIN [核中断管脚] #define DEVICE_CARD_INT_CORE_NUM [中断处理核] #define DEVICE_INT_DESC {DEVICE_INT_PIN,DEVICE_CARD_VXBNAME,0,0} #define DEVICE_XBAR_DESC {DEVICE_INT_PIN,DEVICE_INT_CORE_PIN} #define DEVICE_ROUTE_DESC {DEVICE_INT_PIN,DEVICE_INT_CORE_NUM} #define DEVICE_UNIT0_DEVICE_ID 0 /*假如有多个同型号设备begin*/ #define DEVICE_UNIT1_DEVICE_ID 1 ..... /*假如有多个同型号设备end*/ /*其他设备宏*/ #endif/*DEVICE_h*/ 页脚内容2

vxWorks中断处理

Vxworks作为一个实时嵌入式操作系统,通常采用中断的方式来满足系统实时性的要求,因此,熟悉其中断的处理过程对于VxWorks操作系统的开发是至关重要的.本文通过编写和调试基于AT91RM9200处理器的VxWorks嵌入式操作系统的BSP,来讨论VxWorks操作系统的中断机制。 1 VxWorks中断处理机制及AIC AT91RM9200使用一个8优先级,可单独屏蔽中断的中断向量控制器AIC。在ARM体系结构中,有7种异常中断,对应有一个异常中断向量表。ARM体系结构要求这个异常中断向量表从0地址处开始,对于外部中断请求IRQ,系统又增加了一块由中断控制器控制的中断向量表。 2 AT91RM9200 BSP的中断驱动的实现 2.1 中断驱动中定义的函数 STATUS at91rm9200LvlVecChk (int*,int*); STATUS at91rm9200LvlVecAck(int,int); STATUS at91rm9200LvlEnable(int); STATUS at91rm9200LvlDisable(int); 2.2 高级中断控制器AIC的初始化 在usrInit()中excVecInit()函数对异常中断向量进行初始化.整个中断库,以及中断控制器的初始化都是在syslib.c中的sysHwInit2()函数中完成的.该函数在sysClkConnect()中被调用,因为系统时钟中断要在内核开放中断后就要使能,因此内核在初始化为一个多任务环境后,就产生一个usrRoot()的任务,在该任务中要建立系统时钟中断,因此调用了sysClkConnect()函数,中断库以及中断控制器的初始化也就完成了。 高级中断控制器必须进行初始化,其初始化是在板级支持包BSP的中断驱动程序中。具体的实现函数是void at91rm9200IntDevInit(void)。该函数在文件syslib.c的sysHwInit2()函数中调用。 at91rm9200IntDevInit(void)函数中主要是配置系统的钩子函数,然后对中断源向量寄存器和中断模式寄存器进行配置,同时要清除并禁止AIC中所有的中断。 2.3 中断驱动中的回调函数 在intEnt中,程序很快就进入了特权模式(SVC32),如果是中断可嵌套模式,要设置该模式下的堆栈,并且将中断深度intCnt值加1.然后跳转到intIntRtnPreempt中,在intIntRtnPreempt中为后来调用中断驱动中的函数开辟了32个字节的堆栈空间,并且将程序指针拉到at91rm9200LvlVecChk函数处执行,at91rm9200LvlVecChk函数是在中断驱动中定义的函数,是用来检测当前挂起的中断中,优先级最高的中断源。检测出最高优先级的中断后,首先要禁止该中断,因此要调用at91rm9200LvlDisable函数,该函数也在中断驱动中定义。在禁止中断的过程中,需要通过intLock和intUnLock函数来保护临界代码不被新的中断打断。

VxWorks5.5 RTL81X9网卡驱动

VxWorks Torando2.2 RTL81X9网卡驱动添加过程 Step 1. 下载RTL81X9驱动源代码。 Step 2. 复制一个BSP包,并且修改名称,例如,我复制了一个PC486的BSP包,改名为i486bsp,如图所示: Step 3. 修改复制的BSP里面的Makefile文件,修改文件内容的如下: TARGET_DIR = i486bsp MACH_EXTRA =rtl81x9.o ;添加rtl81x9.o到系统中 Step 4. 复制RTL81X9的驱动代码rtl81x9.h、 rtl81x9.c、sysRtl81x9End.c文件到你的bsp包中。Step 5. 修改BSP包中的Config.h文件。在文件如下部分添加黄色标记的内容 #define INCLUDE_PCI /* Network driver options */ #define INCLUDE_END /* Enhanced Network Driver Support */ #undef INCLUDE_DEC21X40_END /* (END) DEC 21x4x PCI interface */

#undef INCLUDE_EL_3C90X_END /* (END) 3Com Fast EtherLink XL PCI */ #undef INCLUDE_ELT_3C509_END /* (END) 3Com EtherLink III interface */ #undef INCLUDE_ENE_END /* (END) Eagle/Novell NE2000 interface */ #undef INCLUDE_FEI_END /* (END) Intel 8255[7/8/9] PCI interface */ #undef INCLUDE_GEI8254X_END /* (END) Intel 82543/82544 PCI interface */ #undef INCLUDE_LN_97X_END /* (END) AMD 79C97x PCI interface */ #undef INCLUDE_ULTRA_END /* (END) SMC Elite16 Ultra interface */ #define INCLUDE_RTL_81X9_END Step 6. 修改ConfigNet.h文件,在文件如下部分添加黄色标记的部分添加: /* Intel 82543/82544 PCI (gei) driver defines */ #ifdef INCLUDE_GEI8254X_END #define GEI8254X_LOAD_FUNC sysGei8254xEndLoad #define GEI8254X_BUFF_LOAN TRUE #define GEI8254X_LOAD_STR "" IMPORT END_OBJ * GEI8254X_LOAD_FUNC (char *, void *); #endif /* INCLUDE_GEI8254X_END */ #ifdef INCLUDE_RTL_81X9_END #define RTL_81X9_LOAD_FUNC sysRtl81x9EndLoad #define RTL_81X9_LOAD_LOAN TRUE #define RTL_81X9_LOAD_STRING "" IMPORT END_OBJ * RTL_81X9_LOAD_FUNC (char *, void *); #endif /* INCLUDE_RTL_81X9_END */ END_TBL_ENTRY endDevTbl [] = { #ifdef INCLUDE_EL_3C90X_END {0, EL_3C90X_LOAD_FUNC, EL_3C90X_LOAD_STR, EL_3C90X_BUFF_LOAN, NULL, FALSE}, #endif /* INCLUDE_EL_3C90X_END */ #ifdef INCLUDE_LN_97X_END {0, LN_97X_LOAD_FUNC, LN_97X_LOAD_STR, LN_97X_BUFF_LOAN, NULL, FALSE}, #endif /* INCLUDE_LN_97X_END */

相关主题