Vxworks任务创建编程学习代码
(完整word版)VxWorksSMP多核编程指南
VxWorks SMP多核编程指南本文摘自vxworks_kernel_programmers_guide_6.8 第24章1.介绍VxWorks SMP是风河公司为VxWorks设计的symmetric multiprocessing(SMP)系统。
它与风河公司的uniporcessor(UP)系统一样,具备实时操作系统的特性。
本章节介绍了风河VxWorks SMP系统的特点。
介绍了VxWorks SMP的配置过程、它与UP编程的区别,还有就是如何将UP代码移植为SMP代码。
2.关于VxWorks SMP多核系统指的是一个系统中包含两个或两个以上的处理单元。
SMP是多核技巧中的一个,它的主要特点是一个OS运行在多个处理单元上,并且内存是共享的。
另一种多核技巧是asymmetric multiprocessing(AMP)系统,即多个处理单元上运行多个OS。
(1)技术特点关于CPU与处理器的概念在很多计算机相关书籍里有所介绍。
但是,在此我们仍要对这二者在SMP系统中的区别进行详细说明。
CPU:一个CPU通常使用CPU ID、物理CPU索引、逻辑CPU索引进行标示。
一个CPU ID通常由系统固件和硬件决定。
物理CPU索引从0开始,系统从CPU0开始启动,随着CPU个数的增加,物理CPU索引也会增加。
逻辑CPU索引指的是OS实例。
例如,UP 系统中逻辑CPU的索引永远是0;对于一个4个CPU的SMP系统而言,它的CPU逻辑索引永远是0到3,无论硬件系统中CPU的个数。
处理器(processor):是一个包含一个CPU或多个CPU的硅晶体单元。
多处理器(multiprocessor):在一个独立的硬件环境中包含两个以上的处理器。
单核处理器(uniprocessor):一个包含了一个CPU的硅晶体单元。
例如:a dual-core MPC8641D指的是一个处理器上有两个CPU;a quad-core Broadcom 1480指的是一个处理器上有四个CPU。
vxWorks多任务编程初探(转)
vxWorks多任务编程初探(转)进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。
而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。
它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。
线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。
线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。
根据进程与线程的设置,操作系统大致分为如下类型:1、单进程、单线程:MS-DOS大致是这种操作系统;2、多进程、单线程:多数UNIX(及类Unix的Linux)是这种操作系统;3、多进程、多线程:Windows NT(以及基于NT内核的Windows 2000、XP等)、Solaris 2.x和OS/2都是这种操作系统;4、单进程、多线程:vxWorks就是这种操作系统。
vxWorks只有一个进程(内存空间和资源分配),其任务的概念与线程大致相当,所有任务之间共享内存和其它资源。
vxWorks由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。
vxWorks 内核最小为8KB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。
vxWorks的内核主要包括:1、多任务:为满足真实世界事件的异步性,现代操作系统需提供多任务支持,由系统内核分配CPU给多个任务并发执行。
VXWORKS系统AX88796网卡代码学习
VXWORKS系统AX88796网卡驱动代码学习一之前学习了AX88796网卡的大体流程,这周主要针对具体代码进行分析学习。
一、初始化驱动程序和设备当设备上电后,经过系统一系列的自检操作流程后,进入END程序的加载,从源码看到,网卡驱动的加载函数是ne2000EndLoad( ),此函数的作用是初始化驱动程序和设备:首先通过调用GetNetCfgFromFlash()函数来获得目标机的MAC地址和IP地址,如果不存在则采用默认222.111.112.204作为IP1地址。
ne2000Parse (pDrvCtrl, initString)函数来解析设备初始化字符串,其中initString是指向所有的设备的具体参数指针,解析的字符串包含网卡编号地址,IP地址,中断向量,设置配置寄存器,8位或者16位访问格式等,通过strtok_r函数来分割字符串分析。
strtok_r函数原型是char *strtok_r(char *str, const char *delim, char **saveptr);其中第一个参数是待分割字符串,第二个参数是分隔符,第三个用来保存切分是的上下文,第一次调用可以为空。
如果连续调用分割字符,第一个参数可以为null,第三个参数则是上次调用的返回值。
比如tok = strtok_r (initString, ":", &holder);if (tok == NULL)return (ERROR);pDrvCtrl->unit = atoi (tok);上面的代码是通过‘:’分割字符串initString,通过atoi将字符装换成整形,也就是网口编号地址,如0x8000000,0x8200000,0x8400000。
接下来初始化一个END_OBJ结构并用参数列表中的数据进行填充,并创建和初始化信号量和协议列表。
if (END_OBJ_INIT (&pDrvCtrl->endObj, (DEV_OBJ *)pDrvCtrl, NE2000_DEV_NAME,pDrvCtrl->unit, &ne2000FuncTable,"ne2000 Enhanced Network Driver") == ERROR) /*初始化初始化一个END_OBJ结构并用参数列表中的数据进行填充,并创建和初始化信号量和协议列表。
VxWorks编程常用函数说明
taskSend() { if (OK != msgQSend(msgQID, "A", 1, NO_WAIT, MSG_PRI_NORMAL)) { printf("Message send failed!"); } }
if (select(width, &readFds, NULL, NULL, NULL) == ERROR) { /*监听*/ close(fds[0]); ... ...; close(fds[3]); return; } for(i=0; i if (FD_ISSET(fds[i], &readFds)) { ... ...; /* 进行读写操作 */
Init() { /* 创建管道 */
if (pipeDevCreate("/pipe/mypipe", 8, 1) != OK) { printf("/pipe/mypipe create fialed!\n"); } /* 创建互斥信号量 */ if ((semMID = semMCreate(SEM_Q_FIFO)) == NULL) { printf("Mutex semaphore create failed!\n"); } }
taskReceive() { uchar_t ch; msgQReceive(msgQID, &ch, 1, WAIT_FOREVER); /* 这里任务会阻塞 */ printf("Received from msgq: %c ", ch); }
VxWorks开发教程
任务删除
使用`taskDelete()`函数删除 指定任务,释放任务所占用的
资源。
任务状态转换
通过`taskSuspend()`和 `taskResume()`函数实现任务
的挂起与恢复,通过 `taskDelay()`函数实现任务延
时。
任务优先级调度策略
优先级抢占式调度
01
高优先级任务可抢占低优先级任务的执行,确保关键任务得到
TCP/IP通信实例分析
通过分析一个简单的基于TCP/IP协议栈的通信实例,加深对网络通信编程的理解和掌握。
无线通信模块集成与调试经验分享
01
02
无线通信模块概述
介绍常见的无线通信模块类型及其特点, 如Wi-Fi模块、蓝牙模块、ZigBee模块 等。
模块集成步骤与注意 事项
详细讲解无线通信模块与VxWorks系 统的集成步骤,包括硬件连接、驱动程 序开发、协议栈配置等,并分享一些实 用的调试技巧和经验。
套接字编程基本流程
包括创建套接字、绑定地址、监听连接、接受连接、发送和接收数据等步骤。
基于TCP/IP协议栈网络通信实现
TCP/IP协议栈概述
介绍TCP/IP协议栈的基本概念和层次结构,以及各层的主要功能和协议。
网络通信编程接口
讲解VxWorks提供的网络通信编程接口,如socket()、bind()、listen()、accept()、send()、recv()等函数 的使用方法和注意事项。
中断控制器识别中断源,并将其传递 给CPU。
中断类型及响应过程
3. 中断处理
CPU保存当前执行上下文,跳转到中 断处理程序执行。
4. 中断返回
中断处理程序执行完毕后,CPU恢复保 存的上下文并继续执行原程序。
VxWorks网络编程
ifAddrSet("nt0", "100.0.0.1"); 设置掩码地址
22
接口IP地址配置
设置网络标识
设置广播地址
23
手工添加网络接口示例
1. fei2=muxDevLoad(0,fei82557EndLoad,"1:0x00:0x20:0x20:0x00",1,0) 2. muxDevStart(fei2) 3. ipAttach(0,"fei") 4. ifMaskSet("fei0",0xffffff00) 5. ifAddrSet("fei0","136.12.117.10") 6. hostAdd("woof-route-10","136.12.117.10") 7. muxShow 8. hostShow 9. ifShow 10. mRouteShow
6
VxWorks组件配置
7
安装ULIP虚拟网卡
8
VxSim网卡的配置
9
ULIP网卡的路由使能
10
连接到VxSim目标系统
11
TFTP示例演示
TFTP Server TFTP Client
PC
ULIP 100.0.0.254
VxSim0
100.0.0.1 get vxworks.txt print vxworks.txt ........................ ........................ ........................
4
VxWorks全仿真
安装具有全仿真功能的Tornado版本,具 有虚拟网络仿真功能 建立Tornado BSP工程,创建全仿真 VxWorks映像 配置Target Server Target Server连接到目标系统上 所有的软件开发与真实的带有网卡的目 标环境一样.
VxWorks开发教程
第三章 基本工程实践 ........................................................ 26 3.1 Bootable 工程实践 ................................................... 26 3.2 Downloadable 工程实践 ............................................... 30
第四章 驱动实验 ............................................................ 35 WindML 3.0.3 开发....................................................... 35 4.1、WindML 简介 ........................................................ 35 4.2、安装和配置......................................................... 39 4.3、WindML 体系 ........................................................ 39 4.4、WindML 开发流程简介 ................................................ 40 4.5、UPTECH2410 的 LCD 开发流程详解 ...................................... 41 4.5.1 WindML 的 BSP 修改 ............................................. 41 4.5.2 LCD 配置文件的建立 ............................................ 44 4.5.3 LCD 驱动程序开发 .............................................. 51 4.6、WindML 例程分析 .................................................... 57 4.6.1 wexbasic 实例分析 ............................................. 57 4.6.2 ugldemo 实例分析 .............................................. 67 4.7、2410 LCD WindML 软件使用方法 ....................................... 70
vxworks7编程指南
vxworks7编程指南VxWorks 7编程指南VxWorks 7是一款实时操作系统(RTOS),被广泛应用于嵌入式系统开发中。
本文将为读者介绍VxWorks 7的一些基本概念、特性和编程指南,帮助读者更好地理解和应用VxWorks 7。
一、VxWorks 7概述VxWorks 7是一款由美国飞利浦公司(Wind River)开发的实时操作系统,它具有高性能、可靠性和可定制性的特点。
VxWorks 7支持多种硬件平台,包括x86、ARM、PowerPC等,并提供了丰富的开发工具和库函数,方便开发人员进行嵌入式系统的开发。
二、VxWorks 7的特性1. 实时性:VxWorks 7具有非常高的实时性能,能够满足对实时性要求较高的应用场景,如航空航天、军事等领域。
2. 多任务支持:VxWorks 7支持多任务并发执行,可以同时处理多个任务,提高系统的吞吐量和效率。
3. 可定制性:VxWorks 7提供了灵活的系统配置和组件定制功能,开发人员可以根据实际需求进行裁剪和优化,减少系统资源占用。
4. 异常处理:VxWorks 7提供了丰富的异常处理机制,能够有效地处理系统中出现的异常情况,保证系统的稳定性和可靠性。
5. 网络支持:VxWorks 7提供了完善的网络支持,包括TCP/IP协议栈、网络驱动程序等,方便开发人员进行网络应用的开发。
三、VxWorks 7编程指南1. 开发环境搭建:首先,需要安装VxWorks 7的开发工具和相应的编译器。
然后,创建一个新的项目,配置项目的相关参数,如目标硬件平台、编译选项等。
2. 任务创建和管理:使用VxWorks 7提供的API函数,可以创建和管理多个任务。
任务的创建需要指定任务的入口函数和优先级等参数,任务的管理包括任务的启动、挂起、恢复等操作。
3. 任务间通信:VxWorks 7提供了多种任务间通信机制,如消息队列、信号量、邮箱等。
开发人员可以根据实际需求选择合适的通信机制,实现任务间的数据交换和同步。
vxworks7编程指南
vxworks7编程指南摘要:1.VxWorks7 简介2.VxWorks7 编程基础3.VxWorks7 编程进阶4.VxWorks7 编程实例5.VxWorks7 编程总结正文:【VxWorks7 简介】VxWorks7 是一款实时操作系统(RTOS),广泛应用于各种实时控制系统和嵌入式系统中。
其强大的功能和良好的性能使其成为众多开发者的首选。
本指南将为您提供VxWorks7 编程的基本知识和进阶技巧。
【VxWorks7 编程基础】在开始VxWorks7 编程之前,您需要了解一些基本概念。
首先,VxWorks7 的任务调度采用优先级调度策略,任务根据优先级分为不同等级。
此外,VxWorks7 还提供了丰富的同步和通信机制,如信号量、互斥锁和消息队列等,以确保实时性能和系统稳定性。
【VxWorks7 编程进阶】在熟悉基本概念后,您可以深入学习VxWorks7 的编程技巧。
本节将介绍如何使用VxWorks7 提供的API 进行任务管理、内存管理和设备驱动等操作。
此外,还将学习如何调试和优化VxWorks7 应用程序,以提高系统性能。
【VxWorks7 编程实例】为了帮助您更好地理解和应用VxWorks7 编程知识,本节将通过一个实际案例进行讲解。
实例为一个简单的嵌入式控制系统,包括一个主任务和两个子任务。
主任务负责接收用户输入,子任务分别负责控制两个电机。
通过这个实例,您将了解如何编写和调度VxWorks7 任务,以及如何使用同步和通信机制实现任务间的协作。
【VxWorks7 编程总结】在本指南中,我们为您介绍了VxWorks7 编程的基本知识和进阶技巧。
通过学习,您应该已经掌握了如何在VxWorks7 环境下编写实时应用程序,并了解了如何使用同步和通信机制实现任务间的协作。
VxWorks开发教程
错误定位与排查方法
介绍针对不同类型的错误,如何采用有效的定位与排 查方法,如查看日志文件、使用调试器等。
问题解决经验分享
分享在解决VxWorks开发过程中遇到问题的 经验和技巧,帮助开发人员快速解决问题并避 免类似问题的再次出现。
THANK YOU
感谢聆听
消息队列是一种进程间通信机制,允许任务 之间发送和接收消息。
管道
管道是一种半双工的进程间通信机制,允许 任务之间以流的方式传输数据。
共享内存
共享内存允许多个任务访问同一块内存空间, 需要进行同步以避免数据冲突。
04
VxWorks驱动程序开发
设备驱动模型及框架介绍
80%
设备驱动模型
VxWorks采用层次化的设备驱动 模型,包括设备驱动管理层、设备 驱动服务层和硬件抽象层。
VxWorks开发教程
目
CONTENCT
录
• VxWorks概述 • VxWorks开发环境搭建 • VxWorks内核机制解析 • VxWorks驱动程序开发 • VxWorks网络编程技术探讨 • VxWorks图形界面设计实践 • VxWorks调试与优化技巧分享
01
VxWorks概述
VxWorks定义与特点
02
优化算法选择
03
系统资源调优
探讨针对不同性能问题的优化算 法选择,包括时间复杂度优化、 空间复杂度优化等。
提供系统资源调优的建议,如合 理分配内存、优化任务调度等, 以提高程序运行效率。
常见问题排查思路总结
常见错误类型分析
总结在VxWorks开发过程中常见的错误类型, 如编译错误、链接错误、运行时错误等,并分 析其产生原因。
中断优先级
vxworks命令教程
memShow
显示系统内存使用情况,包括内存分区、空闲内存等信息。
taskShow
显示当前系统中所有任务的状态信息,如任务名、优先级、状态等。
semShow
显示系统中所有信号量的状态信息,如信号量名、计数值等。
系统资源管理和优化
01
02
03
memPartCreate memPartDelete taskSpawn
等。
高级命令探讨
深入探讨一些高级命令和特性,如 系统调试、性能分析等。
命令使用示例
通过具体示例演示如何在实际开发 中使用这些命令。
注意事项和最佳实践
提供一些使用命令行接口时的注意 事项和最佳实践,以帮助开发者避 免常见错误并提高开发效率。
02
VxWorks命令基础
命令格式和约定
01
命令格式
VxWorks命令通常由命令名、 参数和选项组成,格式为“命令
使用`read()`函数从已打开的文件 中读取数据,需要指定缓冲区及 其大小。
使用`write()`函数向已打开的文 件中写入数据,同样需要指定缓 冲区及其大小。
使用`lseek()`函数可以移动文件 指针到指定位置,以便进行随机 访问。
文件属性和权限设置
获取文件属性
使用`stat()`函数获取文件的属性信息, 如文件大小、创建时间等。
执行最近的包含特定字符串的命令。
自定义命令和脚本编写
alias
创建命令别名,例如`alias ll='ls -l'`。
function
定义函数,可以包含一系列命令,例 如`function myfunc { echo "Hello, world!"; }`。
VxWorks开发简明培训教程Manual
VxWorks开发简明培训教程ManualVxWorks是美国Wind River Systems开发的一款实时操作系统,常被使用在嵌入式系统中,其广泛的应用领域包括航空航天,自动驾驶,医疗设备等。
为了更好地了解VxWorks的开发及应用,在这里针对其开发进行简明培训教程。
1. 环境准备在使用VxWorks进行开发之前,需要先进行相关环境的准备。
首先是设备的准备,需要一块支持VxWorks的开发板。
其次是软件的准备,可以从Wind River Systems官网上下载VxWorks开发软件。
2. 创建项目在进行VxWorks开发前,需要创建一个新的项目。
在Eclipse或者Wind River Workbench中,可以通过点击New Project来创建新的项目。
在这一步中,需要选择合适的CPU类型和操作系统类型,以及选择开发板的型号。
3. 创建任务在VxWorks操作系统中,任务是一个非常重要的概念。
任务可以看做是一个运行在操作系统上的程序,可以控制任务的创建和销毁。
通过在代码中调用taskSpawn函数可以创建一个新的任务,该函数包含任务名称、任务优先级、任务属性、栈大小等参数。
4. 任务管理在VxWorks中,可以通过taskDelete和taskSuspend等函数来分别删除或者挂起一个任务。
在对任务进行管理时,需要注意任务的优先级和业务流程,确保任务的执行顺序和执行时间。
5. 中断处理在嵌入式系统中,中断是一个非常重要的概念。
VxWorks 提供了中断处理机制,可以在中断的发生时进行处理。
通过对中断处理函数进行编写,可以实现对中断信号的处理和相应,从而保证系统的稳定性和安全性。
6. IO操作在嵌入式系统中,IO操作是必不可少的一部分。
VxWorks 提供了相关的函数,可以对设备进行读写操作。
比如,通过open函数打开设备,通过read函数读取设备数据,通过write 函数将数据写入设备。
vxworks串口编程
vxworks串⼝编程在vxware下的vxworks学习串⼝编程1 开发主机,就是你的PC拉,要有com1,com2串⼝哦2 在vmware下配置好基于x86 pcPentium的vxworks3 ⼀根串⼝直连线,这个应该好买的实现步骤:1 ⾸先⽤串⼝直连线把你的com1和com2连接起来2 其次,配置vmware的虚拟设备,添加Serial<->com1;Serial2<->com2如下图所⽰:3 然后,在tornado下配置你的vxworks默认的vxworks配置组件是包含INCLUDE_TTY_DEV的,所以这步当然不⽤管了4 在1的基础上,运⾏你的vxworks启动后,在shell下devs可以看到/tyCo/0, tyCo/1两个串⼝设备这实际上是逻辑意义上的串⼝设备恩,就这么简单,环境搭建好了写个⼩程序测试⼀下吧 ^-^#include <ioLib.h>#include <stdio.h>#include <taskLib.h>#include <sioLib.h>#include <string.h>int tyRecv(int fd){int readCnt1;char rd;char buff[512];int i;FOREVER{i=0;taskDelay(50);ioctl(fd,FIONREAD,(int) &readCnt1); /* 判断com2接收数据缓冲区是否有数据到来 */if(readCnt1>0){while(readCnt1>0){read(fd,&rd,1);readCnt1--;buff[i++]=rd;}buff[i]='/0';printf("read '%s' from com2 whose data were sent by com1/n",buff);}}}int tySend(int fd){int wrtCount;char buff[]="I am god of war!"; /* 发送内容 */wrtCount = write(fd,buff,strlen(buff));printf("write %d bytes to com1/n",wrtCount); /* 写com1⼝,然后数据就会通过串⼝直连线发送到com2⽅了 */ }int testMain(){int com1_Fd,com2_Fd;com1_Fd = open("/tyCo/0",2,0) ; /* 打开串⼝0,即serial<->com1 */com2_Fd = open("/tyCo/1",2,0); /* 打开串⼝1,即serial2<->com2 *//* 设置串⼝0,亦即com1的波特率9600,8数据为,1停⽌位,⽆校验位 */if ( ERROR==ioctl(com1_Fd,FIOBAUDRATE,9600) )printf("can not set BAUDRATE!/n") ;return ERROR ;}if ( ERROR==ioctl(com1_Fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB))) {printf("can not set OPT!/n") ;return ERROR ;}ioctl(com1_Fd,FIOFLUSH,0);/* 设置串⼝1,亦即com2的波特率9600,8数据为,1停⽌位,⽆校验位 */if ( ERROR==ioctl(com2_Fd,FIOBAUDRATE,9600) ){printf("can not set BAUDRATE!/n") ;return ERROR ;}if ( ERROR==ioctl(com2_Fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB))) {printf("can not set OPT!/n") ;return ERROR ;}ioctl(com2_Fd,FIOFLUSH,0);/* 发起接受数据的任务 */taskSpawn("recv",60,0,0x2000,(FUNCPTR)tyRecv,com2_Fd,0,0,0,0,0,0,0,0,0);/* 发起发送数据的任务*/taskSpawn("send",80,0,0x2000,(FUNCPTR)tySend,com1_Fd,0,0,0,0,0,0,0,0,0);}下载运⾏testMain输出如下:write 16 bytes to com1read 'I am god of war!' from com2 whose data were sent by com1证明通信成功了最好说⼀下注意事项1 即使vmware不配置serial,serial2,vxworks只要包含TTY组件,起来后,devs都是有/tyCo/x的这就是说明了这个只是逻辑意义上的物理设备,真正要在vmware下通信,还是要配上PC机的物理串⼝2 这个很关键,当时我就是没注意到这点,搞了半天也没⽤串⼝调式助⼿监测到数据/tyCo/0 是对应vmware的serial 的/tyCo/1 是对应vmware的serial2 的当时我⽆意间这样配置的即我把serial2 ⽤物理串⼝com1,然后打开串⼝调试助⼿,打开com2 监听数据然后我的程序这样,程序的思想是1 写⽅⾯:打开/tyCo/0,写com1,然后串⼝调试助⼿监听com22 读⽅⾯:发起了收任务,等待com2 发来数据#include <ioLib.h>#include <stdio.h>#include <taskLib.h>#include <sioLib.h>#include <string.h>int tyRecv(int fd){int readCnt1;char rd;char buff[512];int i;FOREVERi=0;taskDelay(50);ioctl(fd,FIONREAD,(int) &readCnt1);if(readCnt1>0){while(readCnt1>0){read(fd,&rd,1);readCnt1--;buff[i++]=rd;}buff[i]='/0';printf("read '%s' from com1 whose data were sent by com2/n",buff);}}}int testMain(){int fd,wrtCount;char buff[]="I am god of war!";fd = open("/tyCo/0",2,0) ;/* 我打开了/tyCo/0 ,但前⾯说了,/tyCo/0是对应serial的,⽽我现在vmware只配了serial2 *//* 所以程序运⾏没看到任何期待的结果,解决办法在后⾯ *//* set com1 hardware option */if ( ERROR==ioctl(fd,FIOBAUDRATE,9600) ){printf("can not set BAUDRATE!/n") ;return ERROR ;}if ( ERROR==ioctl(fd,SIO_HW_OPTS_SET,(CLOCAL|CREAD|CS8)&~(HUPCL|STOPB|PARENB))) {printf("can not set OPT!/n") ;return ERROR ;}ioctl(fd,FIOFLUSH,0);wrtCount = write(fd,buff,strlen(buff)); /*write to com1*/printf("write %d bytes to com1/n",wrtCount);/* Start receiving task */taskSpawn("recv",60,0,0x2000,(FUNCPTR)tyRecv,fd,0,0,0,0,0,0,0,0,0);}然后运⾏程序,结果在串⼝调试助⼿的接收区怎么也收不到数据在串⼝调试助⼿的发送区发数据,结果我的recv任务也是死活打印不出信息后来把fd = open("/tyCo/0",2,0) ; 改成fd = open("/tyCo/1",2,0) ;这样,就和vmware配置的serial2<->com1对应起来了然后⼀切就都OK了下⾯就是正常通信的截图了串⼝调试助⼿com2的接收区受到了com1发来的'I am god of war!'⽽vxworks下的收任务也收到了串⼝调试助⼿com2的发送区发送来的数据了。
VxWorks6.6动态创建RTP例程
VxWorks6.6动态创建RTP例程VxWorks6.6中的RTP程序与WINDOWS的exe程序类似,我们可以使⽤操作系统的进程创建函数API,在程序中动态创建和调⽤。
下⾯主要通过Download Kernel moudle来测试该API使⽤,整个调试过程与Tornado2.2基本相似,具体操作流程如下⾯描述。
1、创建Downloadable Kernel module⼯程2、新建main.cpp⽂件3、main.cpp代码如下24.4、编译⼯程Build Started in Project 'testvxe': 2011-09-23 17:05:40Generation of makefiles started.Generation of makefiles finished (Elapsed Time: 00:00).Platform: Wind River VxWorks 6.6Command: make --no-print-directory BUILD_SPEC=SIMNTdiab DEBUG_MODE=1 TRACE=1Working Directory: C:/openSUSE3000/fep/code/test_sys/testvxe/SIMNTdiabif [ ! -d "`dirname "testvxe_partialImage/Debug/Objects/testvxe/main.o"`" ]; then mkdir -p "`dirname"testvxe_partialImage/Debug/Objects/testvxe/main.o"`"; fi;echo "buildingtestvxe_partialImage/Debug/Objects/testvxe/main.o"; dcc -g -tX86LH:vxworks66 -W:c:,-Xclib-optim-off -Xansi -Xlocal-data-area-static-only -Xforce-declarations -Xmake-dependency=0xd -IC:/WindRiver3.6/vxworks-6.6/target/h -IC:/WindRiver3.6/vxworks-6.6/target/h/wrn/coreip -DCPU=SIMNT -DTOOL_FAMILY=diab -DTOOL=diab -D_WRS_KERNEL -o "testvxe_partialImage/Debug/Objects/testvxe/main.o" -c"C:/openSUSE3000/fep/code/test_sys/testvxe/main.cpp"building testvxe_partialImage/Debug/Objects/testvxe/main.oif [ ! -d "`dirname "testvxe_partialImage/Debug/testvxe_partialImage.o"`" ]; then mkdir -p "`dirname"testvxe_partialImage/Debug/testvxe_partialImage.o"`"; fi;echo "buildingtestvxe_partialImage/Debug/testvxe_partialImage.o"; dld -tX86LH:vxworks66 -X -r5 -f 0x90,1,1 -o"testvxe_partialImage/Debug/testvxe_partialImage.o" testvxe_partialImage/Debug/Objects/testvxe/main.o && if [ "0" = "1" ]; then plink "testvxe_partialImage/Debug/testvxe_partialImage.o";fibuilding testvxe_partialImage/Debug/testvxe_partialImage.oif [ ! -d "`dirname "testvxe/Debug/testvxe.out"`" ]; then mkdir -p "`dirname "testvxe/Debug/testvxe.out"`"; fi;echo "building testvxe/Debug/testvxe.out";rm -f "testvxe/Debug/testvxe.out";ddump -Ngtestvxe_partialImage/Debug/testvxe_partialImage.o | tclsh C:/WindRiver3.6/vxworks-6.6/host/resource/hutils/tcl/munch.tcl -c pentium > testvxe/Debug/ctdt.c; dcc -g -tX86LH:vxworks66 -Xdollar-in-ident -Xforce-declarations -IC:/WindRiver3.6/vxworks-6.6/target/h -IC:/WindRiver3.6/vxworks-6.6/target/h/wrn/coreip -DCPU=SIMNT -DTOOL_FAMILY=diab -DTOOL=diab -D_WRS_KERNEL -o testvxe/Debug/ctdt.o -c testvxe/Debug/ctdt.c; dld -tX86LH:vxworks66 -X -r5 -f 0x90,1,1 -r4 -o "testvxe/Debug/testvxe.out" testvxe/Debug/ctdt.otestvxe_partialImage/Debug/testvxe_partialImage.o && if [ "0" = "1" ]; then plink "testvxe/Debug/testvxe.out";fibuilding testvxe/Debug/testvxe.outmake: built targets of C:/openSUSE3000/fep/code/test_sys/testvxe/SIMNTdiabBuild Finished in Project 'testvxe': 2011-09-23 17:05:44 (Elapsed Time: 00:04)5、启动仿真器6、下载⼆进制⽂件从左边⼯程树⽬录中的testvxe->Binaries找到testvxe.out⽂件,⿏标右键时从弹出的菜单中选择下载“Download”即可。
VxWorks下消息信号量的使用和任务创建
VxWorks下消息信号量的使用和任务创建VxWorks下消息、信号量的使用和任务创建Test.c#include stdlib.h#include stdio.h#include Test.h#include taskLib.h#include msgQLib.h#include semLib.h#define MAX_MESSAGE_COUNT 100#define MAX_MESSAGE_LENGTH 400int offset;unsigned char SharedBuf[21024];任务1 消息的发送void loop1(MSG_Q_ID id)the function for task 1, like a thread under Windows or Unix{unsigned char msg[MAX_MESSAGE_LENGTH] = {1};for( ; ;){taskDelay(10);快速发送消息,10ms,直至消息队列满if (msgQSend(id, msg, MAX_MESSAGE_LENGTH, WAIT_FOREVER, MSG_PRI_NORMAL) == OK){printf(longping1!! Send %dn, msg[0]);}else{printf(Sending message ERROR!n);}}}任务2 消息的接收void loop2(MSG_Q_ID id)the function for test 2, like a thread under Wondows or Unix{unsigned char msg[MAX_MESSAGE_LENGTH] = {0};for( ; ;){taskDelay(30);满速取消息,消息队列满了以后,收发达到平衡,发消息的10ms和30ms效果相同if (msgQReceive(id, msg, MAX_MESSAGE_LENGTH, WAIT_FOREVER) != ERROR){printf(looping2!! Receive %dn, msg[0]);}else{printf(Receiving message ERROR!n);}}}任务3 获取信号量,信号量减1操作void loop3(SEM_ID semID){for ( ; ;){taskDelay(100);获取信号量,速度快if (semTake(semID, WAIT_FOREVER) == OK){offset = (++offset) % 2048;printf(looping3!! Take SemID is %d.Now I get one element %dn, (int)semID, SharedBuf[offset]);}}}任务4 释放信号量,信号量加1操作void loop4(SEM_ID semID){for ( ; ;){taskDelay(200);释放信号量,速度慢,可以控制获取信号量,虽然获取延时短,但是没有释放信号量,只能等待if (semGive(semID) == OK){printf(looping4!! Gave SemID is %d.Now I get one element %dn, (int)semID, SharedBuf[offset]);}}}void InitialSharedBuf(){int i;offset = 0;for (i=0; i2048; i++){SharedBuf[i] = i;}}int main(){MSG_Q_ID msgID;SEM_ID semID;signed int taskArray[100] = {0};char ch;int i;to build a message Queue.InitialSharedBuf();msgID = msgQCreate(MAX_MESSAGE_COUNT,MAX_MESSAGE_LENGTH, MSG_Q_FIFO);semID = semBCreate(SEM_Q_FIFO, SEM_FULL);下面启动4个任务start a task(thread)taskArray[0] = taskSpawn(loop1 , 80, 0, 641024, (FUNCPTR)loop1, (MSG_Q_ID)msgID, 0, 0, 0, 0, 0, 0, 0, 0, 0);start another task(thread)taskArray[1] = taskSpawn(loop2 , 80, 0, 641024, (FUNCPTR)loop2, (MSG_Q_ID)msgID, 0, 0, 0, 0, 0, 0, 0, 0, 0);start another task(thread)taskArray[2] = taskSpawn(loop3 , 80, 0, 641024, (FUNCPTR)loop3, (SEM_ID)semID, 0, 0, 0, 0, 0, 0, 0, 0, 0);start another task(thread)taskArray[3] = taskSpawn(loop4 , 80, 0, 641024, (FUNCPTR)loop4, (SEM_ID)semID, 0, 0, 0, 0, 0, 0, 0, 0, 0);主任务循环,当接收到'e'结束所有任务for ( ; ;){ch = getchar();if (ch == 'e'){i = 0;while (taskArray[i]){taskDelete(taskArray[i]);printf(The task %d is ended.n, taskArray[i]);taskArray[i] = 0;i ++;}break;}}printf(The Main Function is Ended.n);return 0;}上面演示了消息、信号量和任务的创建,在Turnado下编译调试过,没有问题。
Vxworks任务创建编程学习代码
任务创建编程学习代码一此代码主要的是创建若干的任务,来学习任务的创建和删除.程序的结构是: start函数:任务创建函数stop函数:任务删除函数其它为任务请大家仔细分析代码,理解任务内务的创建和删除.本代码是在tornado2.0版本调试成功. 如有疑问联系作者jdvxworks 邮箱:foxqs@/********************************** date:2006.7.10 time:16.08* maker: jdvxworks* aim: create 4 task* list: task0 task1 task2 task3* change:_____________________*********************************/#include "stdio.h"#include "taskLib.h"#include "vxWorks.h"//#include "semBLib.h"int taskid0;int taskid1;int taskid2;int taskid3;int loopid;SEM_ID sem_id;STATUS Err;void start(void);void test0(void);void test1(void);void test2(void);void test3(void);void stop(void);void taskloop(void);//start init taskvoid start(void){int i,o;long p=9999999+100000;taskid0=taskSpawn("task0",200,0x100,1000,(FUNCPTR)test0,0,0,0,0,0,0,0,0, 0,0);printf("init task0 start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",taskid0);printf("\n");//create task 1taskid1=taskSpawn("task1",200,0x100,1000,(FUNCPTR)test1,0,0,0,0,0,0,0,0, 0,0);printf("init task1 start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",taskid1);printf("\n");//create task 2taskid2=taskSpawn("task2",200,0x100,1000,(FUNCPTR)test2,0,0,0,0,0,0,0,0, 0,0);printf("init task2 start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",taskid2);printf("\n");//create task 3taskid3=taskSpawn("task3",200,0x100,1000,(FUNCPTR)test3,0,0,0,0,0,0,0,0, 0,0);printf("init task3 start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",taskid3);printf("\n");loopid=taskSpawn("taskloopT",201,0x100,1000,(FUNCPTR)taskloop,0,0,0,0, 0,0,0,0,0,0);printf("init taskloopT start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",loopid);printf("\n");printf("All Task Start!!!");//create semsem_id=semBCreate(SEM_Q_FIFO,SEM_EMPTY);printf("init Sem start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("\n");printf("All Task Start!!!");}//start task over!!void taskloop(void){while(1){taskDelay(3);printf("taskReStart start....\n");// semTake(sem_id,WAIT_FOREVER);// semGive(sem_id);//_________________________________________if(taskRestart(taskid0)==ERROR){printf(" task_0_Error Return!!!\n");printf("ErrId:%f\n",errno);printf("\n");}else{printf("Ok Return!!!\n");printf("\n");}//_________________________________________ if(taskRestart(taskid1)==ERROR){printf("task_1_Error Return!!!\n");printf("ErrId%d\n",errno);printf("\n");}else{printf("Ok Return!!!\n");printf("\n");}//_________________________________________ if(taskRestart(taskid2)==ERROR){printf("task_2_Error Return!!!\n");printf("ErrId%d\n",errno);printf("\n");}else{printf("Ok Return!!!\n");printf("\n");}//-----------------------------------------if(taskRestart(taskid3)==ERROR){printf("task_3_Error Return!!!\n");printf("ErrId%d\n",errno);printf("\n");}else{printf("Ok Return!!!\n");printf("\n");}//_________________________________________ taskDelay(3);printf("taskReStart stop....\n");}}void test0(void){// semTake(sem_id,,WAIT_FOREVER); printf("hello world 000!!!!\n");}void test1(void){printf("hello world 111!!!!\n");}void test2(void){printf("hello world 222!!!!\n");}void test3(void){printf("hello world 333!!!!\n");// semGive(sem_id);}void stop(void){ taskDelete(taskid0);taskDelete(taskid1);taskDelete(taskid2);taskDelete(taskid3);taskDelete(loopid);printf("All Task Delete !!!\n");}。
VxWorks开发教程
5.1.1 串口概述...................................................... 71 5.1.2 串口操作...................................................... 71
集成开发环境是一种更直观的自动化环境使得不同使用经验的开发人员可以快速方便地在vxworks上面开发应用21安装开发环境22tornado集成开发环境简述tornado集成开发环境使用户创建和管理工程建立和管理宿主机与目标机之间的通信以及运行调试和监控vxworks应用变得非常方便
第一章 Wind River ........................................................... 4 1.1 风河系统公司简介 ..................................................... 4 1.2 实时操作系统 Vxworks 简介............................................. 4
第四章 驱动实验 ............................................................ 35 WindML 3.0.3 开发....................................................... 35 4.1、WindML 简介 ........................................................ 35 4.2、安装和配置......................................................... 39 4.3、WindML 体系 ........................................................ 39 4.4、WindML 开发流程简介 ................................................ 40 4.5、UPTECH2410 的 LCD 开发流程详解 ...................................... 41 4.5.1 WindML 的 BSP 修改 ............................................. 41 4.5.2 LCD 配置文件的建立 ............................................ 44 4.5.3 LCD 驱动程序开发 .............................................. 51 4.6、WindML 例程分析 .................................................... 57 4.6.1 wexbasic 实例分析 ............................................. 57 4.6.2 ugldemo 实例分析 .............................................. 67 4.7、2410 LCD WindML 软件使用方法 ....................................... 70
vxworks代码分析
FREE_BLOCK BLOCK_HDR
pPrevHdr pPrevHdr
BLOCK_HDR
pPrevHdr
说明:这里整个 表示一个内存分 区(内存管理对 象),其中左边 为空闲节点的双 向链表,右边为 相邻块内存的单
向链表。
NULL
内存分配(first fit)
需要分配:
512
memSysPartition
windExit 或intExit 函数将当前任务的寄存器环境保存在 任务控制块中,调用函数reschedule进行任务调度
windLoadContent 函数从新选择的任务控制块中装载寄存器 上下文
windLoadContent 函数中执行指令 pushl WIND_TCB_PC(%eax), 它将新选择任务的tcb 结构中存放的pc地址压入系统堆栈
MemPoolEnd
Roo Root_Task TCB
•在系统初始化时在kernelInit()中分配中 断堆栈和RootTask的TCB和Stack.其他部分
作为系统分区分配.
•在RootTask执行完后在taskDestory中把其 TCB和Stack通过MemAddPool()加到系统分
移动代码到00108000
在makefile中,进行了定义代码入口地址 ld -X -N -e _sysInit -Ttext 00108000 -o vxWorks dataSegPad.o
vxWorks.tmp ctdt.o
主要的makefile文件在: VxWorks_Dev\BSP\vxworks4\target\h\make VxWorks_Dev\kernel\vxworks4\target\h\make
VxWorks工程编译入门
VxWorks工程编译使用风河Workbench 4可以建立多种工程项目
新建VSB工程,内核和常用库文件的编译
选择“Source Build”下一步,输入工程名,下一步选择BSP
这里BSP是IDE提供的一些模板,文件目录在,可以修改进行新建自己定制的板卡BSP
完成新建VSB工程,新建时勾选link into source选项会将源代码拷贝进工程。
工程进行编译,编译时间可能需要10-30分钟
编译完内核,新建一个VIP工程,即系统镜像工程
选择刚编译完成的VSB工程和BSP包
完成新建工程
右键kernel Configuration可以对内核和BSP进行配置
串口驱动配置
在BSP目录下可以对BSP资源进行配置和定制
串口对应驱动程序位置在VSB 工程目录下:
右键编译工程
默认编译出三个镜像文件
uVxWorks是带有Uboot头的镜像(使用mkuimage工具生成)
将镜像文件下载到板子可以使用bootm启动镜像。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务创建编程学习代码一此代码主要的是创建若干的任务,来学习任务的创建和删除.程序的结构是: start函数:任务创建函数stop函数:任务删除函数其它为任务请大家仔细分析代码,理解任务内务的创建和删除.本代码是在tornado2.0版本调试成功. 如有疑问联系作者jdvxworks 邮箱:foxqs@/********************************** date:2006.7.10 time:16.08* maker: jdvxworks* aim: create 4 task* list: task0 task1 task2 task3* change:_____________________*********************************/#include "stdio.h"#include "taskLib.h"#include "vxWorks.h"//#include "semBLib.h"int taskid0;int taskid1;int taskid2;int taskid3;int loopid;SEM_ID sem_id;STATUS Err;void start(void);void test0(void);void test1(void);void test2(void);void test3(void);void stop(void);void taskloop(void);//start init taskvoid start(void){int i,o;long p=9999999+100000;taskid0=taskSpawn("task0",200,0x100,1000,(FUNCPTR)test0,0,0,0,0,0,0,0,0, 0,0);printf("init task0 start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",taskid0);printf("\n");//create task 1taskid1=taskSpawn("task1",200,0x100,1000,(FUNCPTR)test1,0,0,0,0,0,0,0,0, 0,0);printf("init task1 start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",taskid1);printf("\n");//create task 2taskid2=taskSpawn("task2",200,0x100,1000,(FUNCPTR)test2,0,0,0,0,0,0,0,0, 0,0);printf("init task2 start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",taskid2);printf("\n");//create task 3taskid3=taskSpawn("task3",200,0x100,1000,(FUNCPTR)test3,0,0,0,0,0,0,0,0, 0,0);printf("init task3 start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",taskid3);printf("\n");loopid=taskSpawn("taskloopT",201,0x100,1000,(FUNCPTR)taskloop,0,0,0,0, 0,0,0,0,0,0);printf("init taskloopT start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("%d\n",loopid);printf("\n");printf("All Task Start!!!");//create semsem_id=semBCreate(SEM_Q_FIFO,SEM_EMPTY);printf("init Sem start....\n");for(i=0;i<50;i++){ printf("*");for(o=0;o<p;o++);}printf("\n");printf("All Task Start!!!");}//start task over!!void taskloop(void){while(1){taskDelay(3);printf("taskReStart start....\n");// semTake(sem_id,WAIT_FOREVER);// semGive(sem_id);//_________________________________________if(taskRestart(taskid0)==ERROR){printf(" task_0_Error Return!!!\n");printf("ErrId:%f\n",errno);printf("\n");}else{printf("Ok Return!!!\n");printf("\n");}//_________________________________________ if(taskRestart(taskid1)==ERROR){printf("task_1_Error Return!!!\n");printf("ErrId%d\n",errno);printf("\n");}else{printf("Ok Return!!!\n");printf("\n");}//_________________________________________ if(taskRestart(taskid2)==ERROR){printf("task_2_Error Return!!!\n");printf("ErrId%d\n",errno);printf("\n");}else{printf("Ok Return!!!\n");printf("\n");}//-----------------------------------------if(taskRestart(taskid3)==ERROR){printf("task_3_Error Return!!!\n");printf("ErrId%d\n",errno);printf("\n");}else{printf("Ok Return!!!\n");printf("\n");}//_________________________________________ taskDelay(3);printf("taskReStart stop....\n");}}void test0(void){// semTake(sem_id,,WAIT_FOREVER); printf("hello world 000!!!!\n");}void test1(void){printf("hello world 111!!!!\n");}void test2(void){printf("hello world 222!!!!\n");}void test3(void){printf("hello world 333!!!!\n");// semGive(sem_id);}void stop(void){ taskDelete(taskid0);taskDelete(taskid1);taskDelete(taskid2);taskDelete(taskid3);taskDelete(loopid);printf("All Task Delete !!!\n");}。