函数指针的应用
在设计代码时,巧妙的设计,使项目简单,好看
1、第一段代码
typedef struct _LIST_ENTRY
{
struct _LIST_ENTRY *pNext;
} LIST_ENTRY, *PLIST_ENTRY;
typedef struct _LIST_HEADR
{
PLIST_ENTRY pHead;
PLIST_ENTRY pTail;
INT8U size;
} LIST_HEADER, *PLIST_HEADER;
struct work_struct {
LIST_HEADER * pTaskletList;
LIST_ENTRY entry;
void (*fun) (void *data);
void *data;
OS_EVENT *event; //这个事件,可以定义非常多,比如,按键,异常,各种请求事件,然后通过函数指针,实现不同功能。
};
void (*fun) (void *data);这句代码,是非常高超的手法,定义一个函数指针时,不知道要传什么参数,void *data,可以穿一个结构体进来,里面包含各种操作,数据。
OS_EVENT *event; //这个事件,可以定义非常多,比如,按键,异常,各种请求事件,然后通过函数指针,实现不同功能。
LIST_HEADER * pTaskletList;//这里也是,结构体包含链表,就可以把各种状态包含进来了。
这些代码是,设计一个双向任务链表,结构体非常丰富,所以,要巧妙的利用好结构体,指针传参的妙用。
2、第二段代码
typedef void (*OS_TMR_CALLBACK)(void *ptmr, void *parg);
就是一个回调函数,通过函数指针来实现回调,比如某个条件触发,当定时器触发时,使用回调函数,来实现。
typedef struct os_tmr {
INT8U OSTmrType; /* Should be set to OS_TMR_TYPE */
OS_TMR_CALLBACK OSTmrCallback; /* Function to call when timer expires */
void *OSTmrCallbackArg; /* Argument to pass to function when timer expires */
void *OSTmrNext; /* Double link list pointers */
void *OSTmrPrev;
INT32U OSTmrMatch; /* Timer expires when OSTmrTime == OSTmrMatch */
INT32U OSTmrDly; /* Delay time before periodic update starts */
INT32U OSTmrPeriod; /* Period to repeat timer */
INT8U OSTmrOpt; /* Options (see OS_TMR_OPT_xxx) */
INT8U OSTmrState; /* Indicates the state of the timer: */
/* OS_TMR_STATE_UNUSED */
/* OS_TMR_STATE_RUNNING */
/* OS_TMR_STATE_STOPPED */
LIST_ENTRY pObj;
struct work_struct work;
} OS_TMR;
typedef struct os_tmr_wheel {
OS_TMR *OSTmrFirst; /* Pointer to first timer in linked list */
INT16U OSTmrEntries;
} OS_TMR_WHEEL;
OS_TMR_WHEEL OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE];
上面这些代码是一个系统的内核代码,OS_TMR_WHEEL OSTmrWheelTbl[100];,这里是一个结构体类型的数组,所以,数组类型可不只是指针类型,char类型,可以是非常复杂的结构体类型。
3、线程创建函数,可以看到,是第一个函数名是一个函数指针。
int thread_create(void(*task)(void *p_arg), void *p_arg, unsigned int prio, unsigned int *pbos, unsigned int stk_size, char *name);