drv_state.c
来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 127 行
C
127 行
/**************************************************************************/
/* */
/* Copyright (C) 2006 Oki Electric Industry Co., LTD. */
/* */
/* System Name : uPLAT7D series */
/* Module Name : driver state api program */
/* File Name : drv_state.c */
/* Revision : 01.00 */
/* Date : 2006.02.11 */
/* */
/**************************************************************************/
#include "common.h"
typedef struct DRV_STM{
int16_t state; /* Driver's state */
int16_t handle; /* Open driver's ID */
}DRV_STM;
static DRV_STM driver_stm[DRVNO_MAX];
/************************************************************************/
/* */
/* Function Name : void smpDrv_InitmanageStateMachine(void) */
/* Input : void */
/* Output : void */
/* */
/* Note : None */
/* */
/************************************************************************/
void smpDrv_InitmanageStateMachine(void)
{
enum driver_number i;
for(i=0 ; i<DRVNO_MAX ; ++i ) {
driver_stm[i].state = DRVSTATE_CLOSE;
driver_stm[i].handle = HANDLE_ID_INIT;
}
}
/************************************************************************/
/* */
/* Function Name : int16_t smpDrv_manageStateMachine( */
/* enum driver_number num, */
/* enum driver_state event) */
/* Input : enum driver_number drv_num driver number */
/* enum driver_state drv_event state transition */
/* int16_t handle Open driver's ID */
/* Output : int16_t OK(1) */
/* ERROR(-1) */
/* DRV_EXCLUSION_ERROR(-3) */
/* */
/* Note : None */
/* */
/************************************************************************/
int16_t smpDrv_manageStateMachine(enum driver_number num, enum driver_state event, int16_t handle)
{
int16_t rtnVal = OK;
/* Input argument check */
if( num >= DRVNO_MAX ) {
rtnVal = ERROR;
}
if( event >= DRVEVENT_MAX ) {
rtnVal = ERROR;
}
if( rtnVal == OK ) {
/* Driver exclusion state transition */
if( driver_stm[num].state == DRVSTATE_CLOSE) {
switch( event ) {
case DRVEVENT_RESET:
case DRVEVENT_CLOSE:
break;
case DRVEVENT_OPEN:
driver_stm[num].state = DRVSTATE_OPEN;
driver_stm[num].handle = HANDLE_ID_1;
break;
case DRVEVENT_READ:
case DRVEVENT_WRITE:
case DRVEVENT_IOCTL:
case DRVEVENT_POLL:
rtnVal = DRV_EXCLUSION_ERROR;
break;
default:
rtnVal = DRV_EXCLUSION_ERROR;
break;
}
}
else if( driver_stm[num].state == DRVSTATE_OPEN) {
switch( event ) {
case DRVEVENT_RESET:
case DRVEVENT_CLOSE:
driver_stm[num].state = DRVSTATE_CLOSE;
driver_stm[num].handle = HANDLE_ID_INIT;
break;
case DRVEVENT_OPEN:
rtnVal = DRV_EXCLUSION_ERROR; /* Exclusive control */
break;
case DRVEVENT_READ:
case DRVEVENT_WRITE:
case DRVEVENT_IOCTL:
case DRVEVENT_POLL:
if(handle != driver_stm[num].handle) {
rtnVal = DRV_EXCLUSION_ERROR; /* Exclusive control */
}
break;
default:
rtnVal = DRV_EXCLUSION_ERROR;
break;
}
}
else {
rtnVal = ERROR;
}
}
return rtnVal;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?