OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » (三)VxWorks/Tornado建立调试环境(老站转)

共1条 1/1 1 跳转至

(三)VxWorks/Tornado建立调试环境(老站转)

菜鸟
2002-06-01 00:20:00    评分
南大小百合 助理工程师 来自: 发表总数:9   查看   短消息   电子邮件 -------------------------------------------------------------------------------- 发信人: mayun (wind), 信区: Embedded 标 题: (三)VxWorks/Tornado建立调试环境 发信站: 南京大学小百合站 (Wed Jan 9 16:15:51 2002) 建立调试环境 Tornado采用支持主机/目标机开发模式。本节以x86系列目标机为例介绍调试环境的建立。 7.1.1 配置文件config.h 目标机运行的程序包括两部分:引导文件bootrom.sys和操作系统影像文件VxWorks。 引导文件bootrom.sys的主要作用类似于BIOS,一般它存放在一张软盘或目标机硬盘或目标 机FLASH盘上,由Vxld或其他程序加载到内存,用于初始化目标机上的包括引导硬件在内的 硬件,建立VxWorks运行的环境,从引导设备上加载VxWorks操作系统影像,并将CPU的控制 权移交给操作系统。 VxWorks是操作系统的影像文件。它是应用程序和目标代理程序(调试环境的目标机部分) 运行的软件平台,一般存放在bootrom.sys所在软盘或目标机硬盘或目标机FLASH盘,或主 机硬盘上,由bootrom.sys的引导程序加载到目标机内存。 bootrom.sys和VxWorks这两个可以利用Tornado提供的工具,按照配置文件config.h有关设 置自动生成。特定BSP的配置文件config.h在该BSP目录下。如pc486的配置文件是Tornado \target\config\pc486\config.h。 配置文件config.h主要定义了引导行,目标机操作系统包含的主要成分,如软驱、IDE硬盘 、SCSI设备、网络等设备驱动,文件系统(DOSFS,TFFS,CDROMFS等),调试方式,内存 地址等及有关参数。 引导行(boot line)定义了引导设备、引导路径、操作系统文件名、主机/目标机IP地址 、子网掩码、FTP用户名和口令等参数。 对于X86平台目标机,引导设备可以是软盘(fd),硬盘(ata或ide),FLASH盘(tffs) ,网卡(elt、ene等)等。一般采用通过以太网或通过RS232或RS422标准串口连结进行调 试。 在X86平台上,首先确定调试手段,是通过网络还是串口调试?然后按下面的步骤建立调试 环境: 1 修改配置文件 2 生成bootrom_uncmp引导文件和VxWorks影像文件 3 制作启动软盘 4 配置主机环境 5 用启动软盘启动目标机 6 从主机搭接(attach)到目标机 下面详细介绍。 7.1.2 网络连接 使用以太网连结调试方式,通过网口使用FTP协议从主机下载VxWorks映像。在X86平台上, 一般使用启动软盘来启动目标机。首先要确定目标机使用的网卡型号。VxWorks5.4支持的 网卡可以参考config.h文件。需要包含相应的INCLUDE_XXX。常用的如下表: 表7.1 VxWorks5.4支持的几种常用网卡 INCLUDE_XXX 网络接口卡 备注 INCLUDE_ENE Eagle/Novell NE2000接口卡 包括兼容卡,不支持即插即用方式 INCLUDE_ELT 3COM EtherLink III接口卡 包括兼容卡,不支持即插即用方式 INCLUDE_EL_3C90X_END 3com fast etherLink XL PCI网卡 3Com3c905系列 INCLUDE_FEI Intel Ether Express PRO100B PCI接口卡 INCLUDE_LN_97X_END AMD 79C972网卡 1 修改config.h 修改config.h最重要的一步是修改引导行。引导文件bootrom.sys根据引导行来确定引导设 备、引导路径、操作系统文件,并且引导行存放在固定的位置。操作系统访问引导行来确 定网络的配置,系统reboot时也将访问引导行。bootrom.sys和VxWorks将它转换为一个特 定的引导参数结构BOOT_PARAMS 。 在config.h中,引导行定义为有特定格式的字符串。BOOT_PARAMS定义在h\bootlib.h中。 解释如下: typedef struct /* 引导参数结构BOOT_PARAMS */ { char bootDev [BOOT_DEV_LEN]; /* 引导设备代码 */ char hostName [BOOT_HOST_LEN]; /* 主机名 */ char targetName [BOOT_HOST_LEN]; /* 目标机名 */ char ead [BOOT_TARGET_ADDR_LEN]; /* 目标机以太网地址*/ char bad [BOOT_TARGET_ADDR_LEN]; /* 底板以太网地址 */ char had [BOOT_ADDR_LEN]; /* 主机以太网地址 */ char gad [BOOT_ADDR_LEN]; /* 以太网网关 */ char bootFile [BOOT_FILE_LEN]; /* 引导文件名 */ char startupScript [BOOT_FILE_LEN]; /* 启动脚本文件名*/ char usr [BOOT_USR_LEN]; /* 用户名 */ char passwd [BOOT_PASSWORD_LEN]; /* 口令 */ char other [BOOT_OTHER_LEN]; /* 留给应用程序使用 */ int procNum; /* 处理器号*/ int flags; /* 配置标示*/ int unitNum; /* 网络设备编号 */ } BOOT_PARAMS; 以ISA 3COM3c509b网卡为例,网卡需要设置为非即插即用方式,中断号为5,IO端口为0x3 00。主机IP地址为222.1.5.169,目标机IP地址为222.1.5.36。主机名为VxHost,有一FTP 用户VxMe,口令为isMe。 对应的引导行应为: “elt(0,0)VxHost:\tornado\target\config\pc486\vxWorks h=222.1.5.169 e=222.1.5. 36 u=VxMe pw=isMe tn=VxTarget” 解释如下: ene /* 启动设备名,为ISA3COM3c509网卡,ne2000网卡应为ene */ VxHost /* 主机标名,可以任意填写,不影响启动过程 */ \tornado\target\config\pc486\vxWorks /* 需要从主机加载的路径及映像文件名 */ h=222.1.5.169 /* 主机的IP地址 */ e=222.1.5.36 /* 目标机的IP地址 */ u= VxMe /* 用户名,主机的Ftp服务器必须有相应的同名用户 */ pw= isMe /* 口令,必须与主机的Ftp服务器相应的同名用户的口令相同*/ tn= VxTarget /*目标名,可以任意设置,不影响启动过程*/ 将下面的一行 #undef INCLUDE_ELT /* uninclude 3COM EtherLink III interface */ 该为: #define INCLUDE_ELT /* include 3COM EtherLink III interface */ 还要修改下面的定义 #define IO_ADRS_ELT 0x240 #define INT_LVL_ELT 0x0b 为: #define IO_ADRS_ELT 0x300 /* 网卡I/O地址 */ #define INT_LVL_ELT 0x05 /* 网卡中断号 */ config.h 修改完毕,下一步是生成目标文件bootrom.sys和V xWorks。 2 生成目标文件bootrom.sys和VxWorks 先生成bootrom_uncmp。 在Tornado集成环境中执行菜单命令Build-〉Build Boot ROM…,在弹出的对话框中,左边 框中选择BSP,选中pc486,右边框中选择要生成的影像文件,选择bootrom_uncmp,然后点 击OK确认。Tornado将生成bootrom_uncmp。 再生成VxWorks。 在Tornado集成环境中执行菜单命令Build-〉Standard BSP Builds…。(如果没有该项, 请执行菜单命令Tools-〉Options…,在弹出的对话框中,选中Project页,选择Show Tor nado 1.0.1 menu items,点击OK确认)。与生成bootrom_uncmp类似,在弹出的对话框中, BSP选择pc486,影像文件,选择VxWorks。然后点击OK确认。Tornado将生成VxWorks。 注意,必要时先进行clean操作 3 制作启动软盘 拷贝 Tornado\target\config\pc486\bootrom_uncmp至 Tornado\host\bin下; 准备一张已格式化的空盘插入软驱; 在目录Tornado\host\bin下执行命令 mkboot a: bootrom_uncmp 注意,有时,我们需要改变配置参数,重新生成引导文件,如果软盘已经是可引导的,那 么只需更换软盘上的引导文件即可,方法是: del a:. (需要键入’y’确认删除) vxcopy bootrom_uncmp a:bootrom.sys 4 配置主机环境 主机操作系统Win95安装目录下有一文件hosts.sam,向其中加入: 主机IP 主机名 目标机IP 目标机名 启动Tornado组件FTP Server,在WFTPD窗口中选择菜单Security中的User/right...,在其 弹出窗口中选择New User...,根据提示信息输入登录用户名和口令,并且要指定下载文件 VxWorks所在根目录。可能还需要选取主菜单Logging中Log options、Enable Logging、G ets 、Logins 、Commands 、Warnings选项。 5 用启动软盘启动目标机 将系统引导软盘插入目标机软驱,加电启动,目标机即通过FTP方式从主机下载VxWorkst系 统。 在控制台上可以看到启动信息。如果需要修改,在等待用户配置时,按c键,进行相应修改 。(注意:配置信息要与主机配置、Ftp服务器配置一致),修改结束后,按@键重新启动 目标机。 6 从主机搭接(attach)到目标机 在Tornado集成环境中点取Tools菜单,选取Target Server,选择config...; 在Configure Target Servers窗口中先给目标服务器命名; 在配置目标服务器窗口中的“Target Servers Property”窗口中,选择Back End;在“A vailable Back”窗口中选择wdbrpc,在“Target IP/Address”窗口中输入目标机IP(本 例为222.1.5.36); 在配置目标服务器窗口中的“Target Servers Property”窗口中,选择Core File and S ymbols, 选择File为BSP目标文件所在目录(本例为PC486目录)的VxWorks,并选取为All Symbols; 在配置目标服务器窗口中的" Target Servers Property"窗口中的其它各项可根据需要选 择; 点击Launch按钮,连接主机和目标机,全部出现successed后即可进入应用程序调试; 点击图形按钮中下拉框,选择和主机相连的目标机。即可建立主机目标机连接。 这时Shell、Debugger等按钮可用。 7.1.3 串口连接 串口连接一般从启动软盘下载VxWorks映像。其步骤如下: 1 修改通用配置文件 在config.h文件中加入以下宏定义: #define INCLUDE_WDB #define INCLUDE_WDB_TTY_TEST #undef WDB_COMM_TYPE #define WDB_COMM_TYPE WDB_COMM_SERIAL /*定义通信方式为串口联结*/ #define WDB_TTY_CHANNEL 1 /*通道号,目标机串口2*/ #define WDB_TTY_BAUD 9600 /*串口速率,VxWorks最高可设置至38400*/ #define WDB_TTY_DEV_NAME "tyCo/1" #define CONSOLE_TTY 0 引导行为 #define DEFAULT_BOOT_LINE \ "fd=0,0(0,0)hostname:/fd0/vxWorks h=222.1.5.169 e=222.1.5.36 u=VxMe" 2 生成目标文件bootrom.sys和VxWorks 同网络连接。 3 制作启动软盘 同网络连接。同时要把Tornado\target\config\pc486\VxWorks拷贝至软盘。 4 配置主机环境 不需要。 5 用启动软盘启动目标机 将系统制作盘插入目标机软驱,加电启动,目标机即由软盘下载VxWorks系统。 6 从主机搭接(attach)到目标机 在Tornado集成环境中点取Tools菜单,选取Target Server,选择config...; 在Configure Target Servers窗口中先给目标服务器命名; 在Configure Target Servers窗口中先给目标服务器命名; 在配置目标服务器窗口中的" Target Servers Property"窗口中选择Back End,在"Avail able Back"窗口中选择wdbserial,再在"Serial Port"窗口中选择主机与目标机连接所占 用的串口号(COM1,COM2),再在"Speed(bps)"窗口中选择主机与目标机间串口速率; 在配置目标服务器窗口中的" Target Servers Property"窗口中选择Core File and Symb ols,选择File为BSP目标文件所在目录(本例为PC486目录)的VxWorks,并选取为All Sy mbols; 在配置目标服务器窗口中的" Target Servers Property"窗口中的其它各项可根据需要选 择; 点击Launch按钮,连接主机和目标机,全部出现successed后即可进入应用程序调试; 点击图形按钮中下拉框,选择和主机相连的目标机。即可建立主机目标机连接。 这时Shell、Debugger等按钮可用 -------------------------------------------------------------------------------- 编辑 发表於:2002-01-10 - 12:55:22 IP: 211.97.*.* stony 工程师 来自: 发表总数:62 查看   短消息   电子邮件 -------------------------------------------------------------------------------- 《嵌入式实时操作系统VXWORKS及其开发环境TORNADO》第七章实例分析的源代码: ================================================================================ /*******************************************************************************/ #include "vxWorks.h" #include "semLib.h" #include "taskLib.h" #include "msgQLib.h" #include "wdLib.h" #include "logLib.h" #include "tickLib.h" #include "sysLib.h" #include "stdio.h" /* defines */ #if TRUE #define STATUS_INFO #endif #define MAX_MSG 1 #define MSG_SIZE sizeof (MY_MSG) #define DELAY 100 #define HIGH_PRI 150 #define LOW_PRI 200 #define TASK_HIGHPRI_TEXT "Hello from the 'high priority' task" #define TASK_LOWPRI_TEXT "Hello from the 'low priority' task" /* typedefs */ typedef struct my_msg { int childLoopCount; char * buffer; } MY_MSG; /* globals */ SEM_ID semId; MSG_Q_ID msgQId; WDOG_ID wdId; int highPriId; int lowPriId; int windDemoId; /* forward declarations */ LOCAL void taskHighPri (int iteration); LOCAL void taskLowPri (int iteration); /******************************************************************************* * * windDemo - parent task to spawn children * * This task calls taskHighPri() and taskLowPri() to do the actual operation * of the test and suspend itself. * Task is resumed by the low priority task. * */ void windDemo ( int iteration ) { int loopCount = 0; #ifdef STATUS_INFO printf("Entering windDemo\n"); #endif if (iteration == 0) iteration = 10000; /* Create objects used by the child tasks */ msgQId = msgQCreate(MAX_MSG, MSG_SIZE, MSG_Q_FIFO); semId = semBCreate (SEM_Q_PRIORITY, SEM_FULL); wdId = wdCreate (); windDemoId = taskIdSelf (); FOREVER { /* spawn child tasks to exercise kernel routines */ highPriId = taskSpawn ("tHighPri", HIGH_PRI, VX_SUPERVISOR_MODE, 4000, (FUNCPTR) taskHighPri, iteration, 0, 0, 0, 0, 0, 0, 0, 0, 0); lowPriId = taskSpawn ("tLowPri", LOW_PRI, VX_SUPERVISOR_MODE, 4000, (FUNCPTR) taskLowPri, iteration, 0, 0, 0, 0, 0, 0, 0, 0, 0); taskSuspend (0); #ifdef STATUS_INFO printf("\nParent windDemo has just completed loop number %d\n", loopCount); #endif loopCount ++; } /* end of FOREVER */ } /* end of windDemo */ /******************************************************************************* * * taskHighPri - high priority task * * This task exercises various kernel functions. It will block if the resource * not avaiable and relingish the CPU to the next ready task. * */ LOCAL void taskHighPri ( int iteration ) { int ix; MY_MSG msg; MY_MSG newMsg; for (ix = 0; ix < iteration; ix ++) { /* take and give a semaphore - no context switch involved */ semGive (semId); semTake (semId, 100); /* * take semaphore - context switch will occur since semaphore * is unavaiable */ semTake (semId, WAIT_FOREVER); taskSuspend (0); /* build message and send it */ msg.childLoopCount = ix; msg.buffer = TASK_HIGHPRI_TEXT; msgQSend (msgQId, (char*) &msg, MSG_SIZE, 0, MSG_PRI_NORMAL); /* * read message that this task just sent and print it - no context * switch will occur since there is a message already in the queue */ msgQReceive (msgQId, (char *) &newMsg, MSG_SIZE, NO_WAIT); #ifdef STATUS_INFO printf("%s\n Number of iterations is %d\n", newMsg.buffer, newMsg.childLoopCount); #endif /* * block on message queue waiting for message low priority task context * switch will occur since there is no message in the queue. when message * is received, print it */ msgQReceive (msgQId, (char *) &newMsg, MSG_SIZE, WAIT_FOREVER); #ifdef STATUS_INFO printf("%s\n Number of iterations by this task is %d\n", newMsg.buffer, newMsg.childLoopCount); #endif /* test watchdog timer */ wdStart (wdId, DELAY, (FUNCPTR) tickGet, 1); wdCancel (wdId); } } /* end of taskHighPri() */ /******************************************************************************* * * taskLowPri - low priority task * * This task runs at a lower priority and is designed to make available * the resouces that the high priority task is waiting for and subsequently * unblock the high priority task * */ LOCAL void taskLowPri ( int iteration ) { int ix; MY_MSG msg; for (ix=0; ix { semGive (semId); taskResume (highPriId); /* build message and send it */ msg.childLoopCount = ix; msg.buffer = TASK_LOWPRI_TEXT; msgQSend (msgQId, (char *) &msg, MSG_SIZE, 0, MSG_PRI_NORMAL); taskDelay(60); } taskResume (windDemoId); } /******************************************************************************/ =============================================================================== 代码不长,不过这可是偶辛辛苦苦敲进去的,呵呵! -------------------------------- 清风拂山冈 明月照大江



关键词: VxWorks     Tornado     建立     调试     环境         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]