Vxworks任务创建编程学习代码
- 格式:doc
- 大小:28.50 KB
- 文档页数:5
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多任务编程初探(转)进程(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网卡驱动代码学习一之前学习了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结构并用参数列表中的数据进行填充,并创建和初始化信号量和协议列表。
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编程指南摘要: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开发简明培训教程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串⼝编程在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程序与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下消息、信号量的使用和任务创建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下编译调试过,没有问题。
任务创建编程学习代码一此代码主要的是创建若干的任务,来学习任务的创建和删除.程序的结构是: 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");}。
任务创建编程学习代码一此代码主要的是创建若干的任务,来学习任务的创建和删除.程序的结构是: 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");}。