moh555
یک شنبه 25 فروردین 1392, 23:13 عصر
سلام
من موقع بررسی یکی از سورس کد های شرکت اتمل به مشکلی برخوردم که فکر کنم برای شما هم جالب باشه.
تابع زیر را در نظر بگیرید:
inline void USB_Init(const S_usb *pUsb)
{
pUsb->pDriver->pMethods->init(pUsb);
}
داخل برنامه ،init به این صورت اعلان شده:
S_usb_init init;
و S_usb_init به این صورت تعریف(!) شده:
typedef void (*S_usb_init)(const S_usb *);
توجه کنید این تعریف آخری هیچ بدنه ای ندارد.
مشکل من اینست که اینجا تابع init به لحاظ منطقی چه کاری انجام می دهد؟من خودم اول فکر کردم حتما کد خنثی هست و برای توسعه های بعدی به صورت ناقص نوشته شده اما با غیر فعال کردن آن دیدم برنامه جواب نداد. تعاریف ساختارهای pMethod, pDriver , S_usbرا هم براتون می گذارم.
typedef struct {
S_usb_init init;
S_usb_write write;
S_usb_read read;
S_usb_stall stall;
S_usb_halt halt;
S_usb_remote_wakeup remoteWakeUp;
S_usb_cfg_endpoint configureEndpoint;
S_usb_attach attach;
S_usb_set_address setAddress;
S_usb_set_cfg setConfiguration;
S_usb_handler handler;
S_usb_connect connect;
S_usb_disconnect disconnect;
} S_driver_methods;
typedef struct {
void * pInterface;
void * pEndpointFIFO;
void * pDMAInterface;
unsigned int dID;
unsigned int dPMC;
const S_driver_methods* pMethods;
} S_usb_driver;
typedef struct _S_usb {
const S_usb_driver *pDriver; //!< Pointer to the low-level driver
S_usb_endpoint* const pEndpoints; //!< Endpoints list
unsigned int dNumEndpoints; //!< Number of endpoints in list
const S_usb_callbacks *pCallbacks; //!< Pointer to the callbacks
S_usb_request* const pSetup; //!< \brief Pointer to the last
//!< received SETUP packet
volatile unsigned int* const pState; //!< Current state of the device
} S_usb1;
typedef struct _S_usb S_usb;
من موقع بررسی یکی از سورس کد های شرکت اتمل به مشکلی برخوردم که فکر کنم برای شما هم جالب باشه.
تابع زیر را در نظر بگیرید:
inline void USB_Init(const S_usb *pUsb)
{
pUsb->pDriver->pMethods->init(pUsb);
}
داخل برنامه ،init به این صورت اعلان شده:
S_usb_init init;
و S_usb_init به این صورت تعریف(!) شده:
typedef void (*S_usb_init)(const S_usb *);
توجه کنید این تعریف آخری هیچ بدنه ای ندارد.
مشکل من اینست که اینجا تابع init به لحاظ منطقی چه کاری انجام می دهد؟من خودم اول فکر کردم حتما کد خنثی هست و برای توسعه های بعدی به صورت ناقص نوشته شده اما با غیر فعال کردن آن دیدم برنامه جواب نداد. تعاریف ساختارهای pMethod, pDriver , S_usbرا هم براتون می گذارم.
typedef struct {
S_usb_init init;
S_usb_write write;
S_usb_read read;
S_usb_stall stall;
S_usb_halt halt;
S_usb_remote_wakeup remoteWakeUp;
S_usb_cfg_endpoint configureEndpoint;
S_usb_attach attach;
S_usb_set_address setAddress;
S_usb_set_cfg setConfiguration;
S_usb_handler handler;
S_usb_connect connect;
S_usb_disconnect disconnect;
} S_driver_methods;
typedef struct {
void * pInterface;
void * pEndpointFIFO;
void * pDMAInterface;
unsigned int dID;
unsigned int dPMC;
const S_driver_methods* pMethods;
} S_usb_driver;
typedef struct _S_usb {
const S_usb_driver *pDriver; //!< Pointer to the low-level driver
S_usb_endpoint* const pEndpoints; //!< Endpoints list
unsigned int dNumEndpoints; //!< Number of endpoints in list
const S_usb_callbacks *pCallbacks; //!< Pointer to the callbacks
S_usb_request* const pSetup; //!< \brief Pointer to the last
//!< received SETUP packet
volatile unsigned int* const pState; //!< Current state of the device
} S_usb1;
typedef struct _S_usb S_usb;