ex51 0 17 декабря, 2010 Опубликовано 17 декабря, 2010 · Жалоба Переписываю С программу на С++, уже вроде всё переделал кроме одного места. На С была структура регистрации прерываний для процессора NIos II от Альтеры (используется GCC): alt_avalon_sgdma_register_callback( sgdma_rx_dev, (alt_avalon_sgdma_callback )&tse_sgdmaRx_isr, // <- ругается (alt_u16)ALTERA_TSE_SGDMA_INTR_MASK, sgdma_rx_dev ); где тип alt_avalon_sgdma_callback объявлен так: typedef void (*alt_avalon_sgdma_callback)(void *context) tse_sgdmaRx_isr - непосредственно подпрограмма обработчик прерывания. На С была объявлена как: int tse_sgdmaRx_isr(void * context, alt_u32 irqnum); Всё компилировалось и собиралось. Теперь сделал класс и в нём объявил функцию обработчик: class eth_dev : public eth_cfg { protected: ... public: eth_dev(const uint8_t); int32_t tse_sgdmaRx_isr(void *context, uint32_t irqnum); ... }; Компилирую и получаю такую вот ошибку: converting from `int32_t (eth_dev::*)(void*, uint32_t)' to `void (*)(void*)' Понимаю что каким-то образом надо преобразовать тип, но вот как? Уже и через this делал, никак не получается! Помогите кто может! Как преобразовать вызов функции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 17 декабря, 2010 Опубликовано 17 декабря, 2010 · Жалоба Теперь сделал класс и в нём объявил функцию обработчик:Вам нужно сделать эту функцию статической. В противном случае кто будет подставлять указатель на объект в качестве неявного параметра this? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ex51 0 20 декабря, 2010 Опубликовано 20 декабря, 2010 · Жалоба Вам нужно сделать эту функцию статической. В противном случае кто будет подставлять указатель на объект в качестве неявного параметра this? Так если я сделаю функцию статической то она станет одна на все экземпляры. А у меня два эзернета и у каждого свой обработчик прерывания. И как тогда быть? Мне всего-то надо передать в структуру адрес этого обработчика! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 20 декабря, 2010 Опубликовано 20 декабря, 2010 · Жалоба И как тогда быть? Мне всего-то надо передать в структуру адрес этого обработчика! Тогда вы не можете сделать обработчик членом класса. Вы можете в классе сделать обычную функцию-член с принудительным инлайном, а вне класса написать обычный обработчик из которого вызывать эту функцию с конкретным объектом. И уже адрес обычного обработчика заносить в контроллер прерываний. Примерно так:__attribute__((interrupt("IRQ"))) void uplink_handler (void) { Uplink.handler(); AT91C_BASE_AIC->AIC_EOICR = 0; // Reset AIC logic } __attribute__((interrupt("IRQ"))) void downlink_handler (void) { Downlink.handler(); AT91C_BASE_AIC->AIC_EOICR = 0; // Reset AIC logic } extern "C" void __low_level_init() { ...... AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US1] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | (AT91C_AIC_PRIOR_LOWEST + 1); AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US1] = (uint32_t)uplink_handler; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | (AT91C_AIC_PRIOR_LOWEST + 2); AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (uint32_t)downlink_handler; ...... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться