/********************************************************************************************************* ** 函数名称: sched_setparam ** 功能描述: 设置指定任务调度器参数 ** 输 入 : pid 进程 / 线程 ID ** pschedparam 调度器参数 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API int sched_setparam (pid_t pid, const struct sched_param *pschedparam) { UINT8 ucPriority; ULONG ulError; LW_OBJECT_HANDLE ulThread; if (pschedparam == LW_NULL) { errno = EINVAL; return (PX_ERROR); } if ((pschedparam->sched_priority < __PX_PRIORITY_MIN) || (pschedparam->sched_priority > __PX_PRIORITY_MAX)) { errno = EINVAL; return (PX_ERROR); } ucPriority= (UINT8)PX_PRIORITY_CONVERT(pschedparam->sched_priority); #if LW_CFG_MODULELOADER_EN > 0 if (pid == 0) { pid = getpid(); } if (pid == 0) { ulThread = API_ThreadIdSelf(); } else { ulThread = vprocMainThread(pid); } if (ulThread == LW_OBJECT_HANDLE_INVALID) { errno = ESRCH; return (PX_ERROR); } #else ulThread = (LW_OBJECT_HANDLE)pid; PX_ID_VERIFY(ulThread, LW_OBJECT_HANDLE); #endif /* LW_CFG_MODULELOADER_EN > 0 */ ulError = API_ThreadSetPriority(ulThread, ucPriority); if (ulError) { errno = ESRCH; return (PX_ERROR); } else { return (ERROR_NONE); } }
/********************************************************************************************************* ** 函数名称: ls1xLedIoctl ** 功能描述: LED 控制 ** 输 入 : pfdentry 设备表结构地址 ** iCmd 命令 ** lArg 参数 ** 输 出 : 错误号 *********************************************************************************************************/ static INT ls1xLedIoctl (PLW_FD_ENTRY pfdentry, INT iCmd, LONG lArg) { PLS1XLED_DEV pled = (PLS1XLED_DEV)pfdentry->FDENTRY_pdevhdrHdr; struct stat *pstat; switch (iCmd) { case FIOFSTATGET: pstat = (struct stat *)lArg; if (pstat) { pstat->st_dev = (dev_t)pled; pstat->st_ino = (ino_t)0; pstat->st_mode = (S_IRUSR | S_IRGRP | S_IROTH); pstat->st_nlink = 1; pstat->st_uid = 0; pstat->st_gid = 0; pstat->st_rdev = 0; pstat->st_size = 0; pstat->st_blksize = 0; pstat->st_blocks = 0; pstat->st_atime = pled->LED_time; pstat->st_mtime = pled->LED_time; pstat->st_ctime = pled->LED_time; return (ERROR_NONE); } return (PX_ERROR); case FIOSETFL: if ((int)lArg & O_NONBLOCK) { pfdentry->FDENTRY_iFlag |= O_NONBLOCK; } else { pfdentry->FDENTRY_iFlag &= ~O_NONBLOCK; } return (ERROR_NONE); case 0: API_SemaphoreBPostEx(pled->LED_hSemaphoreB, (VOID *)lArg); return (ERROR_NONE); case 1: API_ThreadSetPriority(pled->LED_hThread, (UINT8)lArg); return (ERROR_NONE); } return (PX_ERROR); }
/********************************************************************************************************* ** 函数名称: sched_setscheduler ** 功能描述: 设置指定任务调度器 ** 输 入 : pid 进程 / 线程 ID ** iPolicy 调度策略 ** pschedparam 调度器参数 ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API int sched_setscheduler (pid_t pid, int iPolicy, const struct sched_param *pschedparam) { UINT8 ucPriority; UINT8 ucActivatedMode; LW_OBJECT_HANDLE ulThread; if (pschedparam == LW_NULL) { errno = EINVAL; return (PX_ERROR); } if ((iPolicy != LW_OPTION_SCHED_FIFO) && (iPolicy != LW_OPTION_SCHED_RR)) { errno = EINVAL; return (PX_ERROR); } if ((pschedparam->sched_priority < __PX_PRIORITY_MIN) || (pschedparam->sched_priority > __PX_PRIORITY_MAX)) { errno = EINVAL; return (PX_ERROR); } ucPriority= (UINT8)PX_PRIORITY_CONVERT(pschedparam->sched_priority); #if LW_CFG_MODULELOADER_EN > 0 if (pid == 0) { pid = getpid(); } if (pid == 0) { ulThread = API_ThreadIdSelf(); } else { ulThread = vprocMainThread(pid); } if (ulThread == LW_OBJECT_HANDLE_INVALID) { errno = ESRCH; return (PX_ERROR); } #else ulThread = (LW_OBJECT_HANDLE)pid; PX_ID_VERIFY(ulThread, LW_OBJECT_HANDLE); #endif /* LW_CFG_MODULELOADER_EN > 0 */ if (API_ThreadGetSchedParam(ulThread, LW_NULL, &ucActivatedMode)) { errno = ESRCH; return (PX_ERROR); } API_ThreadSetSchedParam(ulThread, (UINT8)iPolicy, ucActivatedMode); if (API_ThreadSetPriority(ulThread, ucPriority)) { errno = ESRCH; return (PX_ERROR); } else { return (ERROR_NONE); } }