ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
17 мая
1497447 Топик полностью
il-2 (11.02.2025 06:49, просмотров: 296) ответил il-2 на Вопрос знатокам Си - как объявить тип указателя на функцию, которая возвращает указатель на функцию такого-же типа? Что-то не получается. Возможно - что это невозможно :-)
Посвящается тем, кто не понимает зачем это нужно: 

Кратко: это нужно в случае работы с ОС типа "каруселька" - когда события вызываются из цикла, и имеется очень длительное по выполнению событие, которое приходится разбивать на части, чтобы оно не тормозило выполнение других событий. Можно придумать еще какую-нибудь подобную задачу - когда надо организовать цепочку вызовов однотипных функций.


Думаю, многие уже догадались к чему все это, тем не менее продолжу:


Конкретно в моем случае речь идет об МК серии CH57x/CH58x/CH59x с BLE.

Фирменный стек BLE + фирменная событийная TMOS - это неотъемлемая часть проекта. Это для тех, кто после прочтения захочет сказать - "переходи на нормальную RTOS и не парься". Нормальной RTOS нет, есть фирменная событийная TMOS.

Задача связки стек BLE + TMOS - обслуживать без всяких лагов работу BLE, ну и дополнительно - запускать в виде событий какие-нибудь пользовательские процессы.

К пользовательским процессам есть некоторые требования - они должны выполняться как можно быстрее. Как быстро? Чем быстрее - тем лучше :-) Никто ничего не знает и сказать не может :-)


Так вот, чтобы сделать разбивку длительного события на несколько(сколько угодно) кусков, я и задумал:

Для начала события инициализируем тот самый указатель на функцию адресом первой функцией - началом события. И вызываем событие TMOS.

Обработчик события TMOS вызывает функцию по указателю. А эта функция после отработки короткого интервала должна вернуть указатель на следующую функцию (естественно - такого же типа), чтобы следующее событие TMOS вызвало уже следующуу функцию. А она - после отработки вернет следующий указатель. И т.д. Последняя функция возвращает NULL - конец обработки длительного события.


Сейчас я задаю тип функции - с возвращаемым указателем типа void *. Но это некрасиво :-) Но - работает :-)