APEX 服务

更新时间:
2024-09-18
下载文档

APEX 服务

有关 BUFFER 的 APEX 服务底层实现见:

$(MATRIX653_SDK_PATH)/libmatrix653/src/include/arinc653/apex_buffer.h

CREATE_BUFFER

  • 描述:该服务请求用于创建具有最大数量的大小消息的消息缓冲区。

  • 函数原型

extern void CREATE_BUFFER (
    /*in */ BUFFER_NAME_TYPE            BUFFER_NAME,
    /*in */ MESSAGE_SIZE_TYPE           MAX_MESSAGE_SIZE,
    /*in */ MESSAGE_RANGE_TYPE          MAX_NB_MESSAGE,
    /*in */ QUEUING_DISCIPLINE_TYPE     QUEUING_DISCIPLINE,
    /*out*/ BUFFER_ID_TYPE              *BUFFER_ID,
    /*out*/ RETURN_CODE_TYPE            *RETURN_CODE );
  • 参数
输入/输出参数描述
[in]BUFFER_NAME缓冲区名称
[in]MAX_MESSAGE_SIZE消息大小最大值
[in]MAX_NB_MESSAGE最大消息数量
[in]QUEUING_DISCIPLINE进程排列策略
[out]BUFFER_ID缓冲器ID
[out]RETURN_CODE返回值
  • 使用:分区级应用程序中调用 CREATE_BUFFER。

  • 返回状态

返回码对应描述
NO_ERROR调用成功
INVALID_CONFIG没有足够的可用存储空间来创建指定的缓冲区或者已经创建了缓冲区的最大数量
NO_ACTION已经为当前分区创建了名为 BUFFER_NAME 的缓冲区
INVALID_PARAMMAX_MESSAGE_SIZE 为零或负
INVALID_PARAMMAX_NB_MESSAGE 超出范围
INVALID_PARAMQUEUING_DISCIPLINE 无效
INVALID_MODE工作模式为 NORMAL

SEND_BUFFER

  • 描述:该服务请求用于向缓冲区中发送指定消息。

  • 函数原型

extern void SEND_BUFFER (
    /*in */ BUFFER_ID_TYPE             BUFFER_ID,
    /*in */ MESSAGE_ADDR_TYPE          MESSAGE_ADDR,           
    /*in */ MESSAGE_SIZE_TYPE          LENGTH,
    /*in */ SYSTEM_TIME_TYPE           TIME_OUT,
    /*out*/ RETURN_CODE_TYPE           *RETURN_CODE );
  • 参数
输入/输出参数描述
[in]BUFFER_ID缓冲区 ID
[in]MESSAGE_ADDR消息地址
[in]LENGTH消息长度
[in]TIME_OUT时长
[out]RETURN_CODE返回值
  • 使用:分区级应用程序中调用 SEND_BUFFER。

  • 返回状态

返回码对应描述
NO_ERROR调用成功
INVALID_PARAMTIME_OUT 超出范围
INVALID_PARAMBUFFER_ID 不能识别当前分区的现有缓冲区
INVALID_PARAMLENGTH 大于为缓冲区指定 MAX_MESSAGE_SIZE
INVALID_PARAMLENGTH 为零或负
INVALID_MODE工作模式为 NORMAL
NOT_AVAILABLE缓冲区中没有放置消息的地方
TIMED_OUT指定的 TIME_OUT 已过期

RECEIVE_BUFFER

  • 描述:该服务请求用于从指定的缓冲区接收消息。

  • 函数原型

extern void RECEIVE_BUFFER (
    /*in */ BUFFER_ID_TYPE               BUFFER_ID,
    /*in */ SYSTEM_TIME_TYPE             TIME_OUT,
    /*in */ MESSAGE_ADDR_TYPE            MESSAGE_ADDR,
              /* The message address is passed IN, although */
              /* the respective message is passed OUT */
    /*out*/ MESSAGE_SIZE_TYPE            *LENGTH,
    /*out*/ RETURN_CODE_TYPE             *RETURN_CODE );
  • 参数
输入/输出参数描述
[in]BUFFER_ID缓冲区 ID
[in]TIME_OUT时长
[in]MESSAGE_ADDR消息地址
[out]LENGTH长度
[out]RETURN_CODE返回值
  • 使用:分区级应用程序中调用 RECEIVE_BUFFER。

  • 返回状态

返回码对应描述
NO_ERROR调用成功
INVALID_MODE当前进程拥有一个互斥锁或当前进程是错误处理程序进程,TIME_OUT 不为零
INVALID_PARAMBUFFER_ID 不能识别当前分区的现有缓冲区
INVALID_PARAMTIME_OUT 超出范围
NOT_AVAILABLE缓冲区不包含任何消息
TIMED_OUT指定的 TIME_OUT超时

GET_BUFFER_ID

  • 描述:该服务请求用于返回与缓冲区对应的缓冲区标识符。

  • 函数原型

extern void GET_BUFFER_ID (
    /*in */ BUFFER_NAME_TYPE         BUFFER_NAME,
    /*out*/ BUFFER_ID_TYPE           *BUFFER_ID,
    /*out*/ RETURN_CODE_TYPE         *RETURN_CODE );
  • 参数
输入/输出参数描述
[in]BUFFER_NAME缓冲区名称
[out]BUFFER_ID缓冲区ID
[out]RETURN_CODE返回值
  • 使用:分区级应用程序中调用 GET_BUFFER_ID。

  • 返回状态

返回码对应描述
NO_ERROR调用成功
INVALID_CONFIG没有名为 BUFFER_NAME 的当前分区缓冲区

GET_BUFFER_STATUS

  • 描述:该服务请求用于返回指定缓冲区的状态。

  • 函数原型

extern void GET_BUFFER_STATUS (
    /*in */ BUFFER_ID_TYPE               BUFFER_ID,
    /*out*/ BUFFER_STATUS_TYPE           *BUFFER_STATUS,
    /*out*/ RETURN_CODE_TYPE             *RETURN_CODE );
  • 参数
输入/输出参数描述
[in]BUFFER_ID缓冲区标 ID
[out]BUFFER_STATUS缓冲区状态指针
[out]RETURN_CODE返回值
  • 使用:分区级应用程序中调用 GET_BUFFER_STATUS。

  • 返回状态

返回码对应描述
NO_ERROR调用成功
INVALID_PARAMBUFFER_ID 不能识别当前分区的现有缓冲区

使用范例

对于缓冲区的相关操作如下范例所示。

#include <MATRIX653.h>
#include <stdio.h>

static char                 readbuf[128] = {0};
static BUFFER_ID_TYPE       buffID       = 2;
static MESSAGE_ADDR_TYPE    sendbuf      = (unsigned char*)"hello pr2";
static PROCESS_ID_TYPE      PARTITION1_PROCESS1_PROCESS_ID;
static PROCESS_ID_TYPE      PARTITION1_PROCESS2_PROCESS_ID;

BUFFER_STATUS_TYPE          BUFFER_STATUS2;
BUFFER_NAME_TYPE            bName        = "buffer";
MESSAGE_SIZE_TYPE           msgSize      = 128;
MESSAGE_RANGE_TYPE          maxNbSize    = 5;
QUEUING_DISCIPLINE_TYPE     queuintType  = PRIORITY;   /* 按照优先级排队进程 */
RETURN_CODE_TYPE            RETURN_CODE;

static BUFFER_STATUS_TYPE BUFFER_STATUS = {
        .NB_MESSAGE        = 1,
        .MAX_NB_MESSAGE    = 5,
        .MAX_MESSAGE_SIZE  = 128,
        .WAITING_PROCESSES = 1
};

static void PARTITION1_PROCESS1 (void)
{
      SYSTEM_TIME_TYPE   time = 100 * MX_NANOSEC_PER_MILLISEC;
      MESSAGE_SIZE_TYPE  msgSize = 10;

      /*
      * 发送消息
      */
      SEND_BUFFER(buffID, sendbuf, msgSize, time, &RETURN_CODE);
      if (RETURN_CODE != NO_ERROR) {
           return ;
      }
      TIMED_WAIT(2 * MX_NANOSEC_PER_SEC, &RETURN_CODE);
      if (RETURN_CODE != NO_ERROR) {
          printf("TIMED_WAIT retuern code = %d\r\n",RETURN_CODE);
          return ;
      }
}

static void PARTITION1_PROCESS2 (void)
{
    while (MX_TRUE) {
        SYSTEM_TIME_TYPE   time2   = 100 * MX_NANOSEC_PER_MILLISEC;
        MESSAGE_SIZE_TYPE  msgSize = 10;
        RETURN_CODE_TYPE   RETURN_CODE;

        RECEIVE_BUFFER(buffID, time2, 
                       (MESSAGE_ADDR_TYPE)readbuf, 
                       &msgSize, 
                       &RETURN_CODE);
        if (RETURN_CODE != NO_ERROR) {
             return ;
        }

        printf("buffer context: %s\n",readbuf);
        TIMED_WAIT(2 * MX_NANOSEC_PER_SEC, &RETURN_CODE);

        if (RETURN_CODE != NO_ERROR) {
            while (MX_TRUE) {
                printf("come here\n");
            }
        }    
    }        
}            

   … …

int main(void)
{
    RETURN_CODE_TYPE            RETURN_CODE;

    … …

    /*
     * 创建缓冲区
     */
   CREATE_BUFFER(bName,
                 BUFFER_STATUS.MAX_MESSAGE_SIZE,
                 BUFFER_STATUS.MAX_NB_MESSAGE,
                 queuintType,
                 &buffID,
                 &RETURN_CODE);
   printf("CREATE_BUFFER return code = %d\r\n",RETURN_CODE);
   if (RETURN_CODE != NO_ERROR) {
       //return ;
   }

    … …

    SET_PARTITION_MODE(NORMAL, &RETURN_CODE);
    if (RETURN_CODE != NO_ERROR) {
        while (MX_TRUE) {
        }
    }

    while (MX_TRUE) {
        STOP_SELF();
    }
    return 0;
}
文档内容是否对您有所帮助?
有帮助
没帮助