共1条
1/1 1 跳转至页
(三)VxWorks/Tornado建立调试环境(老站转)
南大小百合
助理工程师
来自:
发表总数: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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |