EDN首页   博客首页

12

关于投票
vxworks创建任务中堆栈生长方向问题

用taskInit 创建任务要注意堆栈的生长方向问题,程序例子如下:   

 int ret;
    char    *memArea;

    /* initialize TCB and stack space */

    memArea = (char *) malloc (STACK_ROUND_UP(STACK_SIZE) + sizeof (WIND_TCB) + 16);

    /* initialize task */

    ret = taskInit ((WIND_TCB *) (memArea + 16), NULL, 150, VX_NO_STACK_FILL,
#if (_STACK_DIR == _STACK_GROWS_DOWN)
            (char *) (memArea + STACK_SIZE + sizeof (WIND_TCB)),
#else
            memArea + STACK_ROUND_UP (sizeof (WIND_TCB) + 16),
#endif
            STACK_SIZE, (FUNCPTR) function,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0);    /* args */

    if (ret == ERROR)
    {
        perror ("taskInit");
        return(0);
    }
    else
    {
        taskActivate ((int) memArea);
    }

    WIND_TCB tMonitorTcb;
    char tMonitorStack[STACK_SIZE];

或静态内存
    status = taskInit(&tMonitorTcb,              /* TCB Address        */
                 "tMonitorMethod04",             /* Task/Thread Name   */
                 240,                            /* Priority 0=Highest */
                 VX_NO_STACK_FILL,               /* Options            */
                 /*
                  Determine which way stack grows and
                  adjust address if necessary
                  */
#if (_STACK_DIR == _STACK_GROWS_DOWN)
                 tMonitorStack+STACK_SIZE,       /* Stack base address */
#else
                 tMontiorStack,                  /* Stack base address */
#endif
                 STACK_SIZE,                     /* Stack size in bytes*/
                 (FUNCPTR) monitor,              /* Task entry point   */
                 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0);  /* VxW Req 10 parms   */

    /*
     Task exists but is not running at this point.  The debugger can now attach to the task
     and set breakpoints provided the user does not detach or attach to some other task
     */
    if (status == OK)                            /* Only activate if init ok */
        status = taskActivate((int)&tMonitorTcb);/* Actually start task */

 

系统分类: 嵌入式
用户分类: vxowrks任务调度
标签: vxworks创建任务中堆栈生长方向问题
来源: 无分类
发表评论 阅读全文(997) | 回复(1)

35

关于投票
全局变量的保护

全局变量的保护
各个任务之间通过全局变量交换信息时,如果其
中某一任务在引用同一个全局变量期间,该变量在另
一任务中被重新赋值,那么就可能发生一些意想不到
的事情。一般我们采用这样的方法解决可能的问题。
首先在任务中定义若干个局部变量;之后将相应的全
局变量赋值这些局部变量。任务随后引用的是这些局
部变量,而不是全局变量,这样就避免了问题的发生。
具体程序设计流程如下所示:
Void Task{
int Local_ var;
UGL_ FOREVER{
SemTake(semStart,WAIT_FOREVER);
Local_var= Globle_var:
Subcall_1(Local_var);
Subcall_2(Local_var);

......
}/* UGL_FOREV ER */

对于数组等全局变量采用固定数组,会有利于防
止数组超界。

系统分类: 嵌入式
用户分类: vxowrks任务调度
标签: 全局变量的保护
来源: 无分类
发表评论 阅读全文(1328) | 回复(5)

31

关于投票
vxworkswind内核

RTOS内核是wind kernel,这个内核有两个特点:

1. wind kernel是一个微内核,这个特点导致VxWorks有许多的Components

2. wind kernel对外设不做假设。所谓对外设不做假设是指操作系统不假设用户开发的板子上是否有总线以及有什麽样的总线,也不假设内存的大小及内存如何定位,不假设I/O及有多少I/O。举一个对外设假设的例子:DOS就是一个对外设假设的操作系统,DOS系统的移植中,外设必须符合BIOS标准。wind kernel对外设不做假设的优点就是系统只与CPU有关,移植性好。由于wind kernel对外设不做假设,IMAGE中就要有板级支持包BSP(即驱动程序)来完成对外设的管理。

  IMAGE的生成

 

Tornado    host

 

           share

 

           target     config

                      h

src

.

.

Ev2_bsp

 

 

.wind

 

    IMAGE各部分的细述

RTOS内核

1.

 

文件系统                    虚拟内存管理

 

 

 

 

 

 

 网络协议栈                  I/O系统接口

功能组成:任务的管理与调度、任务的同步与通信、动态内存的管理、软时钟的管理、I/O管理

 

 

 

 

   

多任务环境

Kernel

 

 

 

 

 

 

 

 

 


2.版本:用户可裁减掉程序员认为没有使用到的功能,直到只剩下最简内核(任务的管理与调度,我们称其为内核,可以只有8k)。

         VxWorks:标准的单CPU版本。

         VxFusion:标准的多CPU版本,应用程序在多个CPU上运行,但仍然象在一个CPU 上运行那样进行数据的交换、通信与同步。

IxWorks:

Osek:

3.统一的API:可以从两个角度来理解,即对于VxWorks支持的不同的CPUVxWorks的不同版本,API都是一样的。VxWorksAPI是由操作系统内核提供的服务原语搭建起来的。服务原语,是不可打断的,这样可以保证系统调用的时间尽量小、尽量是常量和可确定。举例:DOSAPIINT21UNIXAPISystem Call

 

4.验证性:FAAFDA

 

5.实时性:指操作系统内核采用了一种算法,使tc(context swich)ts(system call)尽可能小、尽可能是常量和可确定。所谓可确定是指tcts有一个上限,而不是一个统计的结果,即不会出现峰值,不会随系统任务的增多而增多。

系统分类: 嵌入式
用户分类: vxowrks任务调度
标签: 无标签
来源: 无分类
发表评论 阅读全文(609) | 回复(0)

35

关于投票
vxworks任务通信机制(信号量)

任务间通信机制
任务间通信机制是多任务间相互同步和通信以协调各活动的主要手段,VxWorks提供的任务问通信手段按其速度由 快到慢排列为信号量、消息队列、管道到网络透明的套接字。 本例子中,主要采用了共享内存、信号量和消息队列等手段实现任务间通信。任务间通信最直接、最明显的方法是访问共享内存数据结构,VxWorks操作系统采用的是 32位平滑内存地址空间,所有任务共存于单一的地址空间,任一程序定义的各种类型的全局变量都可以被任务直接访问。本系统中所有的全局控制参数数组都采用这种方法来访问,虽然这种方法不是最好的,但是却减少了函数调用时传递很多参数的 环节,对于实时控制系统来说是可取的。信号量是任务间通信同步互斥的最优选择,VxWorks提供3种信号量:二进制,互斥和计数器信号量。常用的是二进制信号量和互斥信号量。在本例子资源分配任务中就采用二进制信号量的同步方法。
//在主任务中创建二进制信号量
STATUS  mainTask(void){…
if(dtmfcSem="SemBSmCreate"(SEM_Q_FIFO,SEM_FULL)==NULL)return(ERROR);

//在 20ms中断程序中给出该信号量
LOCAL STATUS  inq20ms(void){
. . . SemGive(dtmfcSere);

/在资源管理与分配程序中取得该信号量
STATUS Managetask(c0umster1inktab1e ptr… .){…
SemTake(dtmfcSem。WATT_FOREVER);
//将该资源分配给ptr指向的用户。

}
通过信号量的同步实现中断、资源分配和管理任务的同步,减少了中断服务程序中的执行时间,有助于提高系统的实时性。

系统分类: 嵌入式
用户分类: vxowrks任务调度
标签: vxworks 任务 通信 信号量
来源: 无分类
发表评论 阅读全文(1276) | 回复(0)

49

关于投票
vxorks调度小结
1  调度的概念
构成应用软件系统的程序集合中,独立的、相互作用的程序单元,在其执行时称之为任务。单个CPU中,多任务机制制造了一个多个任务同时执行的假象。其实系统只是根据一个多任务调度算法,将内核插入到这些任务中执行。任务由系统内核调度运行一段固定长度的时间,称为间片。调度是指为任务分配资源和时间,使系统满足特定的性能要求。调度算法的目的是在正常情况下,尽可能满足所有任务的时限;在峰值负载条件下,保证强实时任务满足时限。因为时限是区分实时系统和非实时系统的关键因素,因此调度算法是实时系统的基本问题。实时操作具有的运行性能,如吞吐量的大小、周转时间的长短、相应的及时性和可预测性等在很大程度上都取决于实时调度。
2 调度的类型
虽然调度的主要 目的都是为了分配处理机,但在不同的OS中所采用的调度方式是完全不同的。在执行调度时所采用的调度算法也可能不同。因此,常按照调度的层次把调度分成高级、中级和低级调度。高级调度又称长程调度或作业调度,用于决定把外存上处于后备队列中的哪些作业调入内存,并为它们创建进程、分配必要的资源,然后再将新创建的