Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Портирование EFSL с АВР на МСП
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
MrYuran
Код
struct _SdSpiProtocol
{
    void *spiHwInterface;
    euint8 (*spiHwInit)(void* spiHwInterface);
    euint8 (*spiSendByte)(void* spiHwInterface,euint8 data);
};
        
SdSpiProtocol      sd_protocol;

euint8 atmega_spi_init(atmegaSpiInterface *iface)
{
Return (0);
}

sd_protocol.spiHwInit      =  (void *)atmega_spi_init;
sd_protocol.spiSendByte    =  (void *)atmega_spi_send;

ИАР выдаёт ошибки на 2 последние строки:
Error[Pe513]: a value of type "void *" cannot be assigned to an entity of type "euint8 (*)(void *)" F:\EFSL\MSP430\Main\avrtest.c 69

Если убрать (void *), то ошибка другая:
Error[Pe513]: a value of type "euint8 (*)(atmegaSpiInterface *)" cannot be assigned to an entity of type "euint8 (*)(void *)" F:\EFSL\MSP430\Main\avrtest.c 71

Что посоветуеte предпринять?

А может, готовый проект у кого-нибудь есть?
AHTOXA
Цитата(MrYuran @ Jul 17 2009, 15:53) *
Что посоветуеte предпринять?


Объявить
euint8 atmega_spi_init(atmegaSpiInterface *iface)

как

euint8 atmega_spi_init(void* iface)

ЗЫ. (void*) убрать конечноsmile.gif
MrYuran
Цитата(AHTOXA @ Jul 17 2009, 15:19) *
euint8 atmega_spi_init(void* iface)

Работает, но подозрительно что-то: туда же указатель на структуру передаётся, как он void развернёт?

Попробовали по другому:
struct _SdSpiProtocol
{
void *spiHwInterface;
euint8 (*spiHwInit)(atmegaSpiInterface * spiHwInterface);
euint8 (*spiSendByte)(atmegaSpiInterface * spiHwInterface,euint8 data);
};

Так тоже работает, но теперь жёсткая привязка типа параметра функции

Какой вариант правильнее, первый или второй?
AHTOXA
Я не работал с EFSL, и не знаю, в чём там идея.
Видимо, для того, чотбы efsl могла общаться с периферией, в её недра передаётся указатель на структуру _SdSpiProtocol, и потом она (efsl) по необходимости вызывает spiHwInit и spiSendByte с параметром из этой же структуры. Сама efsl понятия не имеет, что такое spiHwInterface. Поэтому назвала её void*.

То есть, правильный путь - не трогать efsl, а в обработчиках spiHwInit и spiSendByte приводить параметр (void*) к нужному типу.

То есть,
euint8 atmega_spi_init(void* iface)
{
atmegaSpiInterface* if = iface;
....
return (0);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.