コード例 #1
0
ファイル: InterVectorFlag.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: API_InterVectorGetFlag
** 功能描述: 获得指定中断向量的特性. 
** 输 入  : ulVector                      中断向量号
**           *pulFlag                      特性
** 输 出  : ERROR CODE
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API
ULONG  API_InterVectorGetFlag (ULONG  ulVector, ULONG  *pulFlag)
{
    INTREG              iregInterLevel;
    PLW_CLASS_INTDESC   pidesc;

    if (_Inter_Vector_Invalid(ulVector)) {
        _ErrorHandle(ERROR_KERNEL_VECTOR_NULL);
        return  (ERROR_KERNEL_VECTOR_NULL);
    }
    
    if (!pulFlag) {
        _ErrorHandle(ERROR_KERNEL_MEMORY);
        return  (ERROR_KERNEL_MEMORY);
    }
    
    pidesc = LW_IVEC_GET_IDESC(ulVector);
    
    LW_SPIN_LOCK_QUICK(&pidesc->IDESC_slLock, &iregInterLevel);         /*  关闭中断同时锁住 spinlock   */
    
    *pulFlag = LW_IVEC_GET_FLAG(ulVector);
    
    LW_SPIN_UNLOCK_QUICK(&pidesc->IDESC_slLock, iregInterLevel);        /*  打开中断, 同时打开 spinlock */
    
    return  (ERROR_NONE);
}
コード例 #2
0
ファイル: lwip_if.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: if_up
** 功能描述: 打开网卡
** 输 入  : ifname        if name
** 输 出  : 网卡是否打开
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  if_up (const char *ifname)
{
    INT            iError;
    struct netif  *pnetif;
    
    LWIP_NETIF_LOCK();                                                  /*  进入临界区                  */
    pnetif = netif_find((char *)ifname);
    if (pnetif) {
        if (!(pnetif->flags & NETIF_FLAG_UP)) {
            netifapi_netif_set_up(pnetif);
#if LWIP_DHCP > 0
            if (pnetif->flags2 & NETIF_FLAG2_DHCP) {
                ip_addr_t   inaddrNone;
                lib_bzero(&inaddrNone, sizeof(ip_addr_t));
                netifapi_netif_set_addr(pnetif, &inaddrNone, &inaddrNone, &inaddrNone);
                netifapi_dhcp_start(pnetif);
            }
#endif                                                                  /*  LWIP_DHCP > 0               */
            iError = ERROR_NONE;
        } else {
            _ErrorHandle(EALREADY);
            iError = PX_ERROR;
        }
    } else {
        _ErrorHandle(ENXIO);
        iError = PX_ERROR;
    }
    LWIP_NETIF_UNLOCK();                                                /*  退出临界区                  */
    
    return  (iError);
}
コード例 #3
0
ファイル: lwip_if.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: if_down
** 功能描述: 关闭网卡
** 输 入  : ifname        if name
** 输 出  : 关闭是否成功
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  if_down (const char *ifname)
{
    INT            iError;
    struct netif  *pnetif;
    
    LWIP_NETIF_LOCK();                                                  /*  进入临界区                  */
    pnetif = netif_find((char *)ifname);
    if (pnetif) {
        if (pnetif->flags & NETIF_FLAG_UP) {
#if LWIP_DHCP > 0
            if (pnetif->dhcp && pnetif->dhcp->pcb) {
                netifapi_netif_common(pnetif, NULL, dhcp_release);      /*  解除 DHCP 租约, 同时停止网卡*/
                netifapi_dhcp_stop(pnetif);                             /*  释放资源                    */
            }
#endif                                                                  /*  LWIP_DHCP > 0               */
            netifapi_netif_set_down(pnetif);                            /*  禁用网卡                    */
            iError = ERROR_NONE;
        } else {
            _ErrorHandle(EALREADY);
            iError = PX_ERROR;
        }
    } else {
        _ErrorHandle(ENXIO);
        iError = PX_ERROR;
    }
    LWIP_NETIF_UNLOCK();                                                /*  退出临界区                  */
    
    return  (iError);
}
コード例 #4
0
ファイル: lwip_if.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: if_set_dhcp
** 功能描述: 设置网卡 dhcp 选项 (必须在网卡禁能时设置)
** 输 入  : ifname        if name
**           en            1: 使能 dhcp  0: 禁能 dhcp
** 输 出  : OK or ERROR
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  if_set_dhcp (const char *ifname, int en)
{
    INT     iRet = PX_ERROR;

#if LWIP_DHCP > 0
    struct netif  *pnetif;
    
    LWIP_NETIF_LOCK();                                                  /*  进入临界区                  */
    pnetif = netif_find((char *)ifname);
    if (pnetif) {
        if (pnetif->flags & NETIF_FLAG_UP) {
            _ErrorHandle(EISCONN);
            
        } else {
            if (en) {
                pnetif->flags2 |= NETIF_FLAG2_DHCP;
            } else {
                pnetif->flags2 &= ~NETIF_FLAG2_DHCP;
            }
            iRet = ERROR_NONE;
        }
    } else {
        _ErrorHandle(ENXIO);
    }
    LWIP_NETIF_UNLOCK();                                                /*  退出临界区                  */
#else
    _ErrorHandle(ENOSYS);
#endif                                                                  /*  LWIP_DHCP > 0               */
    
    return  (iRet);
}
コード例 #5
0
/*********************************************************************************************************
** 函数名称: API_InterVectorDisconnect
** 功能描述: 解除系统指定向量中断服务
** 输 入  : ulVector                      中断向量号
**           pfuncIsr                      服务函数
**           pvArg                         服务函数参数
** 输 出  : ERROR CODE
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API
ULONG  API_InterVectorDisconnect (ULONG             ulVector,
                                  PINT_SVR_ROUTINE  pfuncIsr,
                                  PVOID             pvArg)
{
    INTREG              iregInterLevel;
    BOOL                bNeedFree = LW_FALSE;
    
    PLW_LIST_LINE       plineTemp;
    PLW_CLASS_INTACT    piaction;
    PLW_CLASS_INTDESC   pidesc;

    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (ERROR_KERNEL_IN_ISR);
    }
    
    INTER_SHOWLOCK_CREATE();

    if (_Inter_Vector_Invalid(ulVector)) {
        _ErrorHandle(ERROR_KERNEL_VECTOR_NULL);
        return  (ERROR_KERNEL_VECTOR_NULL);
    }
    
    if (pfuncIsr == LW_NULL) {
        _ErrorHandle(ERROR_KERNEL_VECTOR_NULL);
        return  (ERROR_KERNEL_VECTOR_NULL);
    }
    
    INTER_SHOWLOCK_LOCK();

    pidesc = LW_IVEC_GET_IDESC(ulVector);

    LW_SPIN_LOCK_QUICK(&pidesc->IDESC_slLock, &iregInterLevel);         /*  关闭中断同时锁住 spinlock   */
    
    for (plineTemp  = pidesc->IDESC_plineAction;
         plineTemp != LW_NULL;
         plineTemp  = _list_line_get_next(plineTemp)) {
         
        piaction = _LIST_ENTRY(plineTemp, LW_CLASS_INTACT, IACT_plineManage);
        if ((piaction->IACT_pfuncIsr == pfuncIsr) &&
            (piaction->IACT_pvArg    == pvArg)) {
            _List_Line_Del(&piaction->IACT_plineManage,
                           &pidesc->IDESC_plineAction);
            bNeedFree = LW_TRUE;
            break;
        }
    }
    
    LW_SPIN_UNLOCK_QUICK(&pidesc->IDESC_slLock, iregInterLevel);        /*  打开中断, 同时打开 spinlock */
    
    INTER_SHOWLOCK_UNLOCK();
    
    if (bNeedFree) {
        __KHEAP_FREE(piaction);
    }
    
    return  (ERROR_NONE);
}
コード例 #6
0
ファイル: ttinyShell.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: API_TShellKeywordAddEx
** 功能描述: 向 ttiny shell 系统添加一个关键字.
** 输 入  : pcKeyword     关键字
**           pfuncCommand  执行的 shell 函数
**           ulOption      选项
** 输 出  : 错误代码.
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
ULONG  API_TShellKeywordAddEx (CPCHAR  pcKeyword, PCOMMAND_START_ROUTINE  pfuncCommand, ULONG  ulOption)
{
    REGISTER size_t    stStrLen;

    if (__PROC_GET_PID_CUR() != 0) {                                    /*  进程中不能注册命令          */
        _ErrorHandle(ENOTSUP);
        return  (ENOTSUP);
    }
    
    if (!pcKeyword) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcKeyword invalidate.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }
    
    stStrLen = lib_strnlen(pcKeyword, LW_CFG_SHELL_MAX_KEYWORDLEN);
    
    if (stStrLen >= (LW_CFG_SHELL_MAX_KEYWORDLEN + 1)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pcKeyword is too long.\r\n");
        _ErrorHandle(ERROR_TSHELL_EPARAM);
        return  (ERROR_TSHELL_EPARAM);
    }

    return  (__tshellKeywordAdd(pcKeyword, stStrLen, pfuncCommand, ulOption));
}
コード例 #7
0
ファイル: blockRaw.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: API_BlkRawCreate
** 功能描述: 通过 /dev/blk/xxx 块设备生成一个 BLOCK 控制块 (只能内核程序调用).
** 输 入  : pcBlkName     块设备名称
**           bRdOnly       只读
**           bLogic        是否为逻辑分区
**           pblkraw       创建的 blk raw 控制块
** 输 出  : ERROR_NONE or PX_ERROR
** 全局变量:
** 调用模块:
**                                            API 函数
*********************************************************************************************************/
LW_API 
INT  API_BlkRawCreate (CPCHAR  pcBlkName, BOOL  bRdOnly, BOOL  bLogic, PLW_BLK_RAW  pblkraw)
{
    INT         iFlag;
    INT         iRet;
    
    if (!pcBlkName || !pblkraw) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    iFlag = (bRdOnly) ? O_RDONLY : O_RDWR;
    
    lib_bzero(pblkraw, sizeof(LW_BLK_RAW));
    
    pblkraw->BLKRAW_blkd.BLKD_pcName = lib_strdup(pcBlkName);
    if (pblkraw == LW_NULL) {
        _ErrorHandle(ENOMEM);
        return  (PX_ERROR);
    }
    
    __KERNEL_SPACE_ENTER();
    iRet = __blkRawCreate(pblkraw, iFlag, bLogic);
    __KERNEL_SPACE_EXIT();
    
    if (iRet < ERROR_NONE) {
        __SHEAP_FREE(pblkraw);
    }
    
    return  (iRet);
}
コード例 #8
0
ファイル: romFs.c プロジェクト: Ryanxjl/libsylixos-mips
/*********************************************************************************************************
** 函数名称: __romFsPRead
** 功能描述: romfs pread 操作
** 输 入  : pfdentry         文件控制块
**           pcBuffer         接收缓冲区
**           stMaxBytes       接收缓冲区大小
**           oftPos           位置
** 输 出  : 驱动相关
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static ssize_t  __romFsPRead (PLW_FD_ENTRY pfdentry,
                              PCHAR        pcBuffer,
                              size_t       stMaxBytes,
                              off_t        oftPos)
{
    PLW_FD_NODE   pfdnode  = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
    PROM_FILE     promfile = (PROM_FILE)pfdnode->FDNODE_pvFile;
    ssize_t       sstRet;
    
    if (!pcBuffer || !stMaxBytes || (oftPos < 0)) {
        _ErrorHandle(EINVAL);
        return  (0);
    }
    
    if (promfile->ROMFIL_iFileType != __ROMFS_FILE_TYPE_NODE) {
        _ErrorHandle(EISDIR);
        return  (PX_ERROR);
    }
    
    if (__ROMFS_FILE_LOCK(promfile) != ERROR_NONE) {
        _ErrorHandle(ENXIO);
        return  (PX_ERROR);
    }
    sstRet = __rfs_pread(promfile->ROMFIL_promfs, &promfile->ROMFIL_romfsdnt, 
                         pcBuffer, stMaxBytes, (UINT32)oftPos);
    __ROMFS_FILE_UNLOCK(promfile);
    
    return  (sstRet);
}
コード例 #9
0
ファイル: romFs.c プロジェクト: Ryanxjl/libsylixos-mips
/*********************************************************************************************************
** 函数名称: __romFsSeek
** 功能描述: romFs seek 操作
** 输 入  : pfdentry         文件控制块
**           oftOffset        偏移量
** 输 出  : 驱动相关
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static INT  __romFsSeek (PLW_FD_ENTRY  pfdentry,
                         off_t         oftOffset)
{
    PLW_FD_NODE   pfdnode  = (PLW_FD_NODE)pfdentry->FDENTRY_pfdnode;
    PROM_FILE     promfile = (PROM_FILE)pfdnode->FDNODE_pvFile;

    if (promfile->ROMFIL_iFileType != __ROMFS_FILE_TYPE_NODE) {
        return  (PX_ERROR);
    }
    
    if (oftOffset > promfile->ROMFIL_romfsdnt.ROMFSDNT_stat.st_size) {
        _ErrorHandle(EROFS);
        return  (PX_ERROR);
    }
    
    if (__ROMFS_FILE_LOCK(promfile) != ERROR_NONE) {
        _ErrorHandle(ENXIO);
        return  (PX_ERROR);
    }
    
    if (promfile->ROMFIL_iFileType != __ROMFS_FILE_TYPE_NODE) {
        __ROMFS_FILE_UNLOCK(promfile);
        _ErrorHandle(EISDIR);
        return  (PX_ERROR);
    }
    
    pfdentry->FDENTRY_oftPtr = oftOffset;
    
    __ROMFS_FILE_UNLOCK(promfile);
    
    return  (ERROR_NONE);
}
コード例 #10
0
ファイル: GetLastError.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: API_SetLastErrorEx
** 功能描述: 设置指定任务的 errno
** 输 入  : ulId      任务 ID
**           ulError   错误号
** 输 出  : ERROR CODE
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
ULONG  API_SetLastErrorEx (LW_OBJECT_HANDLE  ulId, ULONG  ulError)
{
    REGISTER UINT16             usIndex;
    REGISTER PLW_CLASS_TCB      ptcb;
    
    usIndex = _ObjectGetIndex(ulId);
    
    if (!_ObjectClassOK(ulId, _OBJECT_THREAD)) {
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
    
    if (_Thread_Index_Invalid(usIndex)) {                               /*  检查线程有效性              */
        _ErrorHandle(ERROR_THREAD_NULL);
        return  (ERROR_THREAD_NULL);
    }
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _ErrorHandle(ERROR_THREAD_NULL);
        return  (ERROR_THREAD_NULL);
    }
    
    ptcb = _K_ptcbTCBIdTable[usIndex];
    
    ptcb->TCB_ulLastError = ulError;
    
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    return  (ERROR_NONE);
}
コード例 #11
0
ファイル: ls1x_wdt.c プロジェクト: Ryanxjl/bsploongson1b
/*********************************************************************************************************
** 函数名称: ls1xWatchDogDevAdd
** 功能描述: 创建 WATCH_DOG 设备
** 输 入  : pcName   设备名
** 输 出  : ERROR_CODE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
INT  ls1xWatchDogDevAdd (CPCHAR  cpcName)
{
    PLS1X_WDT_DEV   pwdt;

    pwdt = (PLS1X_WDT_DEV)__SHEAP_ALLOC(sizeof(LS1X_WDT_DEV));
    if (!pwdt) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return    (PX_ERROR);
    }

    lib_memset(pwdt, 0, sizeof(LS1X_WDT_DEV));

    pwdt->WDT_ulPhyAddrBase = BSP_CFG_WDT_BASE;
    pwdt->WDT_time          = time(LW_NULL);

    if (API_IosDevAddEx(&pwdt->WDT_devhdr, cpcName, _G_ils1xWDTDrvNum, DT_CHR) != ERROR_NONE) {
        __SHEAP_FREE(pwdt);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return    (PX_ERROR);
    }

    _ErrorHandle(ERROR_NONE);
    return    (ERROR_NONE);
}
コード例 #12
0
ファイル: ls1x_led.c プロジェクト: Ryanxjl/bsploongson1b
/*********************************************************************************************************
** 函数名称: ls1xLedDevCreate
** 功能描述: 创建 LED 设备
** 输 入  : NONE
**           pcName   设备名
**           uiGpio   GPIO Num
**           bIsOutPutHigh 初始电平
** 输 出  : 错误号
*********************************************************************************************************/
INT  ls1xLedDevCreate (CPCHAR  cpcName, UINT  uiGpio, BOOL  bIsOutPutHigh)
{
    PLS1XLED_DEV  pled;

    pled = (PLS1XLED_DEV)__SHEAP_ALLOC(sizeof(LS1X_LED_DEV));
    if (!pled) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return    (PX_ERROR);
    }

    lib_memset(pled, 0, sizeof(LS1X_LED_DEV));

    pled->LED_uiGpio        = uiGpio;
    pled->LED_bIsOutPutHigh = bIsOutPutHigh;
    pled->LED_time          = time(LW_NULL);

    if (API_IosDevAddEx(&pled->LED_devhdr, cpcName, _G_ils1xLedDrvNum, DT_CHR) != ERROR_NONE) {
        __SHEAP_FREE(pled);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
        return    (PX_ERROR);
    }

    _ErrorHandle(ERROR_NONE);
    return    (ERROR_NONE);
}
コード例 #13
0
ファイル: ramFsLib.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: __ram_move
** 功能描述: ramfs 移动或者重命名一个文件
** 输 入  : pramn            文件节点
**           pcNewName        新的名字
** 输 出  : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
INT  __ram_move (PRAM_NODE  pramn, PCHAR  pcNewName)
{
    PRAM_VOLUME pramfs;
    PRAM_NODE   pramnTemp;
    PRAM_NODE   pramnFather;
    PRAM_NODE   pramnNewFather;
    BOOL        bRoot;
    BOOL        bLast;
    PCHAR       pcTail;
    PCHAR       pcTemp;
    PCHAR       pcFileName;
    
    pramfs      = pramn->RAMN_pramfs;
    pramnFather = pramn->RAMN_pramnFather;
    
    pramnTemp = __ram_open(pramfs, pcNewName, &pramnNewFather, &bRoot, &bLast, &pcTail);
    if (pramnTemp) {
        _ErrorHandle(EEXIST);
        return  (PX_ERROR);
    }
    if (bRoot || (bLast == LW_FALSE)) {                                 /*  新名字指向根或者没有目录    */
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    if (pramnFather != pramnNewFather) {                                /*  目录发生改变                */
        if (pramnFather) {
            _List_Line_Del(&pramn->RAMN_lineBrother, 
                           &pramnFather->RAMN_plineSon);
        } else {
            _List_Line_Del(&pramn->RAMN_lineBrother, 
                           &pramfs->RAMFS_plineSon);
        }
        if (pramnNewFather) {
            _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, 
                                 &pramnNewFather->RAMN_plineSon);
        } else {
            _List_Line_Add_Ahead(&pramn->RAMN_lineBrother, 
                                 &pramfs->RAMFS_plineSon);
        }
    }
    
    pcFileName = lib_rindex(pcNewName, PX_DIVIDER);
    if (pcFileName) {
        pcFileName++;
    } else {
        pcFileName = pcNewName;
    }
    
    pcTemp = (PCHAR)__SHEAP_ALLOC(lib_strlen(pcFileName) + 1);
    if (pcTemp == LW_NULL) {
        _ErrorHandle(ENOMEM);
        return  (PX_ERROR);
    }
    lib_strcpy(pcTemp, pcFileName);
    __SHEAP_FREE(pramn->RAMN_pcName);
    pramn->RAMN_pcName = pcTemp;
    
    return  (ERROR_NONE);
}
コード例 #14
0
ファイル: ttinyShell.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: API_TShellGetOption
** 功能描述: 获取新的 shell 选项.
** 输 入  : hTShellHandle   shell 线程
**           pulOpt          shell 选项
** 输 出  : 错误代码.
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  API_TShellGetOption (LW_OBJECT_HANDLE  hTShellHandle, ULONG  *pulOpt)
{
    PLW_CLASS_TCB   ptcbShell;
    UINT16          usIndex;
    
    if (!pulOpt) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    usIndex = _ObjectGetIndex(hTShellHandle);
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(hTShellHandle, _OBJECT_THREAD)) {               /*  检查 ID 类型有效性          */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (PX_ERROR);
    }
#endif

    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (PX_ERROR);
    }
    
    ptcbShell = __GET_TCB_FROM_INDEX(usIndex);
    *pulOpt   = __TTINY_SHELL_GET_OPT(ptcbShell);
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    return  (ERROR_NONE);
}
コード例 #15
0
ファイル: ThreadCancel.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: API_ThreadCancel
** 功能描述: 取消一个指定的线程
** 输 入  : ulId                          线程句柄
** 输 出  : ERROR_NONE or ESRCH
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
ULONG  API_ThreadCancel (LW_OBJECT_HANDLE  *pulId)
{
             INTREG                iregInterLevel;
    REGISTER LW_OBJECT_HANDLE      ulId;
    REGISTER UINT16                usIndex;
    REGISTER PLW_CLASS_TCB         ptcbDel;

    ulId = *pulId;
    
    usIndex = _ObjectGetIndex(ulId);
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(ulId, _OBJECT_THREAD)) {                        /*  检查 ID 类型有效性          */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
    
    if (_Thread_Index_Invalid(usIndex)) {                               /*  检查线程有效性              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_THREAD_NULL);
        return  (ERROR_THREAD_NULL);
    }
#endif

    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_THREAD_NULL);
        return  (ERROR_THREAD_NULL);
    }
    
    iregInterLevel = KN_INT_DISABLE();
    
    ptcbDel = _K_ptcbTCBIdTable[usIndex];
    if (ptcbDel->TCB_iCancelState == LW_THREAD_CANCEL_ENABLE) {         /*  允许 CANCEL                 */
        if (ptcbDel->TCB_iCancelType == LW_THREAD_CANCEL_DEFERRED) {    /*  延迟 CANCEL                 */
            ptcbDel->TCB_bCancelRequest = LW_TRUE;                      /*  目标线程进入下一个 TEST 点  */
            __KERNEL_EXIT_IRQ(iregInterLevel);                          /*  退出内核并打开中断          */
        
        } else {                                                        /*  异步取消                    */
            __KERNEL_EXIT_IRQ(iregInterLevel);                          /*  退出内核并打开中断          */
#if LW_CFG_SIGNAL_EN > 0
            kill(ulId, SIGCANCEL);                                      /*  立即发送取消信号            */
#else
            return  (API_ThreadDelete(ulId, LW_NULL));
#endif                                                                  /*  LW_CFG_SIGNAL_EN > 0        */
        }
    
    } else {
        __KERNEL_EXIT_IRQ(iregInterLevel);                              /*  退出内核并打开中断          */
        _ErrorHandle(ERROR_THREAD_DISCANCEL);                           /*  不允许 CACNCEL              */
        return  (ERROR_THREAD_DISCANCEL);
    }
    
    return  (ERROR_NONE);
}
コード例 #16
0
ファイル: yaffs_sylixosproc.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: __procFsYaffsRead
** 功能描述: procfs 读一个 yaffs 文件
** 输 入  : p_pfsn        节点控制块
**           pcBuffer      缓冲区
**           stMaxBytes    缓冲区大小
**           oft           文件指针
** 输 出  : 实际读取的数目
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static ssize_t  __procFsYaffsRead (PLW_PROCFS_NODE  p_pfsn, 
                                   PCHAR            pcBuffer, 
                                   size_t           stMaxBytes,
                                   off_t            oft)
{
    REGISTER PCHAR      pcFileBuffer;
             size_t     stRealSize;                                     /*  实际的文件内容大小          */
             size_t     stCopeBytes;

    /*
     *  程序运行到这里, 文件缓冲一定已经分配了预置的内存大小.
     */
    pcFileBuffer = (PCHAR)API_ProcFsNodeBuffer(p_pfsn);
    if (pcFileBuffer == LW_NULL) {
        _ErrorHandle(ENOMEM);
        return  (0);
    }
    
    stRealSize = API_ProcFsNodeGetRealFileSize(p_pfsn);
    if (stRealSize == 0) {                                              /*  需要生成文件                */
        /*
         *  在这里生成文件的内容
         */
        INT                 i = 0;
        PCHAR               pcVolName;
        struct yaffs_dev   *pyaffsDev;                                  /*  yaffs 挂载设备              */
        
        do {
            pcVolName = yaffs_getdevname(i, &i);
            if (pcVolName == LW_NULL) {
                break;                                                  /*  没有其他的卷                */
            }
            pyaffsDev = (struct yaffs_dev *)yaffs_getdev(pcVolName);
            if (pyaffsDev == LW_NULL) {
                break;                                                  /*  无法查询到设备节点          */
            }
            
            /*
             *  (__PROCFS_BUFFER_SIZE_YAFFS - stRealSize) 为文件缓冲区剩余的空间大小
             */
            stRealSize = __procFsYaffsPrint(pyaffsDev, 
                                            pcVolName,
                                            pcFileBuffer,
                                            __PROCFS_BUFFER_SIZE_YAFFS,
                                            stRealSize);
        } while (i != PX_ERROR);
    
        API_ProcFsNodeSetRealFileSize(p_pfsn, stRealSize);              /*  回写文件实际大小            */
    }
    if (oft >= stRealSize) {
        _ErrorHandle(ENOSPC);
        return  (0);
    }
    
    stCopeBytes  = __MIN(stMaxBytes, (size_t)(stRealSize - oft));       /*  计算实际拷贝的字节数        */
    lib_memcpy(pcBuffer, (CPVOID)(pcFileBuffer + oft), (UINT)stCopeBytes);
    
    return  ((ssize_t)stCopeBytes);
}
コード例 #17
0
ファイル: can.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: __canWrite
** 功能描述: 写 CAN 设备
** 输 入  :
**           pcanDev          CAN 设备
**           pcanframe        写缓冲区指针
**           stNbyte          发送缓冲区字节数
** 输 出  : 返回实际写入的个数
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static ssize_t __canWrite (__CAN_DEV        *pcanDev,
                           PCAN_FRAME        pcanframe,
                           size_t            stNbyte)
{

    INTREG         iregInterLevel;
    INT            iFrameput;
    INT            i = 0;
    ULONG          ulError;
    __CAN_PORT    *pcanport = (__CAN_PORT *)pcanDev;
    size_t         stNumber = stNbyte / sizeof(CAN_FRAME);              /*  转换为数据包个数            */

    while (stNumber > 0) {
        ulError = API_SemaphoreBPend(pcanDev->CAN_ulSendSemB,
                                     pcanDev->CAN_ulSendTimeout);
        if (ulError) {
            _ErrorHandle(ERROR_IO_DEVICE_TIMEOUT);                      /*   超时                       */
            return  ((ssize_t)(i * sizeof(CAN_FRAME)));
        }

        CANDEV_LOCK(pcanDev);                                           /*  等待设备使用权              */

        LW_SPIN_LOCK_QUICK(&pcanDev->CAN_slLock, &iregInterLevel);
        if (pcanDev->CAN_uiBusState != CAN_DEV_BUS_ERROR_NONE) {        /*  总线错误                    */
            LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel);
            CANDEV_UNLOCK(pcanDev);
            _ErrorHandle(EIO);
            return  ((ssize_t)(i * sizeof(CAN_FRAME)));
        }
        LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel);

        iFrameput = __canWriteQueue(pcanDev,
                                    pcanDev->CAN_pcanqSendQueue,
                                    pcanframe,
                                    (INT)stNumber);

        __canTxStartup(pcanport);                                       /*  启动一次发送                */

        stNumber  -= (size_t)iFrameput;                                 /*  剩余需要发送的数据          */
        pcanframe += iFrameput;                                         /*  新的缓冲区起始地址          */
        i         += iFrameput;

        LW_SPIN_LOCK_QUICK(&pcanDev->CAN_slLock, &iregInterLevel);
        /*  关闭中断                    */
        if (__canQFreeNum(pcanDev->CAN_pcanqSendQueue) > 0) {
            LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel); /*  打开中断                    */
            API_SemaphoreBPost(pcanDev->CAN_ulSendSemB);                /*  缓冲区还有空间              */

        } else {
            LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel);
            /*  打开中断                    */
        }

        CANDEV_UNLOCK(pcanDev);                                         /*  释放设备使用权              */
    }

    return  ((ssize_t)(i * sizeof(CAN_FRAME)));
}
コード例 #18
0
ファイル: signal.c プロジェクト: Ryanxjl/libsylixos-mips
/*********************************************************************************************************
** 函数名称: sigwaitinfo
** 功能描述: 等待 sigset 内信号的到来,以串行的方式从信号队列中取出信号进行处理, 信号将不再被执行.
** 输 入  : psigset       指定的信号集
**           psiginfo      获取的信号信息
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  sigwaitinfo (const sigset_t *psigset, struct  siginfo  *psiginfo)
{
             INTREG             iregInterLevel;
             PLW_CLASS_TCB      ptcbCur;
    REGISTER PLW_CLASS_PCB      ppcb;
    
             INT                    iSigNo;
             PLW_CLASS_SIGCONTEXT   psigctx;
             struct siginfo         siginfo;
             LW_CLASS_SIGWAIT       sigwt;
    
    if (!psigset) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    __THREAD_CANCEL_POINT();                                            /*  测试取消点                  */
    
    LW_TCB_GET_CUR_SAFE(ptcbCur);                                       /*  当前任务控制块              */
    
    MONITOR_EVT_D2(MONITOR_EVENT_ID_SIGNAL, MONITOR_EVENT_SIGNAL_SIGWAIT, 
                   ptcbCur->TCB_ulId, *psigset, LW_NULL);
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    psigctx = _signalGetCtx(ptcbCur);
    
    iSigNo = _sigPendGet(psigctx, psigset, &siginfo);                   /*  检查当前是否有等待的信号    */
    if (__issig(iSigNo)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        if (psiginfo) {
            *psiginfo = siginfo;
        }
        return  (siginfo.si_signo);
    }
    
    iregInterLevel = KN_INT_DISABLE();                                  /*  关闭中断                    */
    ptcbCur->TCB_usStatus |= LW_THREAD_STATUS_SIGNAL;                   /*  等待信号                    */
    ppcb = _GetPcb(ptcbCur);
    __DEL_FROM_READY_RING(ptcbCur, ppcb);                               /*  从就绪表中删除              */
    KN_INT_ENABLE(iregInterLevel);                                      /*  打开中断                    */
    
    sigwt.SIGWT_sigset = *psigset;
    psigctx->SIGCTX_sigwait = &sigwt;                                   /*  保存等待信息                */
    
    if (__KERNEL_EXIT()) {                                              /*  是否其他信号激活            */
        psigctx->SIGCTX_sigwait = LW_NULL;
        _ErrorHandle(EINTR);                                            /*  SA_RESTART 也退出           */
        return  (PX_ERROR);
    }
    
    psigctx->SIGCTX_sigwait = LW_NULL;
    if (psiginfo) {
        *psiginfo = sigwt.SIGWT_siginfo;
    }
    
    return  (sigwt.SIGWT_siginfo.si_signo);
}
コード例 #19
0
ファイル: can.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: __canRead
** 功能描述: 读 CAN 设备
** 输 入  :
**           pcanDev          CAN 设备
**           pcanframe        CAN发送缓冲区指针
**           stNbyte          读取缓冲区的字节数
** 输 出  : 返回实际读取的个数
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static ssize_t __canRead (__CAN_DEV       *pcanDev,
                          PCAN_FRAME       pcanframe,
                          size_t           stNbyte)
{
    INTREG        iregInterLevel;

    REGISTER ssize_t      sstNRead;
    size_t       stNumber = stNbyte / sizeof(CAN_FRAME);       /*  转换为数据包个数            */
    ULONG        ulError;

    for (;;) {
        ulError = API_SemaphoreBPend(pcanDev->CAN_ulRcvSemB,
                                     pcanDev->CAN_ulRecvTimeout);
        if (ulError) {
            _ErrorHandle(ERROR_IO_DEVICE_TIMEOUT);                       /*  超时                        */
            return   (0);
        }

        CANDEV_LOCK(pcanDev);                                           /*  等待设备使用权              */

        LW_SPIN_LOCK_QUICK(&pcanDev->CAN_slLock, &iregInterLevel);
        /*  关闭中断                    */
        if (__canQCount(pcanDev->CAN_pcanqRecvQueue)) {                 /*  检查是否有数据              */
            break;

        } else {
            if (pcanDev->CAN_uiBusState != CAN_DEV_BUS_ERROR_NONE) {    /*  总线错误                    */
                LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel);
                CANDEV_UNLOCK(pcanDev);
                _ErrorHandle(EIO);
                return  (0);
            }
        }
        LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel);
        /*  打开中断                    */
        CANDEV_UNLOCK(pcanDev);                                         /*  释放设备使用权              */
    }

    LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel);
    sstNRead = __canReadQueue(pcanDev,
                              pcanDev->CAN_pcanqRecvQueue,
                              pcanframe,
                              (INT)stNumber);
    LW_SPIN_LOCK_QUICK(&pcanDev->CAN_slLock, &iregInterLevel);

    if (__canQCount(pcanDev->CAN_pcanqRecvQueue)) {                     /*  是否还有数据                */
        LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel);
        API_SemaphoreBPost(pcanDev->CAN_ulRcvSemB);                     /*  通知其他等待读的线程        */

    } else {
        LW_SPIN_UNLOCK_QUICK(&pcanDev->CAN_slLock, iregInterLevel);
    }

    CANDEV_UNLOCK(pcanDev);                                             /*  释放设备使用权              */

    return  (sstNRead * sizeof(CAN_FRAME));
}
コード例 #20
0
ファイル: procFssup.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: __procFssupRootfsRead
** 功能描述: procfs 读一个根文件系统信息 proc 文件
** 输 入  : p_pfsn        节点控制块
**           pcBuffer      缓冲区
**           stMaxBytes    缓冲区大小
**           oft           文件指针
** 输 出  : 实际读取的数目
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static ssize_t  __procFssupStatRead (PLW_PROCFS_NODE  p_pfsn, 
                                     PCHAR            pcBuffer, 
                                     size_t           stMaxBytes,
                                     off_t            oft)
{
    REGISTER PCHAR      pcFileBuffer;
             size_t     stRealSize;                                     /*  实际的文件内容大小          */
             size_t     stCopeBytes;

    /*
     *  程序运行到这里, 文件缓冲一定已经分配了预置的内存大小(创建节点时预置大小为 64 字节).
     */
    pcFileBuffer = (PCHAR)API_ProcFsNodeBuffer(p_pfsn);
    if (pcFileBuffer == LW_NULL) {
        _ErrorHandle(ENOMEM);
        return  (0);
    }
     
    stRealSize = API_ProcFsNodeGetRealFileSize(p_pfsn);
    if (stRealSize == 0) {                                              /*  需要生成文件                */
        struct statfs  statfsBuf;
        PCHAR          pcFs;
        
        if (p_pfsn->PFSN_p_pfsnoFuncs == &_G_pfsnoFssupRootfsFuncs) {
            pcFs = "/";
        } else if (p_pfsn->PFSN_p_pfsnoFuncs == &_G_pfsnoFssupProcfsFuncs) {
            pcFs = "/proc";
        } else {
            pcFs = "/";                                                 /*  不可能运行到这里            */
        }
        
        if (statfs(pcFs, &statfsBuf) < ERROR_NONE) {
            stRealSize = bnprintf(pcFileBuffer, 
                                  __PROCFS_BUFFER_SIZE_ROOTFS, 0,
                                  "get root file system status error.");
        } else {
            stRealSize = bnprintf(pcFileBuffer, 
                                  __PROCFS_BUFFER_SIZE_ROOTFS, 0,
                                  "memory used : %ld bytes\n"
                                  "total files : %ld\n",
                                  (ULONG)(statfsBuf.f_bsize * statfsBuf.f_blocks),
                                  statfsBuf.f_files);
        }
        API_ProcFsNodeSetRealFileSize(p_pfsn, stRealSize);
    }
    if (oft >= stRealSize) {
        _ErrorHandle(ENOSPC);
        return  (0);
    }
    
    stCopeBytes  = __MIN(stMaxBytes, (size_t)(stRealSize - oft));       /*  计算实际拷贝的字节数        */
    lib_memcpy(pcBuffer, (CPVOID)(pcFileBuffer + oft), (UINT)stCopeBytes);
    
    return  ((ssize_t)stCopeBytes);
}
コード例 #21
0
ファイル: hotplugDev.c プロジェクト: Ryanxjl/libsylixos-mips
/*********************************************************************************************************
** 函数名称: _hotplugOpen
** 功能描述: 打开热插拔消息设备
** 输 入  : photplugdev      热插拔消息设备
**           pcName           名称
**           iFlags           方式
**           iMode            方法
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static LONG  _hotplugOpen (PLW_HOTPLUG_DEV photplugdev, 
                           PCHAR           pcName,
                           INT             iFlags, 
                           INT             iMode)
{
    PLW_HOTPLUG_FILE  photplugfil;

    if (pcName == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "device name invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
        return  (PX_ERROR);
    
    } else {
        if (iFlags & O_CREAT) {
            _ErrorHandle(ERROR_IO_FILE_EXIST);                          /*  不能重复创建                */
            return  (PX_ERROR);
        }
        
        photplugfil = (PLW_HOTPLUG_FILE)__SHEAP_ALLOC(sizeof(LW_HOTPLUG_FILE));
        if (!photplugfil) {
__nomem:
            _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
            return  (PX_ERROR);
        }
        
        photplugfil->HOTPFIL_iFlag = iFlags;
        photplugfil->HOTPFIL_iMsg  = LW_HOTPLUG_MSG_ALL;
        photplugfil->HOTPFIL_pbmsg = _bmsgCreate(LW_CFG_HOTPLUG_DEV_DEFAULT_BUFSIZE);
        if (photplugfil->HOTPFIL_pbmsg == LW_NULL) {
            __SHEAP_FREE(photplugfil);
            goto    __nomem;
        }
        
        photplugfil->HOTPFIL_ulReadSync = API_SemaphoreBCreate("hotplug_rsync", LW_FALSE,
                                                               LW_OPTION_OBJECT_GLOBAL,
                                                               LW_NULL);
        if (photplugfil->HOTPFIL_ulReadSync == LW_OBJECT_HANDLE_INVALID) {
            _bmsgDelete(photplugfil->HOTPFIL_pbmsg);
            __SHEAP_FREE(photplugfil);
            return  (PX_ERROR);
        }
        
        HOTPLUG_DEV_LOCK();
        _List_Line_Add_Tail(&photplugfil->HOTPFIL_lineManage,
                            &_G_hotplugdev.HOTPDEV_plineFile);
        HOTPLUG_DEV_UNLOCK();
        
        LW_DEV_INC_USE_COUNT(&_G_hotplugdev.HOTPDEV_devhdrHdr);
        
        return  ((LONG)photplugfil);
    }
}
コード例 #22
0
ファイル: RegionAddMem.c プロジェクト: Ga-vin/libsylixos
LW_API  
ULONG  API_RegionAddMem (LW_OBJECT_HANDLE  ulId, PVOID  pvMem, size_t  stByteSize)
{
    REGISTER PLW_CLASS_HEAP            pheap;
    REGISTER UINT16                    usIndex;
    
    usIndex = _ObjectGetIndex(ulId);
    
    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (ERROR_KERNEL_IN_ISR);
    }
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!pvMem || !_Addresses_Is_Aligned(pvMem)) {                      /*  检查地址是否对齐            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pvLowAddr is not aligned.\r\n");
        _ErrorHandle(ERROR_KERNEL_MEMORY);
        return  (ERROR_KERNEL_MEMORY);
    }
    
    if (_Heap_ByteSize_Invalid(stByteSize)) {                           /*  分段太小                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "ulRegionByteSize is too low.\r\n");
        _ErrorHandle(ERROR_REGION_SIZE);
        return  (ERROR_REGION_SIZE);
    }
    
    if (!_ObjectClassOK(ulId, _OBJECT_REGION)) {                        /*  对象类型检查                */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Heap_Index_Invalid(usIndex)) {                                 /*  缓冲区索引检查              */
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
#else
    __KERNEL_ENTER();                                                   /*  进入内核                    */
#endif

    pheap = &_K_heapBuffer[usIndex];

    __KERNEL_EXIT();                                                    /*  退出内核                    */

    _HeapAddMemory(pheap, pvMem, stByteSize);
    
    return  (ERROR_NONE);
}
コード例 #23
0
ファイル: RmsGetName.c プロジェクト: Ga-vin/libsylixos
LW_API  
ULONG  API_RmsGetName (LW_OBJECT_HANDLE  ulId, PCHAR  pcName)
{
    REGISTER PLW_CLASS_RMS       prms;
    REGISTER UINT16              usIndex;
    
    usIndex = _ObjectGetIndex(ulId);
    
    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (ERROR_KERNEL_IN_ISR);
    }
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!pcName) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "name invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_PNAME_NULL);
        return  (ERROR_KERNEL_PNAME_NULL);
    }
    
    if (!_ObjectClassOK(ulId, _OBJECT_RMS)) {                           /*  对象类型检查                */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "RMS handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
    
    if (_Rms_Index_Invalid(usIndex)) {                                  /*  缓冲区索引检查              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "RMS handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Rms_Type_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "RMS handle invalidate.\r\n");
        _ErrorHandle(ERROR_RMS_NULL);
        return  (ERROR_RMS_NULL);
    }
#else
    __KERNEL_ENTER();                                                   /*  进入内核                    */
#endif

    prms = &_K_rmsBuffer[usIndex];
    
    lib_strcpy(pcName, prms->RMS_cRmsName);
    
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    return  (ERROR_NONE);
}
コード例 #24
0
ファイル: hotplugDev.c プロジェクト: Ryanxjl/libsylixos-mips
/*********************************************************************************************************
** 函数名称: _hotplugRead
** 功能描述: 读热插拔消息文件
** 输 入  : photplugfil      热插拔消息文件
**           pcBuffer         接收缓冲区
**           stMaxBytes       接收缓冲区大小
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static ssize_t  _hotplugRead (PLW_HOTPLUG_FILE  photplugfil, 
                              PCHAR             pcBuffer, 
                              size_t            stMaxBytes)
{
    ULONG      ulErrCode;
    ULONG      ulTimeout;
    size_t     stMsgLen;
    ssize_t    sstRet;

    if (!pcBuffer || !stMaxBytes) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    if (photplugfil->HOTPFIL_iFlag & O_NONBLOCK) {                      /*  非阻塞 IO                   */
        ulTimeout = LW_OPTION_NOT_WAIT;
    } else {
        ulTimeout = LW_OPTION_WAIT_INFINITE;
    }

    for (;;) {
        ulErrCode = API_SemaphoreBPend(photplugfil->HOTPFIL_ulReadSync, /*  等待数据有效                */
                                       ulTimeout);
        if (ulErrCode != ERROR_NONE) {                                  /*  超时                        */
            _ErrorHandle(EAGAIN);
            return  (0);
        }
        
        HOTPLUG_DEV_LOCK();
        stMsgLen = (size_t)_bmsgNBytesNext(photplugfil->HOTPFIL_pbmsg);
        if (stMsgLen > stMaxBytes) {
            HOTPLUG_DEV_UNLOCK();
            API_SemaphoreBPost(photplugfil->HOTPFIL_ulReadSync);
            _ErrorHandle(EMSGSIZE);                                     /*  缓冲区太小                  */
            return  (PX_ERROR);
        
        } else if (stMsgLen) {
            break;                                                      /*  数据可读                    */
        }
        HOTPLUG_DEV_UNLOCK();
    }
    
    sstRet = (ssize_t)_bmsgGet(photplugfil->HOTPFIL_pbmsg, pcBuffer, stMaxBytes);
    
    if (!_bmsgIsEmpty(photplugfil->HOTPFIL_pbmsg)) {
        API_SemaphoreBPost(photplugfil->HOTPFIL_ulReadSync);
    }
    
    HOTPLUG_DEV_UNLOCK();
    
    return  (sstRet);
}
コード例 #25
0
ファイル: eventfdDev.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: _evtfdOpen
** 功能描述: 打开 eventfd 设备
** 输 入  : pevtfddev        eventfd 设备
**           pcName           名称
**           iFlags           方式
**           iMode            方法
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static LONG  _evtfdOpen (PLW_EVTFD_DEV pevtfddev, 
                         PCHAR         pcName,
                         INT           iFlags, 
                         INT           iMode)
{
    PLW_EVTFD_FILE  pevtfdfil;

    if (pcName == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "device name invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH);
        return  (PX_ERROR);
    
    } else {
        if (iFlags & O_CREAT) {
            _ErrorHandle(ERROR_IO_FILE_EXIST);
            return  (PX_ERROR);
        }
        
        pevtfdfil = (PLW_EVTFD_FILE)__SHEAP_ALLOC(sizeof(LW_EVTFD_FILE));
        if (!pevtfdfil) {
            _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
            _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);
            return  (PX_ERROR);
        }
        
        pevtfdfil->EF_iFlag      = iFlags;
        pevtfdfil->EF_ulReadLock = API_SemaphoreBCreate("evtfd_rlock", LW_FALSE, 
                                                        LW_OPTION_OBJECT_GLOBAL, LW_NULL);
        if (pevtfdfil->EF_ulReadLock == LW_OBJECT_HANDLE_INVALID) {
            __SHEAP_FREE(pevtfdfil);
            return  (PX_ERROR);
        }
        pevtfdfil->EF_ulWriteLock = API_SemaphoreBCreate("evtfd_wlock", LW_TRUE, 
                                                         LW_OPTION_OBJECT_GLOBAL, LW_NULL);
        if (pevtfdfil->EF_ulWriteLock == LW_OBJECT_HANDLE_INVALID) {
            API_SemaphoreBDelete(&pevtfdfil->EF_ulReadLock);
            __SHEAP_FREE(pevtfdfil);
            return  (PX_ERROR);
        }
        
        pevtfdfil->EF_u64Counter = 0ull;
        
        lib_bzero(&pevtfdfil->EF_selwulist, sizeof(LW_SEL_WAKEUPLIST));
        pevtfdfil->EF_selwulist.SELWUL_hListLock = _G_hEvtfdSelMutex;
        
        LW_SPIN_INIT(&pevtfdfil->EF_slLock);
        
        LW_DEV_INC_USE_COUNT(&_G_evtfddev.ED_devhdrHdr);
        
        return  ((LONG)pevtfdfil);
    }
}
コード例 #26
0
ファイル: ramFsLib.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: __ram_automem
** 功能描述: ramfs 根据需要设置文件缓冲区
** 输 入  : pramn            文件节点
**           ulNBlk           需求缓冲数量
**           stStart          在此范围内不清零
**           stLen
** 输 出  : 增长结果
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static INT  __ram_automem (PRAM_NODE  pramn, ULONG  ulNBlk, size_t  stStart, size_t  stLen)
{
    ULONG           i;
    ULONG           ulNeedAllocBlk;
    PRAM_VOLUME     pramfs = pramn->RAMN_pramfs;
    size_t          stCur;
    
    if (ulNBlk <= pramn->RAMN_ulCnt) {                                  /*  实际数目够用                */
        return  (ERROR_NONE);
    
    } else {                                                            /*  需要增加块                  */
        PRAM_BUFFER     pramb;
        
        ulNeedAllocBlk = ulNBlk - pramn->RAMN_ulCnt;
        if ((ulNeedAllocBlk + pramfs->RAMFS_ulCurBlk) > 
            pramfs->RAMFS_ulMaxBlk) {                                   /*  超过文件系统大小限制        */
            _ErrorHandle(ENOSPC);
            return  (PX_ERROR);
        }
        
        stCur = (size_t)pramn->RAMN_ulCnt * __RAM_BDATASIZE;
        
        for (i = 0; i < ulNeedAllocBlk; i++) {
            pramb = (PRAM_BUFFER)__RAM_BALLOC(__RAM_BSIZE);
            if (pramb == LW_NULL) {
                _ErrorHandle(ENOSPC);
                return  (PX_ERROR);
            }
            
            if (((stCur < stStart) && ((stCur + __RAM_BDATASIZE) <= stStart)) ||
                ((stCur > stStart) && (stCur >= (stStart + stLen)))) {  /*  判断数据区是否要清零        */
                lib_bzero(pramb->RAMB_ucData, __RAM_BDATASIZE);
            }
            
            if (pramn->RAMN_plineBEnd) {                                /*  存在末尾块                  */
                _List_Line_Add_Right(&pramb->RAMB_lineManage,
                                     pramn->RAMN_plineBEnd);
                pramn->RAMN_plineBEnd = &pramb->RAMB_lineManage;
            
            } else {                                                    /*  没有缓冲                    */
                _List_Line_Add_Ahead(&pramb->RAMB_lineManage,
                                     &pramn->RAMN_plineBStart);
                pramn->RAMN_plineBEnd = pramn->RAMN_plineBStart;
            }
            
            pramfs->RAMFS_ulCurBlk++;
            pramn->RAMN_ulCnt++;
        }
        
        return  (ERROR_NONE);
    }
}
コード例 #27
0
ファイル: RegionGet.c プロジェクト: Ga-vin/libsylixos
LW_API  
PVOID  API_RegionGet (LW_OBJECT_HANDLE  ulId, size_t  stByteSize)
{
    REGISTER PLW_CLASS_HEAP            pheap;
    REGISTER UINT16                    usIndex;
    REGISTER PVOID                     pvAllocate;
    
    usIndex = _ObjectGetIndex(ulId);
    
    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (LW_NULL);
    }
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!stByteSize) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "ulByteSize invalidate\r\n");
        _ErrorHandle(ERROR_REGION_SIZE);
        return  (LW_NULL);
    }
    
    if (!_ObjectClassOK(ulId, _OBJECT_REGION)) {                        /*  对象类型检查                */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (LW_NULL);
    }
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Heap_Index_Invalid(usIndex)) {                                 /*  缓冲区索引检查              */
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (LW_NULL);
    }
#else
    __KERNEL_ENTER();                                                   /*  进入内核                    */
#endif

    pheap = &_K_heapBuffer[usIndex];

    __KERNEL_EXIT();                                                    /*  退出内核                    */

    pvAllocate = _HeapAllocate(pheap, stByteSize, __func__);
    
    if (!pvAllocate) {                                                  /*  是否分配成功                */
        _ErrorHandle(ERROR_REGION_NULL);
    }
    
    return  (pvAllocate);
}
コード例 #28
0
ファイル: signal.c プロジェクト: Ryanxjl/libsylixos-mips
/*********************************************************************************************************
** 函数名称: sigsuspend
** 功能描述: 使用指定的掩码等待一个有效信号的到来, 然后返回先前的信号掩码.
** 输 入  : psigsetMask        指定的信号掩码
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  sigsuspend (const sigset_t  *psigsetMask)
{
             INTREG         iregInterLevel;
             PLW_CLASS_TCB  ptcbCur;
    REGISTER PLW_CLASS_PCB  ppcb;
             BOOL           bIsRun;
    
             PLW_CLASS_SIGCONTEXT   psigctx;
             sigset_t               sigsetOld;
             
    if (!psigsetMask) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    __THREAD_CANCEL_POINT();                                            /*  测试取消点                  */
    
    LW_TCB_GET_CUR_SAFE(ptcbCur);                                       /*  当前任务控制块              */
    
    MONITOR_EVT_D2(MONITOR_EVENT_ID_SIGNAL, MONITOR_EVENT_SIGNAL_SIGSUSPEND, 
                   ptcbCur->TCB_ulId, *psigsetMask, LW_NULL);
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    psigctx = _signalGetCtx(ptcbCur);
    
    sigsetOld = psigctx->SIGCTX_sigsetSigBlockMask;                     /*  记录先前的掩码              */
    psigctx->SIGCTX_sigsetSigBlockMask = *psigsetMask & (~__SIGNO_UNMASK);
    
    bIsRun = _sigPendRun(ptcbCur);
    if (bIsRun) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        sigprocmask(SIG_SETMASK, &sigsetOld, LW_NULL);                  /*  设置为原先的 mask           */
        
        _ErrorHandle(EINTR);
        return  (PX_ERROR);
    }
    
    iregInterLevel = KN_INT_DISABLE();                                  /*  关闭中断                    */
    ptcbCur->TCB_usStatus |= LW_THREAD_STATUS_SIGNAL;                   /*  等待信号                    */
    ppcb = _GetPcb(ptcbCur);
    __DEL_FROM_READY_RING(ptcbCur, ppcb);                               /*  从就绪表中删除              */
    KN_INT_ENABLE(iregInterLevel);                                      /*  打开中断                    */
    
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    sigprocmask(SIG_SETMASK, &sigsetOld, NULL);
    
    _ErrorHandle(EINTR);
    return  (PX_ERROR);
}
コード例 #29
0
/*********************************************************************************************************
** 函数名称: API_CoroutineDelete
** 功能描述: 删除一个指定的协程.
** 输 入  : pvCrcb                        协程句柄
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
ULONG   API_CoroutineDelete (PVOID  pvCrcb)
{
             INTREG                 iregInterLevel;
    REGISTER PLW_CLASS_COROUTINE    pcrcbDel = (PLW_CLASS_COROUTINE)pvCrcb;
    REGISTER PLW_CLASS_COROUTINE    pcrcbNow;
             PLW_CLASS_TCB          ptcbCur;

    if (!LW_SYS_STATUS_IS_RUNNING()) {                                  /*  系统必须已经启动            */
        _ErrorHandle(ERROR_KERNEL_NOT_RUNNING);
        return  (ERROR_KERNEL_NOT_RUNNING);
    }
    
    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (ERROR_KERNEL_IN_ISR);
    }
    
    if (!pcrcbDel) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "coroutine handle invalidate.\r\n");
        _ErrorHandle(EINVAL);
        return  (EINVAL);
    }
    
    LW_TCB_GET_CUR_SAFE(ptcbCur);                                       /*  当前任务控制块              */
    
    pcrcbNow = _LIST_ENTRY(ptcbCur->TCB_pringCoroutineHeader, 
                           LW_CLASS_COROUTINE, 
                           COROUTINE_ringRoutine);                      /*  获得当前协程                */
    
    if (pcrcbNow == pcrcbDel) {                                         /*  删除当前协程                */
        return  (API_CoroutineExit());
    }
    
    LW_SPIN_LOCK_QUICK(&ptcbCur->TCB_slLock, &iregInterLevel);
    _List_Ring_Del(&pcrcbDel->COROUTINE_ringRoutine,
                   &ptcbCur->TCB_pringCoroutineHeader);                 /*  从协程表中删除              */
    LW_SPIN_UNLOCK_QUICK(&ptcbCur->TCB_slLock, iregInterLevel);
    
    MONITOR_EVT_LONG2(MONITOR_EVENT_ID_COROUTINE, MONITOR_EVENT_COROUTINE_DELETE, 
                      ptcbCur->TCB_ulId, pcrcbDel, LW_NULL);
    
    if (pcrcbDel->COROUTINE_bIsNeedFree) {
        _StackFree(ptcbCur,
                   pcrcbDel->COROUTINE_pstkStackLowAddr, LW_TRUE);      /*  释放内存                    */
    }
    
    return  (ERROR_NONE);
}
コード例 #30
0
ファイル: pipe.c プロジェクト: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: API_PipeDevDelete
** 功能描述: 删除一个管道设备
** 输 入  : 
**           pcName                        管道名称
**           bForce                        强制删除
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API 
INT  API_PipeDevDelete (PCHAR  pcName, BOOL  bForce)
{
    REGISTER PLW_PIPE_DEV        p_pipedev;
             PCHAR               pcTail = LW_NULL;
    
    if (LW_CPU_GET_CUR_NESTING()) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (PX_ERROR);
    }
    
    if (_G_iPipeDrvNum <= 0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (PX_ERROR);
    }
    
    p_pipedev = (PLW_PIPE_DEV)iosDevFind(pcName, &pcTail);
    if ((p_pipedev == LW_NULL) || (pcName == pcTail)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "device not found.\r\n");
        _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND);
        return  (PX_ERROR);
    }
    
    if (bForce == LW_FALSE) {
        if (LW_DEV_GET_USE_COUNT(&p_pipedev->PIPEDEV_devhdrHdr)) {
            _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n");
            _ErrorHandle(EBUSY);
            return  (PX_ERROR);
        }
        if (SEL_WAKE_UP_LIST_LEN(&p_pipedev->PIPEDEV_selwulList) > 0) {
            errno = EBUSY;
            return  (PX_ERROR);
        }
    }
    
    iosDevFileAbnormal(&p_pipedev->PIPEDEV_devhdrHdr);
    iosDevDelete(&p_pipedev->PIPEDEV_devhdrHdr);

    SEL_WAKE_UP_LIST_TERM(&p_pipedev->PIPEDEV_selwulList);
    
    API_SemaphoreBDelete(&p_pipedev->PIPEDEV_hWriteLock);
    API_MsgQueueDelete(&p_pipedev->PIPEDEV_hMsgQueue);

    __SHEAP_FREE((PVOID)p_pipedev);
    
    return  (ERROR_NONE);
}