在项目中需要适配vxWorks,自己总结的遇到的问题与解决方法,欢迎大家交流vxWorks使用心得。
Q:
如何在vxWorks bootrom添加devs命令?
A:
在usrconfig.c中的包含 bootFsLoadInit()
configAll.h 添加 两个宏定义
/* Define for FS */
#define BOOTAPP /* add by maketure at 20180509 */
#define INCLUDE_DOSFS /* add by maketure at 20180509 */
Q:
在workbench中如何生成vxWorks的bootrom.bin文件?
A:
(方案1)在workbench中-->open development shell 进入bsp目录,输入make bootrom.bin
(方案2)在workbench中,在工程右键选择Builds Options-->set Active build Spec...-->选择需要生成二进制文件格式
Q:
ZYNQ芯片系列中SDK工具用来生成BOOT.bin的bootrom.elf 文件怎么通过workbench获得?
A:
workbench生成的bootrom本身的格式就是elf,故只要重命名
Q:
在workbench中如何更新vxWorks library?
A:
(1)P2020相关系列
在workbench中-->open development shell 进入对应的库目录,然后 make TOOL=e500v2diab CPU=PPC32
(2)ZYNQ系列
make CPU=ARMARCH7 TOOL=diab
make CPU=ARMARCH7 TOOL=diab VXBUILD=SMP
make CPU=ARMARCH7 TOOL=gnu
make CPU=ARMARCH7 TOOL=gnu VXBUILD=SMP
Q:
如何对vxwork的输入输出重定向,即printf输出的对象?
A:
(1)ioTaskStdSet 任务级别重定向 ioGlobalStdSet全局的
void spyComTask
(
int freq,
FUNCPTR printRtn
)
{
int delay = freq * sysClkRateGet ();
int consoleFd = open ("/tffs1/output.txt", 2, 0); //把spy任务输出重定向到 tffs里的output.txt文件
ioTaskStdSet (0, STD_IN, consoleFd);
ioTaskStdSet (0 ,STD_OUT, consoleFd);
ioTaskStdSet (0, STD_ERR, consoleFd);
void spyComTask ( int freq, FUNCPTR printRtn ) { int delay = freq * sysClkRateGet ();int consoleFd = open ("/tffs1/output.txt", 2, 0); //把spy任务输出重定向到 tffs里的output.txt文件ioTaskStdSet (0, STD_IN, consoleFd);ioTaskStdSet (0 ,STD_OUT, consoleFd);ioTaskStdSet (0, STD_ERR, consoleFd);
while (TRUE)
{
spyReportCommon (printRtn);
taskDelay (delay);
}
consoleFd = NONE;
此consoleFd变量即标准输入输出句柄,此时为空。
同样,可以找到如下的三行代码:
ioGlobalStdSet (STD_IN, consoleFd);
ioGlobalStdSet (STD_OUT, consoleFd);
ioGlobalStdSet (STD_ERR, consoleFd);
/*打开串口,输入输出重定向到超级终端*/
if((consoleFd=open("/tyCo/0",O_RDWR,0))==ERROR)
logMsg("open /tyCo/0 error! \n",0,0,0,0,0,0);
(void)ioctl(consoleFd,FIOBAUDRATE,9600);
(void)ioctl(consoleFd,FIOSETOPTIONS,OPT_TERMINAL&~OPT_ECHO);
(void)ioctl(consoleFd,FIOWFLUSH,0);
(void)ioctl(consoleFd,FIORFLUSH,0);
(2)VxWorks中的重定向
(3) VxWorks5.5中的输入输出定向
在target\config\bspName\config.h文件中,可以找到如下定义:
#undef INCLUDE_PC_CONSOLE /* PC keyboard and VGA console */
#ifdef INCLUDE_PC_CONSOLE
# define PC_CONSOLE (0) /* console number */
# define N_VIRTUAL_CONSOLES (2) /* shell / application */
#endif /* INCLUDE_PC_CONSOLE */
/* PS/2 101-key default keyboard type (use PC_XT_83_KBD for 83-key) */
#define PC_KBD_TYPE (PC_PS2_101_KBD)
实际开发中的应用
假如某Telnet打开的socket为sock:
ioGlobalStdSet(STD_OUT,sock);
ioGlobalStdSet(STD_IN,sock);
ioGlobalStdSet(STD_ERR,sock);
ipstatShow();
ioGlobalStdSet(STD_OUT,consoleFd);
ioGlobalStdSet(STD_IN,consoleFd);
ioGlobalStdSet(STD_ERR,consoleFd);
Q:
vxBusShow 没有命令时,如何解决?
A:
添加组件 vxBus subsystem show routines
如果找到,二者结合成一个instance,否则在vxBusShow里可以看到一个orphan。使用vxBusShow可以比较清晰的看到driver列表和device列表以及orphan列表
Q:
如何通过命令行显示驱动 以及设备 (devs)、文件描述的情况?
Q:
vxWorks如何查看任务负载?
A:
getcpuusage命令
Q:
vxWorks查看与修改系统时间?
A:
Q:
VxWorks ifconfig 修改IP , MAC地址等?
A:
ifAddSet "motetsec0 192.168.5.100 up"
ifMaskSet "motetsec0 255.255.255.0 up"
ifConfig "motetsec0 192.168.5.100 up"
ifConfig "motetsec0 lladdr 192.168.5.100 up"
Q:
vxWorks命令行 查看can收发状况
A:
Q:
vxWorks查看串口收发情况
A:
uartShow
Q:
vxWorks FUNCPTR 与VOIDFUNCPTR 定义的位置?
A:
vxTypesOld.h e_vxTypesOld.h
Q:
为啥将40wrsample.cdf copy to ${WIND_BASE}/target/config/comps/vxWorks directory然后workbench未出现可配置的界面?
A:
需要重启下workbench
Q:
vxWorks怎么查看二进制文件是否有某个符号表?
A:
nmpentium default/vxWorks | grep wrsampleRegister
Q:
VxWorks怎么在命令行中测试函数的执行时间?
A:
timexN delay,100
Q:
vxWorks怎么获取主机的IP地址?
A:
int bb()
{
char name[32];
int ip = 0;
char ipadd[15];
char *p;
struct in_addr iaddr;
if (gethostname(name, 30) == ERROR) //This routine gets the target machine's symbolic name, which can be used for identification
{
fprintf(stderr, "Call gethostname failed!\n");
return 0;
}
if ((ip = hostGetByName(name)) == ERROR)//这个数怎么变x.x.x.x 例如192.168.0.50
{
fprintf(stderr, "Call hostGetByName failed!\n");
return 0;
}
iaddr.s_addr = ip;
sprintf(ipadd,"%s",inet_ntoa(iaddr));
p = inet_ntoa(iaddr);
printf("%s\n%d\n %s\n",name,ip,ipadd);
printf("%s\n",p);
}
添加组件 vxBus subsystem show routines
gethostName 得到名称为target name
This routine gets the target machine's symbolic name, which can be used for identification
最后处理得到的ip为 inet on ethernet
Q:
windRiver workbench 如何编译静态库?
1. 新建一个“Downloadable Kernel Module Project”工程;
2. 选择对应的硬件环境,此处选择“MIPSI64gnule_SMP”;
3. 选择需要编译生成的库形式,Linker对应生成动态库.out,Librarian对应生成静态库.a;
4. 编译成成对应库文件(此处以静态库为例);
5. 新建一个image工程,点击右键的properties,选择build properties;
6. 点击build properties,选择build macros选项卡,该选项下有两栏需特别注意,一个是EXTRA_MODULES,一个是LIBS,在image工程中我们要链接MODULE工程编译生成的库文件,需要添加在EXTRA_MODULES栏中,可以在其中链接诸如.o、 .a等文件。但是在LIBS中链接这类a文件,会编译报错,至于为何报错,以及这两者有啥区别,有待日后研究……
A:
New Wind River Workbench Project --->类型为static Kernel Library ,不能选择vxwork6.x project 否则看不到static Kernel Library 类型引用为 编译类型需要在工程创建后更改
image:
Q:
如何在vxwork使用脚本(镜像和脚本同一级目录,且需要定制shell startup script组件)?
A:
启动参数中的脚本优先于usrAppinit执行.若需要在usrAppInit里面执行,则需要收到调用
usrStartupScript("/tffs0/start_opensca")函数使用?
启动目标机,在bootrom引导vxworks时,指定startup script参数,如:
boot device : cpm
unit number : 0
processor number : 0
host name : chenqi
file name : vxWorks
inet on ethernet (e) : 192.168.0.200
host inet (h) : 192.168.0.118
user (u) : target
ftp password (pw) : target
flags (f) : 0x0
target name (tn) : 850pc
startup script (s) : myscript.txt
如果一切正常,vxworks启动完毕之后,会有:
Executing startup script myscript.txt ...
printf("hello ")
hello
出现下面情况
ipAttach(0, "motetsec")
C interp: unknown symbol name 'ipAttach'
需要添加Attach END to IPv4
Q:
如何通过网络设备名获取mac地址?
A:
STATUS get_mac(char* ifName,int ifUnit)
{
END_OBJ *pEnd;
UINT8 *pData = NULL;
int i =0;
STATUS rval =0;
pData = (UINT8 *)malloc(MAC_ADRS_LEN);
pEnd = endFindByName(ifName,ifUnit);
if(pEnd == NULL)
{
perror("pEnd is null \n");
return ERROR;
}
rval = muxIoctl(pEnd,EIOCGADDR,pData);
for(i=0;i < MAC_ADRS_LEN;i++)
{
printf("%02x:",*(pData+i));
}
return rval;
}
Q :
vxWork如何命令行中创建nor flash文件设备?
A:
step one: tffsDevFormat(0,0)---normal step two: usrTffsConfig(0,0,"/tffs0")
usrTffsConfig (1, 0, "/tffs1");
-> cd "/tffs0"
cd: error = 0x16.·
value = -1 = 0xffffffff
set three:dosfsDiskFormat("/tffs0")
Q:
ipAttach 接口作用以及如何加入组件?
A:
主要是建立ip协议栈与mux接口之间的关系?
Q:
怎么修改vxWorks编译固定库文件?
A:
The makefile provides a mechanism that allows you to use the local copy instead
of the common version. The following macros designate a private copy of the
related files:
For example, to use a private version of usrConfig.c, set the macro USRCONFIG to
usrConfig.c in Makefile as follows:
USRCONFIG = usrConfig.c
Q:
vxWorks target.reg使用什么标记语言?
A:
target.ref uses the apigen markup language
Q:
VxWorks outConsole 可以用于早期打印调试
A:
Q:
vxworks 预处理分析
A:
When building a VxWorks image, many compile-time macros are expanded, and
it is sometimes difficult to know what the actual numeric values of these macros
are and which branch of conditionally compiled code is being used. The bootrom
code, in particular, contains many conditional compilations. One way to find this
information is to retrieve the post-processed compiler output.
To retrieve the post-processor output for a given object module, use the following
command:
make ADDED_CFLAGS=-E file.o > file.i
Next, remove all of the lines starting with # and all blank lines
Q:
vxWorks 怎么判断一个任务是否存在,以及怎么根据任务名称过去ID,以及A任务如何等待任务B的结束?
A:
示例为根据等待任务名为"taskIde"结束
if(taskIdVerify(taskNameToId("taskIde")) != ERROR)
{
taskWait(taskNameToId("taskIde"),sysClkRateGet()*2);
}
Q:
workbench怎么在工程文本中加入路径等
A:
*.mk
_USER_CFLAGS = -I $(BSP_DIR)/net/mii -I $(BSP_DIR)/appDrivers -I $(BSP_DIR)/lib_utils -I $(BSP_DIR)/SRIO -I $(BSP_DIR)/net -I $(BSP_DIR)/mv88e6xxx -I $(BSP_DIR)/net -I $(BSP_DIR)/net/linux_mv88e6xxx -I $(BSP_DIR)/net/gtLib
.wpj
<BEGIN> BUILD_default_MACRO__USER_CFLAGS
-I \
$(BSP_DIR)/net/mii \
-I \
$(BSP_DIR)/appDrivers \
-I \
$(BSP_DIR)/lib_utils \
-I \
$(BSP_DIR)/SRIO \
-I \
$(BSP_DIR)/net \
-I \
$(BSP_DIR)/mv88e6xxx \
-I \
$(BSP_DIR)/net \
-I \
$(BSP_DIR)/net/linux_mv88e6xxx \
-I \
$(BSP_DIR)/net/gtLib
<END>
Q:
vxWorks 如何格式化EMMC设备?
A:
Q:
workbench 中如何更换 image project bsp?
A:
Q:
nfsmaxPath undefined sybmol
A:
关于出现找不到 nfsmaxPath符号表示因为,未定制nfs 客户端与核心组件
IMPORT int nfsMaxPath; /* max. length of file path */
Q:
vxWorks如何将RTC时间转化成时间戳,然后写入系统时钟?
A:
参考P2020将时钟写进系统时间中,注意vxWorks 中mktime函数存在问题
Q:
vxWorks底层接收MAC数据?
A:
Q:
如何指定让ping的数据包从哪个网口发送出去?
A:
windows: ping -s 192.168.5.84 192.168.5.81
vxworks : ping "-S 192.168.5.82 192.168.5.84" (-I 可指定网口名)
Q:
vxWorks如何 去掉 读秒
A:
修改启动参数
flags =0x8
Q:
内存分析需要添加的组建 Target 0x02b1cad0 for vector 714 out of range
A:
解决方案:
- In operating system components / kernel components / : you must include the component "Allow 32-bits branches to handlers"
- In operating system components / real time process components / : you must include the component "shared data region support in RTPs or kernel"
Q:
vxWorks 常见的内存分配疑问?
A:
Q:
vxWorks 怎么建立RAM/MEM文件系统
A:
ramDrv 需要添加组件ram disk driver 和xbd ram disk driver
在代码自己添加内存文件系统
BLK_DEV * pBlkDev1;
pBlkDev1 = ramDevCreate((char *) sysMemTop(), 512, 32768, 32768, 0);
xbdBlkDevCreateSync(pBlkDev1, "/ram");
dosFsVolFormat ("/ram:0", DOS_OPT_BLANK, NULL);
BLK_DEV * pBlkDev2;
pBlkDev2 = ramDevCreate((char *) (sysMemTop()+0x1000000), 512, 32768, 32768, 0);
xbdBlkDevCreateSync(pBlkDev1, "/ram1");
dosFsVolFormat ("/ram1:0", DOS_OPT_BLANK, NULL);
MEM文件系统:添加memLib 需要添加组件MEM disk driver
memDrv 即可flash也可内存,ramDrv只能用途内存
DOS_OPT_BLANK = 2
总结:
Q:
怎么获取vxWorks系统的版本信息?
A:
如何在vxWorks bootrom添加devs命令?
Q:
Nandflash page / block相关的信息?
A:
NandFlash页的概念 page: 一个page大小为2K + 64bytes, 如上图所示,其中的64bytes是所在页的infomation, 记录着此页的使用情况,比如剩余存空间等.
block: 一个block由64个页组成, 一个nandflash芯片由2k个block组成,算算就知道,一个nandflash芯片一共能存储256M的数据.
Q:
驱动关于调试打印控制的问题?
A:
#ifdef MHAL_ETH_DEBUG_ON
#define LOG_LVL 7
#define WARN_LVL 3
#define ERROR_LVL 1
#define NONE_LVL 0
LOCAL int mhalEthernetDgbLvl = NONE_LVL;
#define MHAL_ETH_DBG_MSG(level, fmt, a1, a2, a3, a4, a5, a6) \
do{ \
if(mhalEthernetDgbLvl >= level) \
logMsg(fmt,(int)(a1),(int)(a2),(int)(a3),\
(int)(a4),(int)(a5),(int)(a6)); \
}while ((0))
#else
#define MHAL_ETH_DBG_MSG(level,fmt,a1,a2,a3,a4,a5,a6)
#endif /* MHAL_ETH_DEBUG_ON */vel,fmt,a1,a2,a3,a4,a5,a6)#endif /* MHAL_ETH_DEBUG_ON */
Q:
workbench中usrConfig.c 与 prjConfig.c之间的关系?
A:
Q:
有的vxWorks 镜像为啥 通过FTP启动后,ls会出现 "cannot open (null)"?
A:
Q:
关于workbench编译时为啥会出现找不到sysAmpCpuPrep的符号表?
当前原因是因为配置文件中包含了WRLoad组件,去掉即可。
A:
Q:
vxWork 若需要将用户空间的地址与内核空间的地址分开,该怎么做?
A:
这部分和 RTP 组件以及虚拟化内存组件相关
Q:
vxWorks flag 参数配置
A:
flags (f)
一些标志位的集合,每个标志代表一个特殊的选项。这些标志定义如下:
0x01 = 即使processor number为0,也不要激活系统控制器。(这个其实是由使用的板子解释的,所以应参考目标板子的资料)
0x02 = 载入所有VxWorks符号表,而不只是全局部分。
0x04 = 不要自动引导
0x08 = 快速自动引导,也就是自动引导前等的时间短一些。
0x20 = 禁用安全登录。
0x80 = 用TFTP(而不是FTP)来引导。
0x400 = 调试模式。
Q:
如何查看vxWorsk tffs文件系统的映射地址
A:
Q:
VxWorks 如何产生map文件?
A:
workbench怎么生成带debug调试信息的bootrom
ADDED_CFLAGS += -g -O
如何判断elf文件是否包含调试信息
Q:
vxWork 怎么链接静态库全部符号表到kernel image?
测试发现static kernel library 链接到kernel image 时只会链接使用到的函数文件
所以采用Relinkable kernel Module,其实就是DKM工程
A:
Q:
WRS_ASM("isync")的作用?
A:
关注本公众号
掌握更多行业动态
打开公众号名片点击关注
联系客服