《数组,二维数组》(指针,二维指针)(指针数组,指针函数,函数指针数组)(数组指针,函数指针).篇三

函数指针的应用

在设计代码时,巧妙的设计,使项目简单,好看

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);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值