-
- Ничего он не знает и типы совершенно никакого отношения не имеют. В
Keil C51 нужно делать специальный линкер-скрипт и с помощью
директивы OVERLAY перечислять для функции, из которой может быть
вызван callback, все возможные функции используемые в качестве
callback-функции. Нашёл свой старый проект -- там именно так. - fk0(13.12.2020 16:05)
- Ну, хоть какое-то решение. Но вообще неудобно. Неужто это реально
только такой путь? - POV_(13.12.2020 22:18, )
- Я ж говорю -- не пользоваться указателями на функции, делать через
enum. Это несколько более прямолинейный путь для архитектур вроде
x51 и PIC16/18. Правда архитектурно плохо получается, без
указателей. Для PIC18 там вообще пляски с бубном: - fk0(13.12.2020 22:58, ссылка)
- Не вариант, не будет у свитч-кейса знаний о вызываемых функциях... POV_(335 знак., 13.12.2020 23:14, )
- Что значит "не будет"? Оно есть. Если его нет -- у тебя программа
никогда не заработает ни на x51, ни на pic18. На обоих архитектурах
ВЫЧИСЛЯЕМЫЙ адрес функции невозможен. Только из набора жёстко
заданных. А это тот же switch-case. Преимущество switch-case -- не
нужно морочиться с OVERLAY. Но если у тебя кросс-платформенность и
switch-case не удобен, то мучайся с OVERLAY. Я в своё время
предпочёл OVERLAY и FNCALL (в PICC18), чем switch-case (ибо
архитектурно жутко неудобно) fk0(1 знак., 13.12.2020 23:24)
- Тот код, где вызывает колбэк - это неизменяемый код. Типа,
библиотека низкого уровня. Она не может и не должна знать о новых
фичах прошивки... POV_(510 знак., 14.12.2020 00:03, )
- Так или иначе, но знать она БУДЕТ. Либо непосредственно (в switch-case). Либо в скрипте линкера (OVERLAY). По-другому в принципе не сделаешь. Если у тебя коллбек устанавливается ровно один раз на старте -- можешь имя функции коллбэка передавать при компиляции макросом, например. Ну или как "зарезервированное имя внешней функции". Но суть одна -- компилятор должен непосредственно знать, что будет вызываться. Скомпилировать такой код, когда компилятор вызывает неизвестную fk0(541 знак., 14.12.2020 01:34)
- Тот код, где вызывает колбэк - это неизменяемый код. Типа,
библиотека низкого уровня. Она не может и не должна знать о новых
фичах прошивки... POV_(510 знак., 14.12.2020 00:03, )
- Что значит "не будет"? Оно есть. Если его нет -- у тебя программа
никогда не заработает ни на x51, ни на pic18. На обоих архитектурах
ВЫЧИСЛЯЕМЫЙ адрес функции невозможен. Только из набора жёстко
заданных. А это тот же switch-case. Преимущество switch-case -- не
нужно морочиться с OVERLAY. Но если у тебя кросс-платформенность и
switch-case не удобен, то мучайся с OVERLAY. Я в своё время
предпочёл OVERLAY и FNCALL (в PICC18), чем switch-case (ибо
архитектурно жутко неудобно) fk0(1 знак., 13.12.2020 23:24)
- на PIC18 у меня вообще не получились указатели на функции, сносило куда-то совсем не туда.. - Aleksey_75(13.12.2020 23:01)
- Не вариант, не будет у свитч-кейса знаний о вызываемых функциях... POV_(335 знак., 13.12.2020 23:14, )
- Я ж говорю -- не пользоваться указателями на функции, делать через
enum. Это несколько более прямолинейный путь для архитектур вроде
x51 и PIC16/18. Правда архитектурно плохо получается, без
указателей. Для PIC18 там вообще пляски с бубном: - fk0(13.12.2020 22:58, ссылка)
- Ну, хоть какое-то решение. Но вообще неудобно. Неужто это реально
только такой путь? - POV_(13.12.2020 22:18, )
- Это современные компиляторы умные. С51 не из них. Запросто может игнорировать такое знание. - SciFi(13.12.2020 14:12)
- Ничего он не знает и типы совершенно никакого отношения не имеют. В
Keil C51 нужно делать специальный линкер-скрипт и с помощью
директивы OVERLAY перечислять для функции, из которой может быть
вызван callback, все возможные функции используемые в качестве
callback-функции. Нашёл свой старый проект -- там именно так. - fk0(13.12.2020 16:05)