当前位置:文档之家› vxWorks编程精要

vxWorks编程精要

vxWorks编程精要
vxWorks编程精要

VxWork介绍及编程

https://www.doczj.com/doc/819143276.html,/drew/mypage/VxWorks.htm

一.嵌入式操作系统VxWorks简介

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。

WindRiver公司网址

实时操作系统和分时操作系统的区别

从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。

分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。这样的系统无法实时响应外部异步事件。

实时操作系统能够在限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。分时系统主要应用于科学计算和一般实时性要求不高的场合。实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。VxWorks的特点

可靠性

操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。而稳定、可靠一直是VxWorks的一个突出优点。自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。

实时性

实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。

VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。VxWorks 提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。

可裁减性

用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使用。

VxWorks 由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。VxWorks 内核最小为8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。

对一个实时内核的要求

一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括:

多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。多任务

提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。系统内核分配CPU给这些任务来获得并发性。

抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配CPU资源。换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。

任务间的通讯与同步:在一个实时系统中,可能有许多任务作为一个应用的一部分执行。系统必须提供这些任务间的快速且功能强大的通信机制。内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。

任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。所以需要杂任务级和中断级之间存在通信。

二.系统编程方法

了解系统编程对程序员来说尤为重要。根据Drew个人的经验基本上操作系统编程都是类似的,认真读懂一种,就很容易的理解另一种。

下面是Drew翻的VxWorks programmer guide中的基本内容,有一些内容是Drew个人的理解。理解这些内容对实时操作编程非常重要。

实时系统主要包括:多任务调度(采用优先级抢占方式),任务间的同步和进程间通信机制。一个多任务环境允许实时应用程序以一套独立任务的方式构筑,每个任务拥有独立的执行线程和它自己的一套系统资源。进程间通信机制使得这些任务的行为同步、协调。wind使用中断驱动和优先级的方式。它缩短了上下文转换的时间开销和中断的时延。在VxWorks 中,任何例程都可以被启动为一个单独的任务,拥有它自己的上下文和堆栈。还有一些其它的任务机制可以使任务挂起、继续、删除、延时或改变优先级。

另一个重要内容是:硬件中断处理。硬件产生中断,统治系统调用相应的中断历程(ISR),位是系统得到尽快的响应,ISR在它自己独立的上下文和堆栈中运行.它的优先级高于任何任务优先级.

Task State Transitions

中断延迟(Interrupt Latency) 中断延迟是指从硬件中断发生到开始执行中断处理程序第一条

指令之间的这段时间。

优先级驱动(Priority-Driven) 优先级驱动是指多任务系统中,当前运行任务总是具有最高优先级的就绪任务。

多任务调度

两种方式: 优先抢占和轮转调度(Preemptive Priority,Round-Robin Scheduling).

优先抢占(Preemptive Priority): 每一个任务都有一个优先级,系统核心保证优先级最高的任务运行于CPU.如果有任务优先级高于当前的任务优先级,系统立刻保存当前任务的上下文,切换到优先级高的上下文.

Priority Preemption

抢占(Preemptive): 抢占是指当系统处于核心态运行时, 允许任务的重新调度。换句话说就是指正在执行的任务可以被打断,让另一个任务运行。抢占提高了应用对异步事件的响应性能力。操作系统内核可抢占,并不是说任务调度在任何时候都可以发生。例如当一个任务正在通过一个系统调用访问共享数据时,重新调度和中断都被禁止.

任务上下文(Task Context): 任务上下文是指任务运行的环境。例如,针对x86的CPU,任务上下文可包括程序计数器、堆栈指针、通用寄存器的内容.

上下文切换(Context Switching): 多任务系统中,上下文切换是指CPU的控制权由运行任务转移到另外一个就绪任务时所发生的事件,当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。上下文的内容依赖于具体的CPU.

轮转调度(Round-Robin Scheduling):使所有相同优先级,状态为ready的任务公平分享CPU(分配一定的时间间隔,使个任务轮流享有CPU).

Round-Robin Scheduling

系统由256个优先级,从0到255,0为最高,255为最低. 任务在被创建时设定了优先级.也可用taskPrioritySet ( ) 来改变任务优先级.

任务的主要状态: READY,PEND,DELAY,SUSPEND...

ready-------->pended -----------semTake()/msgQReceive()-其他任务

ready-------->delayed-----------taskDelay()

ready-------->suspended---------taskSuspend()

pended------->ready-------------semaGive()/msgQSend()-其他任务

pended------->suspended---------taskSuspend()

delayed------>ready-------------expired delay

delayed------>suspended---------taskSuspend()

suspended---->ready-------------taskResume()/taskActivate()

suspended---->pended------------taskResume()

suspended---->delayed-----------taskResume()

轮转调度(Round-Robin): 轮转调度可以扩充到优先抢占方式中,当多个任务优先级相同的情况下,轮转调度算法使任务按平等的时间片运行于CPU,共享CPU.避免一个任务长时间占用CPU,而导致其他任务不能运行.可以用kernelTimeSlice() 来定义时间长度.

taskLock ( )和taskUnlock ( ) 用来取消优先抢占方式和恢复优先抢占方式.

注意: 一个任务可以调用taskDelete ( ) 删除另一个任务,但是如果一个当前正在运行的任务被删除后,该任务的内存没有释放,而其他任务不知道,依然在等待,结果导致系统stop.用taskSafe ( ) 和taskUnsafe ( ) 来保证正在运行的任务不被删除.

用法如下:

taskSafe ();

semTake (semId, WAIT_FOREVER);

/* Block until semaphore available */

. .. .critical region .

semGive (semId);semGive (semId);

/* Release semaphore */

taskUnsafe ();

任务间的同步和进程间协调

信号量作为任务间同步和互斥的机制。在wind 核中有几种类型的信号量,它们分别针对不同的应用需求:二进制信号量、计数信号量、互斥信号量和POSIX 信号量。所有的这些信号量是快速和高效的,它们除了被应用在开发设计过程中外,还被广泛地应用在VxWorks 高层应用系统中。对于进程间通信,wind 核也提供了诸如消息队列、管道、套接字和信号等机制。

任务间的同步和进程间协调的几种方式:

内存共享(Shared Memory),对简单的数据共享而言.

信号量(Semaphore),基本的互斥和同步.

消息队列(Message queues)和管道(Pipe),单个CPU中,任务间的信息传递.

套结字(Socket)和远程调用(Remote procedure calls),相对于网络任务间的通信.

信号(Signals),出错处理(Exception handling).

内存共享(Shared Memory)

任务间通信最通常的方式是通过共享的数据结构进行通信,因为所有VxWorks的任务存在于一个单一的线性地址空间,任务间共享数据。全局变量、线性队列、环形队列、链表、指针都可被运行在不同上下文的代码所指向。

Shared Data Structures

互斥(Mutual Exclusion)

互斥是用来控制多任务对共享数据进行串行访问的同步机制。在多任务应用中,当两个或多个任务同时访问共享数据时,可能会造成数据破坏。互斥使它们串行地访问数据,从而达到保护数据的目的.

解决互斥的几种方法:

1. 关闭中断的方法(intLock): 能解决任务和中断ISR之间产生的互斥.

funcA ()

{ int lock = intLock();

. . critical region that cannot be interrupted .

intUnlock (lock); }

但在实时系统中采取这个办法会影响系统对外部中断及时响应和处理的能力.

2. 关闭系统优先级(taskLock): 关闭系统优先级,这样在当前任务执行时,除了中断外,不会有其他优先级高的任务来抢占CPU,影响当前程序运行.

funcA ()

{ taskLock ();

. . critical region that cannot be interrupted .

taskUnlock (); }

这种方法阻止了高优先级的任务抢先运行,在实时系统中也是不适合的,除非关闭优先级的时间特别短.

信号量(Semaphore): 信号量是解决互斥和同步协调进程最好的方法

VxWorks信号量提供最快速的任务间通信机制,它主要用于解决任务间的互斥和同步。针对不同类型的问题,有以下三种信号量:

?二进制信号量(binary)使用最快捷、最广泛,主要用于同步或互斥;

?互斥信号量(mutual exclusion) 特殊的二进制信号量,主要用于优先级继承、安全删除和回溯;

?计数器信号量(counting) 和二进制信号量类似,保持信号量被释放(gaven)的次数,主要用于保护一个资源的多个例程(multiple instances of a resource)

信号量控制,函数介绍:

semBCreate( ) 分配并初始化一个二进制信号量

semMCreate( ) 分配并初始化一个互斥信号量

semCCreate( ) 分配并初始化一个计数信号量

semDelete( ) 终止一个自由的信号量

emTake( ) 占有一个信号量

semGive( ) 释放一个信号量

semFlush( ) 解锁所有等待信号量的任务

semBCreate( ), semMCreate( ), and semCCreate( )返回一个信号量ID作为其它后续任务使用该信号量的的句柄。当一个信号量被创建,它的队列(queue)类型就被确定。等待信号量的任务队列以优先级的高低排列(SEM_Q_PRIORITY),或者一先到先得的方式排列(SEM_Q_FIFO).

当一个Semaphore创建时,指定了任务队列的种类

semBCreat( SEM_Q_PRIORITY, SEM_FULL), SEM_Q_PRIORITY 指明处于等待状态的任务在等待队列中以优先级的顺序排列

semBCreat(SEM_Q_FIFO,SEM_FULL), SEM_Q_FIFO指明处于等待状态的任务在等待队列中以先进先出的顺序排列

二进制信号量(binary)

Taking a Semaphore

Giving a Semaphore

互斥进程(Mutual Exclusion)

互斥信号量有效的内锁对共享资源的进入,与屏蔽中断(disabling interrupts)和优先级锁定(preemptive locks)相比,二进制信号量将互斥的范围限制在仅与其有关的资源上。从技术上说,创建一个信号量来保护(guarding)资源。信号量初始化位可用的(FULL)。

当一个Semaphore创建时,指定了这个semaphore是用在解决互斥还是用来同步任务semBCreat( SEM_Q_FIFO, SEM_FULL) , SEM_FULL 指明用于任务间互斥.

SEM_ID semMutex;

semMutex = semBCreate (SEM_Q_PRIORITY, SEM_FULL);

当一个任务要进入资源,首先要得到一个信号量(take that semaphore),只要有任务在使用这个信号量,其它的要进入资源的任务要停止执行(blocked from execution),当这个任务完成了对资源的使用,它会释放信号量,允许另一个任务来使用资源。

semTake (semMutex, WAIT_FOREVER);

. . critical region, only accessible by a single task at a time .

semGive (semMutex);

同步协调进程(Synchronization)

semBCreat(SEM_Q_FIFO,SEM_EMPTY), SEM_EMPTY 指明用于任务间同步.

/* includes */

#include "vxWorks.h"

#include "semLib.h"

SEM_ID syncSem;

/* ID of sync semaphore */

init ( int someIntNum )

{ /* connect interrupt service routine */

intConnect (INUM_TO_IVEC (someIntNum), eventInterruptSvcRout, 0);

/* create semaphore */

syncSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);

/* spawn task used for synchronization. */

taskSpawn ("sample", 100, 0, 20000, task1, 0,0,0,0,0,0,0,0,0,0);

}

task1 (void)

{ ...

semTake (syncSem, WAIT_FOREVER);

/* wait for event to occur */

printf ("task 1 got the semaphore\n");

...

/* process event */

}

eventInterruptSvcRout (void)

{ ...

semGive (syncSem);

/* let task 1 process event */

...

}

semTake(semID,time out)--------有Semaphore空闲,就Take, 如果没有,由time out 定,超时则向下执行

互斥信号量

互斥信号量是一个特殊的二进制信号量,设计用于优先级继承,安全删除和回归。

互斥信号量的使用基本和二进制信号量是类似的。但有以下不同:

仅仅被用做互斥。

只能被使用它的任务释放.(It can be given only by the task that took it.)

ISR 不能释放它。

不能使用函数semFlush( )。

优先级反转(Priority Inversion)

优先级反转是指一个任务等待比它优先级低的任务释放资源而被阻塞,如果这时有中等优先级的就绪任务,阻塞会进一步恶化。优先级继承技术可用来解决优先级反转问题。

Priority inversion arises when a higher-priority task is forced to wait an indefinite period of time for a lower-priority task to complete.

优先级继承(Priority Inheritance)

优先级继承可用来解决优先级反转问题。当优先级反转发生时,优先级较低的任务被暂时地提高它的优先级,使得该任务能尽快执行,释放出优先级较高的任务所需要的资源。Priority Inheritance

The mutual-exclusion semaphore has the option SEM_INVERSION_SAFE, which enables a priority-inheritance algorithm. The priority-inheritance protocol assures that a task that owns a resource executes at the priority of the highest-priority task blocked on that resource. Once the task priority has been elevated, it remains at the higher level until all mutual-exclusion semaphores that the task owns are released; then the task returns to its normal, or standard, priority. Hence, the "inheriting" task is protected from preemption by any intermediate-priority tasks. This option must be used in conjunction with a priority queue (SEM_Q_PRIORITY).

计数信号量(Counting Semaphores)

计数信号量是任务同步和互斥的另一种实现方式.计数信号量除了保留信号量被释放的次数以外和二进制信号量是一样的。每次信号量被释放(gaven)一次,计数增加;每次信号量被占用(taken)一次,计数减少;当计数减少为0时,要求得到信号量的任务被阻塞(blocked)。二进制信号量是如果一个信号量被释放,有一个任务阻塞等待,则这个任务就被unblock.而计数信号量如果一个信号量被释放,没有任务阻塞等待,则计数增加。这说明一个被释放两次的计数信号量可以被占用(taken)两次,没有阻塞。

Counting semaphores are useful for guarding multiple copies of resources. For example, the use of five tape drives might be coordinated using a counting semaphore with an initial count of 5, or a ring buffer with 256 entries might be implemented using a counting semaphore with an initial count of 256. The initial count is specified as an argument to the semCCreate( ) routine. Counting Semaphore Example

Semaphore Call Count after Call Resulting Behavior

semCCreate( ) 3 Semaphore initialized with initial count of 3.

semTake( ) 2 Semaphore taken.

semTake( ) 1 Semaphore taken.

semTake( ) 0 Semaphore taken.

semTake( ) 0 Task blocks waiting for semaphore to be available.

semGive( ) 0 Task waiting is given semaphore.

semGive( ) 1 No task waiting for semaphore; count incremented.

消息队列(Message queues)

现实的实时应用由一系列互相独立又协同工作的任务组成。信号量为任务间同步和联锁提供了高效机制。在VxWorks中,用于但一CPU任务之间通信主要(primary)的机制是消息队列。

Full Duplex Communication Using Message Queues

消息队列允许一定数量不同长度的消息进行排列。任何任务或中断服务程序(ISR)能够发送消息给消息队列。任何任务可以从消息队列接受消息。多任务可以从同意消息队列发送和接受消息。两个任务之间的全双工(Full-duplex)通信需要针对不同方向的两个消息队列。消息队列函数介绍

msgQCreate( ) 创建斌初始化一个消息队列

msgQDelete( ) 终止并释放一个消息队列

msgQSend( ) 发送一个消息到消息队列

msgQReceive( ) 从消息队列接受一个消息

消息队列是由函数msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY)创建。它的参数MAX_MSGS指定了消息队列中可允许最多可以排列的消息数和每个消息允许的最大的字节数MAX_MSG_LEN。

一个任务或中断服务程序(ISR)用函数msgQSend( )发送一个消息到消息队列。如果没有任务等待消息队列的消息,这个消息被添加消息缓存的队列里。如果某些任务已经在等待消息队列中的消息,消息立刻被传递给第一个等待的消息的任务。

一个任务用函数msgQReceive( )从消息队列得到一个消息。如果消息队列缓存中有消息存在,第一个消息立刻出列并回到调用处(caller).如果没有消息存在,则任务(calling task)停止(blocks)并被添加到等待消息的任务队列中。这个等待的任务队列按照优先级或先进先出(FIFO)规则排列,这个规则有消息队列创建时所指定。

等待时间限制(time out)

msgQSend( ) 和msgQReceive( )都有时间限制参数。当发送一个消息,如果消息队列缓存这时没有空间,这个参数指定允许等待的时间(ticks数),直到队列缓存有空间来接收消息。当接收消息时,如果消息队列没有消息,这个参数指定允许等待的时间(ticks数),直到消息队列有消息。

/* In this example, task t1 creates the message queue and sends a message

* to task t2. Task t2 receives the message from the queue and simply

* displays the message.

*/

/* includes */

#include "vxWorks.h"

#include "msgQLib.h"

/* defines */

#define MAX_MSGS (10)

#define MAX_MSG_LEN (100)

MSG_Q_ID myMsgQId;

task2 (void)

{

char msgBuf[MAX_MSG_LEN];

/* get message from queue; if necessary wait until msg is available */

if (msgQReceive(myMsgQId, msgBuf, MAX_MSG_LEN, WAIT_FOREVER) == ERROR) return (ERROR);

/* display message */

printf ("Message from task 1:\n%s\n", msgBuf);

}

#define MESSAGE "Greetings from Task 1"

task1 (void)

{

/* create message queue */

if ((myMsgQId = msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY)) == NULL)

return (ERROR);

/* send a normal priority message, blocking if queue is full */

if (msgQSend (myMsgQId, MESSAGE, sizeof (MESSAGE), WAIT_FOREVER,

MSG_PRI_NORMAL) == ERROR)

return (ERROR);

}

管道(Pipes)

管道对消息队列提供了一个可供选择的接口,VxWorks的I/O系统。管道是虚拟的I/O设备,

由驱动pipeDrv管理。函数pipeDevCreate()创建一个管道设备,这个调用指定管道的名字,

能被排列的最多的消息数,和每个消息允许的长度。

status = pipeDevCreate ("/pipe/name", max_msgs, max_length);

被创建的管道是一个通常命名(named)的I/O设备,任务能用标准的I/O函数打开,读,写管

道,并能调用ioctl例程。当任务试图从一个空的管道中读取数据,或向一个满的管道中写

入数据时,任务被阻塞。和消息队列一样,ISR可以向管道写入,但不能从管道读取。

做为I/O设备,管道提供了消息队列所没有的重要特性,调用select()

VxWorks基本概念及常见问题

(Drew 在开发过程中对下面概念的理解)

Bootrom和Boot image的区别,Boot image和VxWorks image的联系和区别

bootrom 是指on-chip bootrom,在CPU芯片内部,内嵌有小的boot程序(bootloader),类似于PC机主板上的BIOS的存储区域。和boot image不是一回事。VxWorks文档中的bootrom区是指boot image存放的位置。

boot image的作用是把VxWorks image 加载到主板。boot image只初始化很少的硬件系统如串口,网口等。为加载VxWorks image做准备,当VxWorks系统下载完毕后,boot image的作用也就完成了。

VxWorks image含有完整的VxWorks OS。是真正运行于目标板上的操作系统。应用程序运行于VxWorks系统之上。

boot image 和VxWorks image生成在使用BSP文件上的区别在于:在启动顺序中Bootrom调用bootConfig.c,而VxWorks调用usrConfig.c.

在ROM中vxworks运行的方式(和bootrom编译到一起还是单独固化到ROM中),在ROM中的内存分配?VxWorks加载到主板运行,分不同的情况,如果VxWorks是压缩的,加载时解压到RAM的RAM_HIGH_ADRS.

如果是ROM based VxWorks,VxWorks image的data段复制到RAM的LOCAL_LOW_ADRS, text部分留在ROM并在ROM中执行。

既不压缩又不ROM based的VxWorks直接copy到RAM_LOW_ADRS运行。

若在config.h中修改系统设置,如增加网卡等,是否需要重新烧bootrom?如果增加其他oem产品呢?

如果主板中有Boot image存在则不需要重新烧,用FTP等download加载VxWorks即可。

VxWorks 系统编程中任务级与中断级的通讯如何实现?

中断是由硬件触发,软件的作用只是将中断服务例程(ISP)与中断事件连接起来.

1.使能中断,函数intEnable().

2.用intConnect()登记中断号,和相应的中断例程ISR.

这样一旦有中断发生,系统自动跳转到相应位置执行ISR.

Bootloader怎么得到,如果对开发板有些改动,还能使用开发板的bootloader吗?bootloader起到什么作用?

Bootloader相当于PC机主板上的BIOS,是最底层的引导软件,初始化主板的基本设置,为接收外部程序做硬件上的准备.

有些bootloader已经嵌在CPU内了,没有bootloader的CPU可以在片外的eeprom内做bootloader,也可以不要bootloader,直接通过JTAG口灌入程序,开发板改动基本上不会影响bootloader.

VxWorks 应用程序编译下载时常见问题及原因分析

Tornado环境下编译产生的错误:标准C函数或自己的函数,变量不认识(undefined symbol),编译失败。Tornado支持c 和 c++ ,文件后缀为.cpp时编译器会认为是c++文件,这样有些定义类型为C的函数在编译或下载时不被认可。

解决方法是 1.把如果在c++文件(.cpp)中调用c函数,应该把这些不被认可的c类型函数用语句extern "C"说明一下为c函数。

另外,如果将c文件的后缀小写的.c误写为大写的.C,也会出同样的错误,编译时不会编译这个文件。

Tornado环境应用程序下载产生的错误:函数不认识(undefined symbol),下载失败。

虽然编译通过,可是下载时依然会有这样的问题,仍然是函数或变量没有定义。系统不认识,这是出错的原因基本上时没有定义的错误。查找包含函数或变量的头文件是否加了进去。如果实在找不到定义的话,简单的办法是先把这他们去掉(当然是没有其他地方用到的情况下)试一试,先down下去,能运行后,然后添加,再继续查找。

在ARM下不用Boot image,直接烧入VxWorks image的过程

有些ARM CPU一般分两种运行方式,一种是Boot方式,一种是normal方式。

在Boot方式下直接烧写VxWorks image到Flash, 这种VxWorks image包含有boot的功能(类似VxWorks.rom 形式),中间那段烧写到flash的程序是必须的,第一次通过串口下载VxWorks image到Dram是一个简单的过渡,有boot loader控制。

当烧写完成后,切换CPU到normal模式,系统启动,开始逐行读Flash中的指令,是由VxWorks BSP控制,根据不同的VxWorks image定义,执行不同的操作,例如若VxWorks是压缩的,则解压复制到DRAM的高位地址,...。

VxWorks image 和Boot image中的两次硬件初始化之间的区别

Boot image和VxWorks image都对硬件进行了初始化。两次硬件初始化的是不同的。

BootRom映像主要作用是通过网口或串口下载VxWorks系统,所以它只是初始化很少的硬件系统如串口,网口等来满足下载VxWorks的需要,一旦VxWorks下载完毕。这些初始化过的硬件的作用也就完成了。

VxWorks启动后会从新对几乎所有的硬件设备进行完全的初始化来满足VxWorks操作系统运行的需要。

汇编语言在VxWorks系统编程的使用:

汇编语言主要出现在BSP文件roInit.s,sysAlib.s等,这些汇编指令是系统初始化硬件用的,硬件系统Power up 时硬件特别是内存没有初始化,C函数库没有装入内存,系统此时不支持C语言程序,只支持它自己的32位汇编指令,所以只能用汇编指令来初始化硬件,为后续的操作系统包括C语言支持做准备.在OS正常运行后,就可以用C了.

Tornado不支持汇编指令,

汇编在编译连接BSP,生成bootrom或VxWorks映像,才被编译.有两种方法:

1.现在可以在Tornado环境下生成bootrom或建 Bootable 的 project 生成 VxWorks

2.传统的方法,在命令行方式,用make编译生成.

在Tornado下的downloadable的project,application中不能用汇编.

不过一般汇编很少用.

可以与其他bsp文件在tornado下作成bsp或用命令行make.

VxWorks 下写驱动需注意的问题

1。MMU 对该硬件的地址映射正确(改 BSP )

2。中断向量表该中断的定义位置,知道相应中断的中断标志位等信息(改 BSP )

3。查出中断号及中断级别,硬件中断登记(INTCONNECT ),及 ISR

4。系统任务协调,保证在该程序执行时,没有其它任务占用 CPU

BSP 概念解析

Drew在这里按照自己的理解来解释一下BSP( Board Support Package),仅供

参考:

BSP是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操

作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主

板。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,

例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,

可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形

式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改)。这样才能与上层OS保持正确的接口,良好的支持上层OS。

例如:

在VxWorks中的网卡驱动,首先在config.h中包含该网卡,然后将网卡含网卡的信息的参数放入数组END_TBL_ENTRY endDevTbl []中,系统通过函数muxDevLoad( )调用这个数组来安装网卡驱动。

而在Linux中的网卡驱动,是在space.c中声明该网络设备,再把网卡驱动的一些函数加到dev结构中,由函数ether_setup()来完成网卡驱动的安装。

纯粹的BSP所包含的内容一般说来是和系统有关的驱动和程序,如网络驱动和系统中网络协议有关,串口驱动和系统下载调试有关等等。离开这些驱动系统就不能正常工作。

Tornado中BSP的编译和上层应用程序不同,用命令行或直接在Tornado环境下Build,在Tornado下不能跟踪调试。

用户也可以添加自己的程序到BSP中,但严格来说不应该算BSP.一般来说这种做法不建议。因为一旦操作系统能良好运行于最终的主板硬件后,BSP也就固定了,不需要做任何改动。而用户自己在BSP中的程序还会不断的升级更新,这样势必对BSP有不好的影响,对系统造成影响,同时由于BSP调试编译环境较差,也不利于程序的编译调试。

BSP在嵌入式系统和Windows系统中的不同

其实运行与PC机上的windows或linux系统也是有BSP的。只是PC机均采用统一的X86体系架构,这样一定操作系统(windows,linux..)的BSP相对x86

架构是单一确定的,不需要做任何修改就可以很容易支持OS在x86上正常运行,所以在PC机上谈论BSP这个概念也没什么意义了。

而对嵌入式系统来说情况则完全不同,目前市场上多种结构的嵌入式CPU (RISC)并存(PPC,ARM,MIPS....),为了性能的需要,外围设备也会有不同的选择和定义。一个嵌入式操作系统针对不同的CPU,会有不同的BSP,即使同一种CPU,由于外设的一点差别(如外部扩展DRAM的大小,类型改变),BSP相应的部分

也不一样。

所以根据硬件设计编写和修改BSP,保证系统正常的运行是非常重要的。BSP和PC机主板上的BIOS区别

BSP和PC机主板上的BIOS区别很大,BIOS主要是负责在电脑开启时检测、初始化系统设备(设置栈指针,中断分配,内存初始化..)、装入操作系统并调度操作系统向硬件发出的指令,它的Firmware代码是在芯片生产过程中固化的,一般来说用户是无法修改。其实是为下载运行操作系统做准备,把操作系统由硬盘加载到内存,并传递一些硬件接口设置给系统。在OS正常运行后,BIOS的作用基本上也就完成了,这就是为什么更改BIOS一定要从新关机开机。

PC机BIOS的作用更象嵌入式系统中的Bootloader(最底层的引导软件,初始化主板的基本设置,为接收外部程序做硬件上的准备)。与Bootloader不同的是BIOS在装载OS系统的同时,还传递一些参数设置(中断端口定义,...),而Bootloader只是简单的装载系统。

BSP是和操作系统绑在一起运行在主板上的,尽管BSP的开始部分和BIOS所做的工作类似,可是大部分和BIOS不同,作用也完全不同。此外BSP还包含和系统有关的基本驱动(串口,网口...),此外程序员还可以编程修改BSP,在BSP

中任意添加一些和系统无关的驱动或程序,甚至可以把上层开发的统统放到BSP 中。

而BIOS程序是用户不能更改,编译编程的,只能对参数进行修改设置。更不会包含一些基本的硬件驱动。

BSP在嵌入式开发中的位置和作用

BSP开发处于整个嵌入式开发的前期,是后面系统上应用程序能够正常运行的保证。

大概步骤如下:

1.硬件主板研制,测试。

2.操作系统的选定,BSP编程。

3.上层应用程序的开发。

BSP部分在硬件和操作系统,上层应用程序之间。所以这就要求BSP程序员对硬件,软件和操作系统都要有一定的了解。这样才能做好BSP编程。

熟悉工具方面:电表,示波器,逻辑分析仪。硬件仿真器,仿真调试环境。

语言方面:汇编语言,C语言。

VxWork BSP 和启动过程

开发BSP主要的两点:

1.系统image的生成,image的种类,image的download下载过程,系统的启

动顺序和过程,调试环境的配置及远端调试的方式和方法,相应BSP设置

文件的修改(网络,串口..),BSP各文件的组成和作用.

2.要对系统底层驱动清楚,也就是对CPU及相关的硬件有所了解.主要是32

微处理器(上电启动过程, download image的方式方法,读写ROM,地址空

间分配,MMU,寄存器,中断定义,..).参照硬件资料,多读一些源码会有所

帮助.

Tornado 2 开发调试环境协议框图

主机开发(Host Development System)目标机(Target System)

WDB协议通信

<==========>

两个主要两个协议

C++ builder 中关于窗体的一些操作

C++ builder 中关于窗体的一些操作(总在最前,遍历控件...) 一、让窗口总是在最前面 Form 的FormStyle属性设置为fsStayOnTop值。 二、动态调用窗体Form 在缺省情况下,由File/New Form生成添加入项目文件中的窗体都具有"Auto Create"(自动创建)的特性。即只要程序运行,该窗体就存在于内存中了,不管当前它是否被调用。具有这种特性的窗体一般适用于窗体属性比较固定、经常被调用的情况。其优点是速度快,缺点是占用内存。在实际程序设计中,会遇见大量类似对话框功能的窗体,它们用于显示状态或输入信息,仅须在程序中调用一下,完成其功能就行了,无需常驻内存。这时可以通过选择Project/Options/Forms,将"Auto--Create forms " 栏中相应的窗体, 如Form1,用" >" 键移动到"Available forms"栏中,并在程序需调用该窗体处,加入下列语句:TForm1 *myform=new TForm1(this); myform- >ShowModal(); delete myform; 窗体Form1仅是在需要调用时才调入内存,调用完成后,即用delete清除出内存。这样可减少程序对内存资源的占用。 三、遍历窗体控件的方法 要访问或修改窗体上的控件,方法很简单,以TEdit为例子: Edit1- >Text=""; Edit2- >Text=""; 但如果窗体上有十来个像Edit1 这样的控件,需要进行相同的初始化,用上面的方法一个一个地进行,岂不麻烦!所以有必要掌握遍历窗体控件的方法。在介绍该方法之前,让我们先了解一下窗体Form 的Components 和Controls 属性。参见表一。

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

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

vxWorks开发环境构建步骤及开发资源 技创科技(Technique Innovator Inc.) https://www.doczj.com/doc/819143276.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源码在编

vxWorks学习笔记

vxWorks学习笔记 vxWorks学习笔记 2006-07-20 11:141.VxWorks开发方式:交叉开发,即将开发分为主机(host)和目标机(target)两部分。 类似于dos下C语言程序的开发。 合并开发的优点:简单 缺点:资源消耗量大,CPU支持,非标准体系的支持 host (Tornado) target(vxWork) 小程序模块 vxWorks实际采用开发模式 Tornado提供:编辑,编译,调试,性能分析工具,是vxWorks 的开发工具 vxWorks:面向对象可以剪裁的实际运行操作系统 2.vxWorks启动方式 Rom方式(vxWork_rom) vxWorks直接烧入rom Rom引导方式(bootrom+vxWorks) 其中bootrom烧入rom,vxWorks可以通过从串口,网口,硬盘,flash等下载!这里的bootrom不是开发环境中的bootable,在开发环境里bootable指的是vxWorks,downloadable指application 3.调试

attach 用来在多任务调试时将调试对象绑定到某个任务 任务级调试(attach taskName) 单个任务的调试不会影响到其他任务的运行,主要用来调用户的应用程序。 全局断点:在调另一任务或本任务时,系统运行本任务断点,则停下。各任务要配合使用。 任务断点:调本任务时,系统运行到本任务断点,则停下。如果没有attach到本任务,不起作用。 一次性断点:跑到一次之后自动删除。 系统级调试(attach system) 把所有task和系统core、中断看成一个整体,可用于调试系统和中断。对中断调试,如果不是系统级调试,无论是那种断点都不起作用 !wdbAgent不在调试范围内,当任务级调试时工作在中断方式,系统级调试工作在轮询方式。 !可是使用命令行方式的调试,参看crossWind教程。 4.调度 优先级调度(无条件) 时间片:同优先级,如果时间片没有打开,任务采取先到先运行,运行完毕在交出cpu,如果打开,则轮流使用cpu。!死循环使比它优先级低的任务都不能运行。

vxworks653编程手册

一.V xWorks653运行时系统 1.1. 运行时层 一个vxworks653模块由下面四层组成: ■core OS—必需 ■partition—至少需要一个(vThreads 或COIL-based),每个都在一个分区的操作系统之中■APEX shared library—ARINC 653 应用所需 ■POSIX shared library—POSIX 应用所需 1.1.1.Core OS层 核心操作系统提供服务给分区。 缺省的,核心操作系统使用ARINC653规范中的时间抢占的调度(TPS)来调度分区。Vxworks653的核心操作系统还可以采用APPS调度策略在TPS调度的空闲时间内调度优先级

抢占调度(PPS)使能的分区。 核心操作系统提供给每个VThreads分区操作系统的服务包括: ●分区系统资源 ●调度分区 ●代表分区的操作系统执行trap异常 ●定义和强制分区边界 ●装载分区 ●使用端口和通道在分区间传递消息 ●处理I/O ●代表应用完成系统调用 ●支持分区的调试 ●监控分区和系统的健康 1.1. 2.vThreads 层 vThreads分区操作系统在核心操作系统分配给该分区的时间内调度vThreads中的线程。vThreads不直接与设备交互,而是通过核心操作系统的系统调用。 1.1.3.APEX 层 构建在vThreads之上,遵循ARINC653规范,并且提供相应功能和API。 1.1.4.POSIX层 构建在vThreads之上,遵循用于实时扩展的POSIX标准(1003.1b)。 1.2. 装载和启动 当目标板加电时,按照下面的步骤进行装载和启动 ●初始的启动码装载核心操作系统,分区操作系统,共享库,以及应用 ●核心操作系统初始化自身,启动它自己的子系统 ●核心操作系统创建分区 ●核心操作系统启动分区调度器,并且让应用初始化自身 核心操作系统可以在初始化完成之后下载在线装载的应用程序到分区。应用可以在分区运行之时装载到分区。

VxWorks操作系统RTP介绍和使用方法

VxWorks 操作系统RTP 介绍和使用方法 从VxWorks 6.x开始引入RTP(VxWorks real time process projec模t) 式编程,这种模式的优点是应用程序相互独立,互不影响,而且增加了内核的稳定性,缺点是由于“内核态”与“用户态”的内存拷贝,其执行效率有所降低,随着CPU 速度越来越快,这点效率的牺牲已经越来越不重要。相比较于传统的DKM (downloadable kernel module project ),RTP适合多个团队独立运作,然后汇总 联试,这种模式除了全局函数不能再shell 里直接调用外,其对应用程序几乎不 做任何约束,原有的DKM 工程代码稍作修改即可正常运行。内核变化较大,需 要添加较多的组件,内存需要较好的划分,为保持应用程序直接调用函数调试的 习惯,需要封装接口供用户使用。 现简单的介绍RTP使用方法,并给出demo 代码供参考。 1. 新建并编译工程: (1) File->new-> VxWorks real time process projec如t, 图【1】 图【1】 (2) 一路next 后,选择如图【2】所示的编译器

图【2】 (3) 选择Finish 后,工程新建完毕。 (4) 导入源文件:这里的源文件名称是fooRtpApp.c ,一种较快捷的方式是选 中新建的工程,按下F5,源文件会出现在工程中. (5) 右键选择编译,出现如图【3】,选择Continue 继续。 图【3】 编译完成后,会生成vxe 格式的可执行文件,此处为usrAppA.vxe 。 2. 下载可执行性文件 待板子启动后,使用ftp 将vxe 文件下载到板子中。步骤如下: (1)运行->cmd,打开对话窗口,如图【4】所示:

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

C builder教程大全

BorlandC++Builder5.0是Interpries(Borland)公司推出的基于C++语言的快速应用程序开发(RapidApplicationDevelopment,RAD)工具,它是最先进的开发应用程序的组件思想和面向对象的高效语言C++融合的产物。C++Builder充分利用了已经发展成熟的Delphi的可视化组件库(VisualComponentLibrary,VCL),吸收了BorlandC++5.0这个优秀编译器的诸多优点。C++Builder结合了先进的基于组件的程序设计技术,成熟的可视化组件库和优秀编译器,调试器。发展到5.0版本,C++Builder已经成为一个非常成熟的可视化应用程序开发工具,功能强大而且效率高。 C++Builder的特色: 1.C++Builder是高性能的C++开发工具 C++Builder是基于C++的,它具有高速的编译,连接和执行速度。同时,C++Builder具有双编译器引擎,不仅可以编译C/C++程序,还能编译ObjectPascal语言程序。 2.C++Builder是优秀的可视化应用程序开发工具 C++Builder是一完善的可视化应用程序开发工具,使程序员从繁重的代码编写中解放出来,使他们能将注意力重点放在程序的设计上,而不是简单的重复的劳动中。同时,它提供的完全可视的程序界面开发工具,从而使程序员对开发工具的学习周期大大缩短。 3.C++Builder具有强大的数据库应用程序开发功能 C++Builder提供了强大的数据库处理功能,它使的程序员不用写一行代码就能开发出功能强大的数据库应用程序,这些主要依赖于C++Builder众多的数据库感知控件和底层的BDE数据库引擎。C++Builder除了支持Microsoft的ADO(ActiveDataObject)数据库连接技术,还提供了一种自己开发的成熟的数据库连接技术——BDE(BorlandDatabaseEngine)数据库引擎。

VxWorks操作系统MakeFile

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

风河Workbench3.0_VxWorks6.6应用程序开发使用说明V1.0

说明:由于开发经验和英语水平有限,在本文档中肯定存在偏差和谬误。在有疑问的地方,请以风河的官方文档为准。欢迎联系,指正错误。QQ:1039309823。 风河Woorkbench3.0/VxWorks6.6使用说明 第一章工程视图(Projects Overview) Workbench利用工程( Projects)就像逻辑容器和积木块——它们能够连接在一起创建一个软件系统。工程( Projects)窗口可以直观地组织工程结构反映在内部的依赖关系上,以及编译和链接的次序。 前期配置的各种不同的工程允许在后面建立或添加工程时使用与之前的工程相同的配置和建立方式,因而只需要极小的输入。 一、Workspace/Project 的设置 Wind River Workbench并不知道使用者的源文件在哪一个地方,在开始的使用的时候Wind River Workbench在安装目录下有一个默认的工作空间(workspace )的目录。但是这不是必需的或者说并不一定是合理的,当使用者的工作空间因为产品升级或者更改安装目录已经完全存储在当前的安装目录树之外的时候! 通常,使用者需要把workspace目录设置在当前的源文件树的根目录下并且在此创建Workbench工程。对于各种不同的源文件树,可以使用不同的工作空间(workspaces)。 当决定在什么地方建立工程(projects)要做以下考虑: 1.在workspace建立工程 如果使用者想要新建一个工程在workspace下,通常的情况有 A.所建的工程还没有建立源文件。 B.所建的工程已经存在源文件,但需要添加进工程。 C.所建的工程不允许设置在源文件目录处。

cbuilder常用函数汇总

c b u i l d e r常用函数汇总 The Standardization Office was revised on the afternoon o f December 13, 2020

c++ builder 常用函数汇总 对话框类函数 打开对话框: if(OpenDialog1->Execute()) { Memo1->Lines->LoadFromFile(OpenDialog1->FileName); } 保存对话框: if(SaveDialog1->Execute()) { Memo1->Lines->SaveToFile(SaveDialog1->FileName); } 其它常用函数 ShowMessage(s);_str(); ShowMessage(s); } //--------------------------------------------------------------------------- SubString(index,count)//字符串裁减函数 Index为字符串的序号,从1开始,count为要裁减的长度,如:String s=Edit1->Text; ShowMessage(1,2)); IntToHex(n1,n2)//十进制转16进制,n1为要转换的数, n2为转换的16进制的位数,如: int i=255; ShowMessage(IntToHex(i,2)); StrToInt(s)//字符串转数字,如: String s="1234";

int i=4321 + StrToInt(s); ShowMessage(i); IntToStr(n)//数字转字符串,如: int i=4321; String s="1234" + IntToStr(i); ShowMessage(s);

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,并配置好登陆用户和密码以及相关设置,主要有两部分设置,如下图。

ODBC_API常用函数介绍

ODBC API 常用函数诠释
作者: moonbreak, 出处:blog, 责任编辑: 唐小若,
2008-09-03 10:03
ODBC API 是一套复杂的函数集,可提供一些通用的接口,以便访问各种后台数据库。本 文详细介绍了 ODBC API 的常用十四个函数并列出在 PowerBuilder 中外部函数引用声明。 以下为 ODBC API 的常用十四个函数,先列出在 PowerBuilder 中外部函数引用声明:
nv(ref long phenv) library "odbc32.dll"
v(long henv) library "odbc32.dll"
ources(long henv,int fdirection,ref string szdsn,&
er pcbdsn,ref string szdescription,integer cbdescriptionmax,ref integer pcbdescription)library "odbc32.dll"
onnect(long henv,ref long hdbc)library "odbc32.dll"
ct (long hstmt,ref string szdsn,integer dsnlen,ref string
ng szpwd,integer pwdlen) library "odbc32.dll"
nect (long hdbc) library "odbc32.dll"
mt(long hdbc,ref long hstmt)library "odbc32.dll"
long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,integ
pelen)library "odbc32.dll"
ns(long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,in
pelen)library "odbc32.dll"
ol(long hstmt,integer colnum,integer datatype,ref string name,long maxlen,ref long actlen) library "odbc32.dll"
ong hstmt)library "odbc32.dll"
lenv,long hdbc,long hstmt,ref string sqlstate,ref long nativeerror,ref string errormsg,integer errormsgmax,ref integer e
mt(long hstmt,integer Options)library "odbc32.dll" 1、function integer SQLAllocEnv(ref long phenv) library "odbc32.dll" 、 参数: long phenv 引用传递的 long 类型参数, ref 保存该函数返回的 OBDC 环境的句柄。 存放在 phenv 中的值成为以后 OBDC API 函数调用的唯一标识符。 返回值:integer 成功时,返回 0,失败返回值小于 0。 函数功能:获取 ODBC 环境句柄。 2、function integer SQLAllocStmt(long hdbc,ref long hstmt)library 、 "odbc32.dll"

基于VXWORKS的嵌入式开发设计课件

一、嵌入式系统简介 1、嵌入式系统的基本特征 (1)专用的嵌入式CPU 该CPU具有高效率、低功耗、体积小和集成度高等特点,能够把通用CPU中许多由板卡完成的任务集成在芯片内部完成,有利于嵌入式系统设计趋于小型化, 移动能力增强,与网络耦合紧密。 (2)专用性和算法的唯一性 设计成完成某一特定任务,和相应具体任务有机结合在一起,具有较长的生命周期。 (3)多种技术的结合体 计算机技术、半导体技术以及电子技术和各行业的具体应用紧密结合在一起的系统。 (4)软硬件紧密的相互依赖性 专用性决定了设计目标是单一的,硬件和软件的依赖性强,用利于版权的保护。 (5)系统对用户透明 用户使用只是按照预定方式使用,不需要用户编程和修改。 (6)大多具有实时性 如工业仪表、控制装置、数控系统、信息家电等。 (7)系统资源有限 速度和存储容量以及扩展接口有限。 (8)多为分布式系统 更易于保证硬实时要求、更便宜和更易于实现。 2、嵌入式软件的特点 (1)多具有实时性 指操作系统内核采用了一种算法,使tc(context swich)和ts(system call)尽可能小、尽可能是常量和可确定。所谓可确定是指tc和ts有一个上限,而不是 一个统计的结果,即不会出现峰值,不会随系统任务的增多而增多。 (2)有并发处理能力 能并发处理各个事件驱动,采用多任务运行机制。 (3)具有快速启动、出错处理和自动复位能力 能从只读存储器中快速启动,具有高容错机制,在系统出现死机前自动重启。 (4)应用软件和操作系统一体化设计 硬件和软件一起设计,以解决特定的问题,不同的系统有不同的配置。 (5)交叉开发环境 二、嵌入式系统软件开发流程 1、需求分析 2、设计思路 (1)概要设计 (2)详细设计 (3)详细写出测试项目(包括测试类别、测试过程、测试预测结果) 3、编码 (1)各芯片代码模块化,有利于移植 (2)需要注意一些小问题(如边界条件、内存越界访问、空指针等) ⅰ

BCB编程过程中的各种问题集锦

C++需要掌握:类、构造函数、析构函数、函数重载、运算法重载;私有成员、公有成员、保护成员的作用域。 一:安装 1、找到INSTALL文件夹里,双击Setup,注册码可从注册机中获得。安装时选择custome 方式,最好装在c盘(即使装在D盘,重做系统后也必须重装)。 2、注意一些选项勾选去掉就可以,不装VisiBroker和interbase,可以不备份uninstall信息。 3、安装完成后,重新启动计算机,打开BCB,会提示注册,再打开注册机,将所给的三个 代码全部输入到注册机中,注册机会自动给出第四个代码,将其粘贴到空白选项内,即可完成注册。 4、Win7系统注意:帮助文档安装不上的需要另外安装一个更新包,将帮助文档连接上即 可,此更新包叶连杰有。此外还会出现管理权限问题,可通过各盘右键单击,属性->安全->编辑中将所有用户的完全控制打钩即可。 二:开始运行 1、创建工程File->New->Application 2、修改Tabsize,菜单tools->Editor Option->Tab Stops=4 3、保存:创建一个工程目录,下建sourse子目录,用于存放工程源文件。会先提示保存 窗体和类的名字,一般名字前加U表示Unit,窗体文件前面加UForm,再保存工程名一般名字前面加个Pro。 4、文件存放位置:通过Project->Options->Directories/Conditionals来设置,将运行程序产生 的可执行文件、OBJ文件分别放在相应文件件内。通常Debug source path内输入$(BCB)\source\ ;Intermediate output 内输入debug(相应文件存入debug内),Final output 内输入exe。若要在上层文件夹内创建以上两个文件可在相应的输入前加..\ 。为了产生的文件可以在没有C++Builder的计算机上运行还要通过Project->Options->Linker内取消Use dynamicRTL选项的勾选、Project->Options->Packages内取消Build with runtime packages选项的勾选最后单击Complier->单击Release。 三:常用组件 1.Standard选项卡中 PopupMenu, Label, Edit, Memo, Button, CheckBox, RadioButton, ListBox, ComboBox, GroupBox,(RadioGroup, Panel) 2.Aditional选项卡中 StringGrid, LabelEdit, Chart(MaskEdit, Image, CheckListBox, ColorBox) 3.Win32选项卡中 PageControl, (DateTimePicker, StatusBar) 4.System选项卡中 Timer, MediaPlayer 5.Win31选项卡中

打通VxWorks调试环境 Step by Step(X86)

打通VxWorks调试环境Step by Step 1 引言 1.1 编写目的 概要说明如何建立使用Tornado开发、调试VxWorks的环境(X86版本)。 1.2 背景 1.3 定义 HOST:主机,运行Tornado集成环境,FTP Server,Target Server,以及编辑、build 工程、下载目标文件的各种软件工具; TARGET:目标机,HOST产生的vxWorks映像运行的位置,对于X86版本来说也是一台PC ; TORNADO:C:\Tornado,安装Tornado的路径; BSPNAME:C:\Tornado\target\config\pc486,BSP的路径,本例中我们选择pc486;PROJECT:C:\Tornado\proj\Project2,我们自己创建的工程的路径; BIN:C:\Tornado\host\x86-win32\bin,Tornado的可执行程序的路径; HOME:C:\Tornado\host\x86-win32\bin,FTP用户的根目录。 1.4 参考资料 Tornado User’s G uide (Windows Version), 2.0, Edition 1 VxWorks Programmer’s Guide, 5.4, Edition 1 2 总体描述 2.1 硬件环境 HOST与TARGET通过以太网互连,并且位于同一网段;同时,串口通过直连电缆(NULL Modem Cable)连接。目标机配置有软盘驱动器,网卡为3com 3c905B. 2.2 软件环境 主机操作系统为Windows 2000简体中文专业版(SP3);安装Tornado Version 2.0和Win 2k 补丁。 (CD No. TDK-12835-ZC-01 & TDK-13127-ZC-00, T2 LM for x86) 2.3 预览 在VxWorks调试环境中,HOST与TARGET之间连接的方式有多种,比如串口和网络;引导TARGET的方式也有多种,当然对X86平台来说最简单的是软盘引导了。在本文档中我们以网络连接、软盘引导为例,建立起调试环境。主要步骤包括: HOST上启动FTP Server, 配置BSP 创建可以引导TARGET的Boot ROM, 制作引导盘(软盘), 用软盘引导TARGET, TARGET通过网络连接从HOST下载vxWorks映像文件, TARGET运行vxWorks, HOST上启动Target Server连接Target Agent,成功建立调试环境之后,就可以在HOST 生成目标模块,下载到TARGET运行,并通过Tornado集成环境进行调试。

C++Builder (BCB)编程规范

C++Builder (BCB)编程规范 之 鲨鱼美美版 本鲨于2002年出道,直今的2004年,快有两年啦! 时间流逝可真快! 毕业后共打了四份工,全部是做软件书写师。都涉及到数据库的领域!.不过薪金也逐步提高了 从50,130,150,到250英镑。每次进一家公司,不是去做开发而是做维护。所以修改代码,调试程序,找出BUG。简直是莫大的痛苦,尤其是修改那些用管C语言人开发的程序,乃是今生莫大的痛苦呀!就逐步总结了一些可行的经验。 1 单元 每个单元只包含一个类的声明。类中不永许写类的实现,类成员函数不超过20个,需要被外界调用的成员函数放在Public外,其余的全部放在Proteced,明确的不想让继承者修改的话放在Private中。 包含的头文件 也就是#include 在头文件应该包含该类所需要的类型的。如果cpp也包含了,那么头文件就不要在包含,使用Class vcl; 告诉头文件有些需要的已经在CPP文件中包含啦!另外对不再使用的包含文件要及时的清除出去,否则可能碰到连接出错的问题,bcb的连接提示少的可怜啊!就有苦头吃拉!还有要记得给自己加进的包含写注解啊!! 2 实现文件中 千万不要定义全局变量和全局函数,至于会发什么问题啦,只有碰到了几十万的代码,五六个项目集合,一两百个单元所可能发生的问题。那该怎么办了? 简单把它归到所在单元的类声明中去。函数的实现代码行不要超过200行 包括之间的空格.因为人的暂时记忆能力不强啊! 为什么文章要分段落啊! 就是人暂存上下文的关联的内存是有限的呀 3 组件的属性设置和数据库的字段表名: 一般下都会在对象检查器中的设置。当调试过不去而你又忘记了设置

VxWorks 基本概念

VxWorks基本概念 Bootrom和Boot image的区别,Boot image和VxWorks image的联系和区别 bootrom 是指on-chip bootrom,在CPU芯片内部,内嵌有小的boot程序(bootloader),类似于PC机主板上的BIOS的存储区域。和boot image不是一回事。VxWorks文档中的bootrom区是指boot image存放的位置。 boot image的作用是把VxWorks image 加载到主板。boot image只初始化很少的硬件系统如串口,网口等。为加载VxWorks image做准备,当VxWorks系统下载完毕后,b oot image的作用也就完成了。 VxWorks image含有完整的VxWorks OS.是真正运行于目标板上的操作系统。应用程序运行于VxWorks系统之上。 boot image 和VxWorks image生成在使用BSP文件上的区别在于:在启动顺序中Bootrom调用bootConfig.c,而VxWorks调用usrConfig.c. 在ROM中VxWorks运行的方式(和bootrom编译到一起还是单独固化到ROM中),在ROM中的内存分配? VxWorks加载到主板运行,分不同的情况,如果VxWorks是压缩的,加载时解压到RAM的RAM_HIGH_ADRS.如果是ROM based VxWorks,VxWorks image的data段复制到RAM的LOCAL_LOW_ADRS, text部分留在ROM并在ROM中执行。 既不压缩又不ROM based的VxWorks直接copy到RAM_LOW_ADRS运行。 若在config.h中修改系统设置,如增加网卡等,是否需要重新烧bootrom?如果增加其他oem产品呢? 如果主板中有Boot image存在则不需要重新烧,用FTP等download加载VxWorks 即可。 VxWorks 系统编程中任务级与中断级的通讯如何实现? 中断是由硬件触发,软件的作用只是将中断服务例程(ISP)与中断事件连接起来。 1.使能中断,函数intEnable()。 2.用intConnect()登记中断号,和相应的中断例程ISR.这样一旦有中断发生,系统自动跳转到相应位置执行ISR.

相关主题
文本预览
相关文档 最新文档