⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 platform.h

📁 uclinux线程的创建、消息队列的创建、信号量、互斥信号量、信号等的创建
💻 H
📖 第 1 页 / 共 2 页
字号:
/*********************************
platform.h
***********************************/
#ifndef _PLATFORM_H_
    #define _PLATFORM_H_


#define USE
#define NO

#define ERROR (-1)
#define OK (0)

#undef NULL
#define NULL 0

#define MUST_BE_ZERO (0)

#define NO_WAIT (0) 
#define WAIT_FOREVER (-1) 
  
/*linux主机上的CLOCKS_PER_SEC为1000000而uclinux上为1000*/

/*tick的间隔时间,以ms为单位*/
#define TICK_INTEVAL_ms (1000/CLOCKS_PER_SEC)

/*tick的间隔时间,以us为单位*/
#define TICK_INTEVAL_us (1000000/CLOCKS_PER_SEC)
  
void  print(char* fmt, ...)
{
    va_list ap;
    
    va_start(ap, fmt);
    vfprintf(stderr, fmt,ap);
    va_end(ap);
}

#define pl() print("%s %d ", __FILE__, __LINE__);

typedef int TASK_ID;
typedef int SEM_ID;
typedef int MSG_Q_ID;

#ifndef __TASK__
/************************************************************************************
                                    发 起 任 务
函数名: taskSpawn()

功能:   发起一个任务

参数:   name        指针类型,任务的名称,仅作为创建任务出错时打印使用

        priority    实时任务的优先级,linux下实时任务的优先级范围为1-99,其中99
                    为最高优先级,但为了适应vxworks及其他实时操作系统的概念,本函数
                    使用1为最高优先级,99为最低优先级。
                    
        options     未使用

        stackSize   指定任务堆栈的大小,且该值必须大于16384Byte

        entryPt     任务的入口函数

        arg1        任务函数的入参, 指针强制转换成的整型值

        arg2        发起任务的类型,可选参数为:
                    SCHED_FIFO  :发起一个先进先出的实时任务,实时系统需要的正是这一类
                                 任务,FIFO任务根据优先级调度,如果没有高优先级任务到
                                 达,则该任务将一直占用cpu,直到主动放弃。
                    SCHED_RR    :发起一个时间片轮转实时任务,是FIFO类型任务的一个补充,
                                 为了保证多个具有相同优先级的实时任务任务具有基本相等
                                 的使用cpu的机会,应将这几个任务设置为本类型。
                    SCHED_OTHER :发起一个分时调度的任务,该任务不具有实时性,优先级也
                                 是最低的,始终给实时任务让道。
    
        arg3-10     未使用
        
返回值: OK          创建任务成功
        ERROR       创建失败
*************************************************************************************/
int taskSpawn
    (
    USE char *  name,      /* 任务的名称 */
    USE int     priority,  /* 实时任务的优先级 1-99,1为高优先级 */
    NO int     options,   /* 选项 */
    USE int     stackSize, /* 任务堆栈的大小 必须大于16384字节*/
    USE void * (*entryPt)(void *),   /* 任务的函数入口 */
    USE int     arg1,      /* 这是一个指针值,任务入口函数的入参 */
    NO int     arg2,    /*任务类型,实时任务可使用SCHED_FIFO和和SCHED_RR*/
    NO int     arg3,   /*下面的参数不使用*/
    NO int     arg4,
    NO int     arg5,
    NO int     arg6,
    NO int     arg7,
    NO int     arg8,
    NO int     arg9,
    NO int     arg10 
    );

/********************************************************************************
                                    删除一个任务
函数名  : taskDelete()

功能    : 删除一个已经存在的任务

参数    : tid       被删除任务的id

返回值  : OK        成功删除任务
          ERROR     删除失败
                                    
*********************************************************************************/
int taskDelete
    (
    int tid /* task ID of task to delete */
    );


/*******************************************************************************
                                     任务延时
函数名  :   taskDelay()

功能    :   任务延时

参数    :   ticks       任务延迟的tick数,arm下如果宏CLOCKS_PER_SECOND设置为100,
                        则每个tick的时长为10ms
                        
返回值  :   OK          设置成功
            ERROR       设置失败
********************************************************************************/
int taskDelay
    (
    int ticks /* number of ticks to delay task */
    );

/********************************************************************************
                                    当前任务的id
函数名  : taskIdSelf()

功能    : 查询当前任务的id

参数    : 无

返回值  : 当前任务id        成功
          ERROR             查询失败
                                    
*********************************************************************************/
int taskIdSelf();



/*用户任务入口*/
void userApp();

/*当linux线程被取消的时候将执行的指定函数*/
#define  taskDeleteHookAdd(deleteHook)\
{\
    struct _pthread_cleanup_buffer  buffer;\
    \
    _pthread_cleanup_push(&buffer, deleteHook, NULL);\
}


/**********************************************************************
注意,linux下无锁定任务切换的函数,只能通过线程互斥方法来
实现,即所有 "用户任务" 在执行前都需要取得该信号量,如果取不
到则永远等待,从而实现让取得信号量的任务一直执行到释放信号量
的地方。
***********************************************************************/
#define taskLock ()\
{\
    semTake(taskLockMutexSem, WAIT_FOREVER);\
}\

#define taskUnLock (void)\
{\
    semGive(taskLockMutexSem);\
}

#endif


#ifndef __MSG_Q__
/*****************************************************************************
                                删除一个消息队列
函数名   : msgQDelete()
  
功能     : 删除linux消息队列
  
参数     : msgQId      需要删除的消息队列的id
    
返回值:    OK(0)       成功返回
            ERROR(-1)   调用失败
******************************************************************************/
int  msgQDelete
    (
    USE MSG_Q_ID  msgQId /* message queue to delete */
    );

/****************************************************************************
                                创建一个消息队列
函数名   : msgQCreate()
  
功能     : 创建一个linux消息队列
  
参数     : maxMsgs      消息队列可容纳的消息个数
            maxMsgLength 单个消息的最大长度
            options      未使用
            
返回值   : 消息队列的id(大于0)       成功返回
            NULL(0)                   调用失败
******************************************************************************/
MSG_Q_ID msgQCreate
    ( 
      USE int maxMsgs, /*最大消息个数*/
      USE int maxMsgLength,/*单个消息最大长度*/
      NO int options/*选项,linux未使用*/
    );


/****************************************************************************
                                向linux消息队列发送消息
函数名   : msgQSend()
  
功能     : 向linux消息队列发送消息
  
参数     : msgQId      消息队列的id.

            buffer      存有消息的缓冲区.
            
            nBytes      发送缓冲中数据的长度.
            
            timeout     发送的超时选项,可选值有二:
                            NO_WAIT     :队列满时,不等待,立即返回错误.
                            WAIT_FOREVER:队列满时将阻塞,直到队列有空间.
                        注:如果传入值不在上面选项中,则认为是WAIT_FOREVER.
                        
            option      未使用
            
返回值   : OK(0)       成功发送
            ERROR(-1)   调用失败
******************************************************************************/
 int msgQSend
    ( 
      USE  MSG_Q_ID msgQId,  /* 队列id */
      USE  char *   buffer,  /* 发送缓冲 */
      USE  unsigned int     nBytes,  /* 缓冲区长度 */
      USE  int      timeout, /* NO_WAIT(队列满时立即返回),
                               WAIT_FOREVER(队列满时将阻塞,直到队列有空间) */
      NO int      option /* 对于linux,该项无效*/
    );

/****************************************************************************
                                从linux消息队列接收消息
函数名   : msgQReceive()
  
功能     : 从linux消息队列接收消息

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -