реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Портирование EFSL с АВР на МСП, запутались в указателях
MrYuran
сообщение Jul 17 2009, 09:53
Сообщение #1


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Код
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 предпринять?

А может, готовый проект у кого-нибудь есть?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 17 2009, 11:19
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(MrYuran @ Jul 17 2009, 15:53) *
Что посоветуеte предпринять?


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

как

euint8 atmega_spi_init(void* iface)

ЗЫ. (void*) убрать конечноsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 17 2009, 11:57
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(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);
};

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

Какой вариант правильнее, первый или второй?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 17 2009, 12:25
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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

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

То есть,
euint8 atmega_spi_init(void* iface)
{
atmegaSpiInterface* if = iface;
....
return (0);
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 08:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016