Misra fixes for posix clock utility
/*
* Time conversion constants.
*/
-#define NANOSECONDS_PER_MILLISECOND ( 1000000 ) /**< @brief Nanoseconds per millisecond. */
-#define MILLISECONDS_PER_SECOND ( 1000 ) /**< @brief Milliseconds per second. */
+#define NANOSECONDS_PER_MILLISECOND ( 1000000L ) /**< @brief Nanoseconds per millisecond. */
+#define MILLISECONDS_PER_SECOND ( 1000L ) /**< @brief Milliseconds per second. */
/*-----------------------------------------------------------*/
uint32_t Clock_GetTimeMs( void )
{
- uint32_t timeMs;
+ int64_t timeMs;
struct timespec timeSpec;
/* Get the MONOTONIC time. */
- clock_gettime( CLOCK_MONOTONIC, &timeSpec );
+ ( void ) clock_gettime( CLOCK_MONOTONIC, &timeSpec );
/* Calculate the milliseconds from timespec. */
- timeMs = ( uint32_t ) ( timeSpec.tv_sec * 1000 )
- + ( uint32_t ) ( timeSpec.tv_nsec / ( 1000 * 1000 ) );
+ timeMs = ( timeSpec.tv_sec * MILLISECONDS_PER_SECOND )
+ + ( timeSpec.tv_nsec / NANOSECONDS_PER_MILLISECOND );
- return timeMs;
+ /* Libraries need only the lower 32 bits of the time in milliseconds, since
+ * this function is used only for a calculating the time difference.
+ * Also, the possible overflows of this time value is handled in the
+ * libraries. */
+ return ( uint32_t ) timeMs;
}
/*-----------------------------------------------------------*/
@@ -63,8 +67,9 @@ void Clock_SleepMs( uint32_t sleepTimeMs )
{
/* Convert parameter to timespec. */
struct timespec sleepTime = { 0 };
- sleepTime.tv_sec = sleepTimeMs / MILLISECONDS_PER_SECOND;
- sleepTime.tv_nsec = ( sleepTimeMs % MILLISECONDS_PER_SECOND ) * NANOSECONDS_PER_MILLISECOND;
+
+ sleepTime.tv_sec = ( ( time_t ) sleepTimeMs / ( time_t ) MILLISECONDS_PER_SECOND );
+ sleepTime.tv_nsec = ( ( int64_t ) sleepTimeMs % MILLISECONDS_PER_SECOND ) * NANOSECONDS_PER_MILLISECOND;
/* High resolution sleep. */
( void ) nanosleep( &sleepTime, NULL );
