diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.c b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.c index b6d621b5c..dcf3ed064 100644 --- a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.c +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.c @@ -20,9 +20,6 @@ /** * @file tsclient.c * @brief TSSI client module code. - * - * @addtogroup TSSI - * @{ */ #include "ch.h" @@ -35,6 +32,7 @@ /*===========================================================================*/ /* Module exported variables. */ /*===========================================================================*/ +EVENTSOURCE_DECL(stubsEventSource); /*===========================================================================*/ /* Module local types. */ @@ -63,7 +61,11 @@ void tsIdle(void) { } /** - * @brief Call a service via smc instruction. + * @brief Call a service via smc instruction with yield times. + * @details a time slice will be yielded also to the lower prio NSEC threads, + * whenever the service call is interrupted. + * This avoids the starvation of NSEC threads that run to lower prio, + * due to continue polling of the called service status. * * @param[in] handle The handle of the service to invoke. * The handle is obtained by an invoke to discovery @@ -74,8 +76,9 @@ void tsIdle(void) { * @param[in] svc_nsec_time The time slice that will be yielded to the lower * prio NSEC threads, whenever the service call is * interrupted, in microseconds. - * This avoids the starvation of lower NSEC thread due - * to continue polling of the called service status. + * This avoids the starvation of NSEC threads that run + * to lower prio, due to continue polling of the + * called service status. * 0 means no time slice is yielded. * * @return The service status. The value depends on the service. @@ -89,17 +92,46 @@ void tsIdle(void) { * @api */ msg_t tsInvokeService(ts_service_t handle, ts_params_area_t data, - size_t size, sysinterval_t svc_nsec_time) + size_t size) { - int64_t result; + msg_t result; result = tsInvoke1(handle, data, size, TS_GRANTED_TIMESLICE); - while ((msg_t)result == SMC_SVC_INTR) { - if (svc_nsec_time != 0) - chThdSleepMicroseconds(svc_nsec_time); + while (result == SMC_SVC_INTR) { + chThdSleepMicroseconds(TS_GRANTED_TIMESLICE); result = tsInvoke1(TS_HND_STQRY, handle, 0, TS_GRANTED_TIMESLICE); } - return (msg_t)result; + return result; } -/** @} */ +/** + * @brief Call a service via smc instruction without yield time to NSEC. + * + * @param[in] handle The handle of the service to invoke. + * The handle is obtained by an invoke to discovery + * service. + * @param[in,out] svc_data Service request data, often a reference to a more + * complex structure. + * @param[in] svc_datalen Size of the svc_data memory area. + * + * @return The service status. The value depends on the service. + * + * @retval SMC_SVC_OK generic success value. + * @retval SMC_SVC_BUSY the service has a pending request. + * @retval SMC_SVC_INVALID bad parameters. + * @retval SMC_SVC_NOENT no such service. + * @retval SMC_SVC_BADH bad handle. + * + * @api + */ +msg_t tsInvokeServiceNoYield(ts_service_t handle, ts_params_area_t data, + size_t size) +{ + msg_t result; + + result = tsInvoke1(handle, data, size, TS_GRANTED_TIMESLICE); + while (result == SMC_SVC_INTR) { + result = tsInvoke1(TS_HND_STQRY, handle, 0, TS_GRANTED_TIMESLICE); + } + return result; +} diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h index b0ce522c1..e92c732db 100644 --- a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/tsclient.h @@ -20,9 +20,6 @@ /** * @file tsclient.h * @brief TSSI client module macros and structures. - * - * @addtogroup TSSI - * @{ */ #ifndef TSCLIENT_H @@ -53,9 +50,13 @@ #define TS_GRANTED_TIMESLICE 1000 /* Microseconds.*/ +#if !defined(TS_CHECK_EVENT_HOOK) #define TS_CHECK_EVENT_HOOK(f) { \ - (void)f; \ + extern event_source_t stubsEventSource; \ + if (f) \ + chEvtBroadcastFlags(&stubsEventSource, f); \ } +#endif /*===========================================================================*/ /* Derived constants and error checks. */ @@ -78,7 +79,27 @@ typedef void * ts_service_t; /** * @brief Call a service via smc instruction. - * @note see tsInvoke1() + * @details call a given service via smc. + * + * @param[in] handle The handle of the service to invoke. + * The handle is obtained by an invoke to discovery + * service. + * @param[in,out] svc_data Service request data, often a reference to a more + * complex structure. + * @param[in] svc_datalen Size of the svc_data memory area. + * @param[in] yieldtime The time yield to SEC service to run, in microsec. + * + * @return A 64bit value. It is composed by the 32bit service + * status in the lo-word with the 32bit event mask in + * the hi-word. + * The retval values are returned in the lower word + * as 32bit int. + * @retval SMC_SVC_OK generic success value. + * @retval SMC_SVC_INTR call interrupted. + * @retval SMC_SVC_BUSY the service has a pending request. + * @retval SMC_SVC_INVALID bad parameters. + * @retval SMC_SVC_NOENT no such service. + * @retval SMC_SVC_BADH bad handle. * * @notapi */ @@ -110,11 +131,8 @@ static inline int64_t tsInvoke0(ts_service_t handle, ts_params_area_t data, * @param[in] svc_datalen Size of the svc_data memory area. * @param[in] yieldtime The time yield to SEC service to run, in microsec. * - * @return A 64bit value. It is composed by the 32bit service - * status in the lo-word with the 32bit event mask in - * the hi-word. - * The retval values are returned in the lower word - * as 32bit int. + * @return The service status. The value depends on the service. + * * @retval SMC_SVC_OK generic success value. * @retval SMC_SVC_INTR call interrupted. * @retval SMC_SVC_BUSY the service has a pending request. @@ -124,15 +142,15 @@ static inline int64_t tsInvoke0(ts_service_t handle, ts_params_area_t data, * * @api */ -static inline int64_t tsInvoke1(ts_service_t handle, ts_params_area_t data, - size_t size, sysinterval_t timeslice) { +static inline msg_t tsInvoke1(ts_service_t handle, ts_params_area_t data, + size_t size, sysinterval_t yieldtime) { int64_t result; eventflags_t f; - result = tsInvoke0(handle, data, size, timeslice); + result = tsInvoke0(handle, data, size, yieldtime); f = (eventflags_t)(result >> 32); TS_CHECK_EVENT_HOOK(f); - return result; + return (msg_t)result; } /*===========================================================================*/ @@ -142,8 +160,11 @@ static inline int64_t tsInvoke1(ts_service_t handle, ts_params_area_t data, #ifdef __cplusplus extern "C" { #endif -msg_t tsInvokeService(ts_service_t handle, ts_params_area_t data, - size_t size, sysinterval_t svc_nsec_time); + msg_t tsInvokeService(ts_service_t handle, ts_params_area_t data, + size_t size); + msg_t tsInvokeServiceNoYield(ts_service_t handle, ts_params_area_t data, + size_t size); + extern event_source_t stubsEventSource; #ifdef __cplusplus } #endif @@ -153,5 +174,3 @@ msg_t tsInvokeService(ts_service_t handle, ts_params_area_t data, /*===========================================================================*/ #endif /* TSCLIENT_H */ - -/** @} */