Посвящается тем, кто не понимает зачем это нужно: Кратко: это нужно в случае работы с ОС типа "каруселька" - когда события вызываются из цикла, и имеется очень длительное по выполнению событие, которое приходится разбивать на части, чтобы оно не тормозило выполнение других событий. Можно придумать еще какую-нибудь подобную задачу - когда надо организовать цепочку вызовов однотипных функций.
Думаю, многие уже догадались к чему все это, тем не менее продолжу:
Конкретно в моем случае речь идет об МК серии CH57x/CH58x/CH59x с BLE.
Фирменный стек BLE + фирменная событийная TMOS - это неотъемлемая часть проекта. Это для тех, кто после прочтения захочет сказать - "переходи на нормальную RTOS и не парься". Нормальной RTOS нет, есть фирменная событийная TMOS.
Задача связки стек BLE + TMOS - обслуживать без всяких лагов работу BLE, ну и дополнительно - запускать в виде событий какие-нибудь пользовательские процессы.
К пользовательским процессам есть некоторые требования - они должны выполняться как можно быстрее. Как быстро? Чем быстрее - тем лучше :-) Никто ничего не знает и сказать не может :-)
Так вот, чтобы сделать разбивку длительного события на несколько(сколько угодно) кусков, я и задумал:
Для начала события инициализируем тот самый указатель на функцию адресом первой функцией - началом события. И вызываем событие TMOS.
Обработчик события TMOS вызывает функцию по указателю. А эта функция после отработки короткого интервала должна вернуть указатель на следующую функцию (естественно - такого же типа), чтобы следующее событие TMOS вызвало уже следующуу функцию. А она - после отработки вернет следующий указатель. И т.д. Последняя функция возвращает NULL - конец обработки длительного события.
Сейчас я задаю тип функции - с возвращаемым указателем типа void *. Но это некрасиво :-) Но - работает :-)