diff --git a/os/common/oslib/src/chheap.c b/os/common/oslib/src/chheap.c index d49c68386..91d41864a 100644 --- a/os/common/oslib/src/chheap.c +++ b/os/common/oslib/src/chheap.c @@ -66,6 +66,14 @@ #define H_SIZE(hp) ((hp)->used.size) +/* + * Number of pages between two pointers in a MISRA-compatible way. + */ +#define NPAGES(p1, p2) \ + /*lint -save -e9033 [10.8] The cast is safe.*/ \ + ((size_t)((p1) - (p2))) \ + /*lint -restore*/ + /*===========================================================================*/ /* Module exported variables. */ /*===========================================================================*/ @@ -188,7 +196,7 @@ void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align) { /* Pointer aligned to the requested alignment.*/ ahp = (heap_header_t *)MEM_ALIGN_NEXT(H_BLOCK(hp), align) - 1U; - if ((ahp < H_LIMIT(hp)) && (pages <= (size_t)(H_LIMIT(hp) - 1U - ahp))) { + if ((ahp < H_LIMIT(hp)) && (pages <= NPAGES(H_LIMIT(hp), ahp - 1U))) { /* The block is large enough to contain a correctly aligned area of sufficient size.*/ @@ -196,15 +204,15 @@ void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align) { /* The block is not properly aligned, must split it.*/ size_t bpages; - bpages = H_LIMIT(hp) - H_BLOCK(ahp); - H_PAGES(hp) = ahp - H_BLOCK(hp); + bpages = NPAGES(H_LIMIT(hp), H_BLOCK(ahp)); + H_PAGES(hp) = NPAGES(ahp, H_BLOCK(hp)); if (bpages > pages) { /* The block is bigger than required, must split the excess.*/ heap_header_t *fp; /* Creating the excess block.*/ fp = H_BLOCK(ahp) + pages; - H_PAGES(fp) = bpages - pages - 1U; + H_PAGES(fp) = NPAGES(bpages, pages - 1U); /* Linking the excess block.*/ H_NEXT(fp) = H_NEXT(hp); @@ -226,7 +234,7 @@ void *chHeapAllocAligned(memory_heap_t *heapp, size_t size, unsigned align) { fp = H_BLOCK(hp) + pages; H_NEXT(fp) = H_NEXT(hp); - H_PAGES(fp) = H_LIMIT(hp) - H_BLOCK(fp); + H_PAGES(fp) = NPAGES(H_LIMIT(hp), H_BLOCK(fp)); H_NEXT(qp) = fp; } } diff --git a/os/common/oslib/src/chmemcore.c b/os/common/oslib/src/chmemcore.c index fd90ac971..c094ac2aa 100644 --- a/os/common/oslib/src/chmemcore.c +++ b/os/common/oslib/src/chmemcore.c @@ -114,9 +114,7 @@ void *chCoreAllocAlignedI(size_t size, unsigned align) { size = MEM_ALIGN_NEXT(size, align); p = (uint8_t *)MEM_ALIGN_NEXT(nextmem, align); - /* ---????? lint -save -e9033 [10.8] The cast is safe.*/ - if ((size_t)(endmem - p) < size) { - /* ---????? lint -restore*/ + if (((size_t)endmem - (size_t)p) < size) { return NULL; } nextmem = p + size; diff --git a/os/rt/include/chalign.h b/os/rt/include/chalign.h index 9662b3b2f..b2065923e 100644 --- a/os/rt/include/chalign.h +++ b/os/rt/include/chalign.h @@ -64,7 +64,10 @@ * @param[in] p variable to be aligned * @param[in] a alignment, must be a power of two */ -#define MEM_ALIGN_PREV(p, a) ((size_t)(p) & ~MEM_ALIGN_MASK(a)) +#define MEM_ALIGN_PREV(p, a) \ + /*lint -save -e9033 [10.8] The cast is safe.*/ \ + ((size_t)(p) & ~MEM_ALIGN_MASK(a)) \ + /*lint -restore*/ /** * @brief Aligns to the new aligned memory address. @@ -72,8 +75,10 @@ * @param[in] p variable to be aligned * @param[in] a alignment, must be a power of two */ -#define MEM_ALIGN_NEXT(p, a) MEM_ALIGN_PREV((size_t)(p) + \ - MEM_ALIGN_MASK(a), (a)) +#define MEM_ALIGN_NEXT(p, a) \ + /*lint -save -e9033 [10.8] The cast is safe.*/ \ + MEM_ALIGN_PREV((size_t)(p) + MEM_ALIGN_MASK(a), (a)) \ + /*lint -restore*/ /** * @brief Returns whatever a pointer or memory size is aligned. diff --git a/os/rt/include/chdebug.h b/os/rt/include/chdebug.h index f1a4230f4..a6631fffb 100644 --- a/os/rt/include/chdebug.h +++ b/os/rt/include/chdebug.h @@ -244,17 +244,17 @@ typedef struct { /* When a trace feature is disabled the associated functions are replaced by an empty macro.*/ -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_SWITCH) == 0 +#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_SWITCH) == 0U #define _dbg_trace_switch(otp) #endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_ISR) == 0 +#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_ISR) == 0U #define _dbg_trace_isr_enter(isr) #define _dbg_trace_isr_leave(isr) #endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_HALT) == 0 +#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_HALT) == 0U #define _dbg_trace_halt(reason) #endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_USER) == 0 +#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_USER) == 0U #define chDbgWriteTraceI(up1, up2) #define chDbgWriteTrace(up1, up2) #endif @@ -334,17 +334,17 @@ extern "C" { #endif #if (CH_DBG_TRACE_MASK != CH_DBG_TRACE_MASK_NONE) || defined(__DOXYGEN__) void _dbg_trace_init(void); -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_SWITCH) != 0 +#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_SWITCH) != 0U void _dbg_trace_switch(thread_t *otp); #endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_ISR) != 0 +#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_ISR) != 0U void _dbg_trace_isr_enter(const char *isr); void _dbg_trace_isr_leave(const char *isr); #endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_HALT) != 0 +#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_HALT) != 0U void _dbg_trace_halt(const char *reason); #endif -#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_USER) != 0 +#if (CH_DBG_TRACE_MASK & CH_DBG_TRACE_MASK_USER) != 0U void chDbgWriteTraceI(void *up1, void *up2); void chDbgWriteTrace(void *up1, void *up2); void chDbgSuspendTraceI(uint16_t mask); diff --git a/os/rt/include/chsys.h b/os/rt/include/chsys.h index 5e90f0a35..3f51244d5 100644 --- a/os/rt/include/chsys.h +++ b/os/rt/include/chsys.h @@ -295,6 +295,10 @@ /* External declarations. */ /*===========================================================================*/ +#if !defined(__DOXYGEN__) +extern stkalign_t ch_idle_thread_wa[]; +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/os/rt/src/chthreads.c b/os/rt/src/chthreads.c index 74c41fa7b..c9cbfac0d 100644 --- a/os/rt/src/chthreads.c +++ b/os/rt/src/chthreads.c @@ -172,8 +172,7 @@ thread_t *chThdCreateSuspendedI(const thread_descriptor_t *tdp) { chDbgCheck(MEM_IS_ALIGNED(tdp->wbase, PORT_WORKING_AREA_ALIGN) && MEM_IS_ALIGNED(tdp->wend, PORT_STACK_ALIGN) && (tdp->wend > tdp->wbase) && - ((size_t)((tdp->wend - tdp->wbase) * - sizeof (stkalign_t)) >= THD_WORKING_AREA_SIZE(0))); + (((size_t)tdp->wend - (size_t)tdp->wbase) >= THD_WORKING_AREA_SIZE(0))); chDbgCheck((tdp->prio <= HIGHPRIO) && (tdp->funcp != NULL)); /* The thread structure is laid out in the upper part of the thread @@ -518,7 +517,7 @@ void chThdExitS(msg_t msg) { registry because there is no memory to recover.*/ #if CH_CFG_USE_DYNAMIC == TRUE if ((tp->refs == (trefs_t)0) && - (tp->flags & CH_FLAG_MODE_MASK) == CH_FLAG_MODE_STATIC) { + ((tp->flags & CH_FLAG_MODE_MASK) == CH_FLAG_MODE_STATIC)) { REG_REMOVE(tp); } #else diff --git a/test/rt/testbuild/chconf.h b/test/rt/testbuild/chconf.h index 8d5d2cd21..091c93e7c 100644 --- a/test/rt/testbuild/chconf.h +++ b/test/rt/testbuild/chconf.h @@ -41,14 +41,18 @@ * @brief System time counter resolution. * @note Allowed values are 16 or 32 bits. */ +#if !defined(CH_CFG_ST_RESOLUTION) || defined(__DOXIGEN__) #define CH_CFG_ST_RESOLUTION 32 +#endif /** * @brief System tick frequency. * @details Frequency of the system timer that drives the system ticks. This * setting also defines the system tick time unit. */ +#if !defined(CH_CFG_ST_FREQUENCY) || defined(__DOXIGEN__) #define CH_CFG_ST_FREQUENCY 1000 +#endif /** * @brief Time delta constant for the tick-less mode. @@ -58,7 +62,9 @@ * The value one is not valid, timeouts are rounded up to * this value. */ +#if !defined(CH_CFG_ST_TIMEDELTA) || defined(__DOXIGEN__) #define CH_CFG_ST_TIMEDELTA 0 +#endif /** @} */ @@ -81,7 +87,9 @@ * @note The round robin preemption is not supported in tickless mode and * must be set to zero in that case. */ +#if !defined(CH_CFG_TIME_QUANTUM) || defined(__DOXIGEN__) #define CH_CFG_TIME_QUANTUM 20 +#endif /** * @brief Managed RAM size. @@ -94,7 +102,9 @@ * provide the @p __heap_base__ and @p __heap_end__ symbols. * @note Requires @p CH_CFG_USE_MEMCORE. */ +#if !defined(CH_CFG_MEMCORE_SIZE) || defined(__DOXIGEN__) #define CH_CFG_MEMCORE_SIZE 0x20000 +#endif /** * @brief Idle thread automatic spawn suppression. @@ -103,7 +113,9 @@ * function becomes the idle thread and must implement an * infinite loop. */ +#if !defined(CH_CFG_NO_IDLE_THREAD) || defined(__DOXIGEN__) #define CH_CFG_NO_IDLE_THREAD FALSE +#endif /** @} */ @@ -122,7 +134,9 @@ * @note This is not related to the compiler optimization options. * @note The default is @p TRUE. */ +#if !defined(CH_CFG_OPTIMIZE_SPEED) || defined(__DOXIGEN__) #define CH_CFG_OPTIMIZE_SPEED TRUE +#endif /** @} */ @@ -140,7 +154,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_TM) || defined(__DOXIGEN__) #define CH_CFG_USE_TM TRUE +#endif /** * @brief Threads registry APIs. @@ -148,7 +164,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_REGISTRY) || defined(__DOXIGEN__) #define CH_CFG_USE_REGISTRY TRUE +#endif /** * @brief Threads synchronization APIs. @@ -157,7 +175,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_WAITEXIT) || defined(__DOXIGEN__) #define CH_CFG_USE_WAITEXIT TRUE +#endif /** * @brief Semaphores APIs. @@ -165,7 +185,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_SEMAPHORES) || defined(__DOXIGEN__) #define CH_CFG_USE_SEMAPHORES TRUE +#endif /** * @brief Semaphores queuing mode. @@ -176,7 +198,9 @@ * requirements. * @note Requires @p CH_CFG_USE_SEMAPHORES. */ +#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) || defined(__DOXIGEN__) #define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE +#endif /** * @brief Mutexes APIs. @@ -184,7 +208,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_MUTEXES) || defined(__DOXIGEN__) #define CH_CFG_USE_MUTEXES TRUE +#endif /** * @brief Enables recursive behavior on mutexes. @@ -194,7 +220,9 @@ * @note The default is @p FALSE. * @note Requires @p CH_CFG_USE_MUTEXES. */ +#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) || defined(__DOXIGEN__) #define CH_CFG_USE_MUTEXES_RECURSIVE FALSE +#endif /** * @brief Conditional Variables APIs. @@ -204,7 +232,9 @@ * @note The default is @p TRUE. * @note Requires @p CH_CFG_USE_MUTEXES. */ +#if !defined(CH_CFG_USE_CONDVARS) || defined(__DOXIGEN__) #define CH_CFG_USE_CONDVARS TRUE +#endif /** * @brief Conditional Variables APIs with timeout. @@ -214,7 +244,9 @@ * @note The default is @p TRUE. * @note Requires @p CH_CFG_USE_CONDVARS. */ +#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) || defined(__DOXIGEN__) #define CH_CFG_USE_CONDVARS_TIMEOUT TRUE +#endif /** * @brief Events Flags APIs. @@ -222,7 +254,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_EVENTS) || defined(__DOXIGEN__) #define CH_CFG_USE_EVENTS TRUE +#endif /** * @brief Events Flags APIs with timeout. @@ -232,7 +266,9 @@ * @note The default is @p TRUE. * @note Requires @p CH_CFG_USE_EVENTS. */ +#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) || defined(__DOXIGEN__) #define CH_CFG_USE_EVENTS_TIMEOUT TRUE +#endif /** * @brief Synchronous Messages APIs. @@ -241,7 +277,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_MESSAGES) || defined(__DOXIGEN__) #define CH_CFG_USE_MESSAGES TRUE +#endif /** * @brief Synchronous Messages queuing mode. @@ -252,7 +290,9 @@ * requirements. * @note Requires @p CH_CFG_USE_MESSAGES. */ +#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) || defined(__DOXIGEN__) #define CH_CFG_USE_MESSAGES_PRIORITY FALSE +#endif /** * @brief Mailboxes APIs. @@ -262,7 +302,9 @@ * @note The default is @p TRUE. * @note Requires @p CH_CFG_USE_SEMAPHORES. */ +#if !defined(CH_CFG_USE_MAILBOXES) || defined(__DOXIGEN__) #define CH_CFG_USE_MAILBOXES TRUE +#endif /** * @brief Core Memory Manager APIs. @@ -271,7 +313,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_MEMCORE) || defined(__DOXIGEN__) #define CH_CFG_USE_MEMCORE TRUE +#endif /** * @brief Heap Allocator APIs. @@ -283,7 +327,9 @@ * @p CH_CFG_USE_SEMAPHORES. * @note Mutexes are recommended. */ +#if !defined(CH_CFG_USE_HEAP) || defined(__DOXIGEN__) #define CH_CFG_USE_HEAP TRUE +#endif /** * @brief Memory Pools Allocator APIs. @@ -292,7 +338,9 @@ * * @note The default is @p TRUE. */ +#if !defined(CH_CFG_USE_MEMPOOLS) || defined(__DOXIGEN__) #define CH_CFG_USE_MEMPOOLS TRUE +#endif /** * @brief Dynamic Threads APIs. @@ -303,7 +351,9 @@ * @note Requires @p CH_CFG_USE_WAITEXIT. * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. */ +#if !defined(CH_CFG_USE_DYNAMIC) || defined(__DOXIGEN__) #define CH_CFG_USE_DYNAMIC TRUE +#endif /** @} */ @@ -319,7 +369,9 @@ * * @note The default is @p FALSE. */ +#if !defined(CH_DBG_STATISTICS) || defined(__DOXIGEN__) #define CH_DBG_STATISTICS FALSE +#endif /** * @brief Debug option, system state check. @@ -328,7 +380,9 @@ * * @note The default is @p FALSE. */ +#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXIGEN__) #define CH_DBG_SYSTEM_STATE_CHECK FALSE +#endif /** * @brief Debug option, parameters checks. @@ -337,7 +391,9 @@ * * @note The default is @p FALSE. */ +#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXIGEN__) #define CH_DBG_ENABLE_CHECKS FALSE +#endif /** * @brief Debug option, consistency checks. @@ -347,7 +403,9 @@ * * @note The default is @p FALSE. */ +#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXIGEN__) #define CH_DBG_ENABLE_ASSERTS FALSE +#endif /** * @brief Debug option, trace buffer. @@ -356,14 +414,18 @@ * * @note The default is @p CH_DBG_TRACE_MASK_NONE. */ +#if !defined(CH_DBG_TRACE_MASK) || defined(__DOXIGEN__) #define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_NONE +#endif /** * @brief Trace buffer entries. * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is * different from @p CH_DBG_TRACE_MASK_NONE. */ +#if !defined(CH_DBG_TRACE_BUFFER_SIZE) || defined(__DOXIGEN__) #define CH_DBG_TRACE_BUFFER_SIZE 128 +#endif /** * @brief Debug option, stack checks. @@ -375,7 +437,9 @@ * @note The default failure mode is to halt the system with the global * @p panic_msg variable set to @p NULL. */ +#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXIGEN__) #define CH_DBG_ENABLE_STACK_CHECK FALSE +#endif /** * @brief Debug option, stacks initialization. @@ -385,7 +449,9 @@ * * @note The default is @p FALSE. */ +#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXIGEN__) #define CH_DBG_FILL_THREADS FALSE +#endif /** * @brief Debug option, threads profiling. @@ -396,7 +462,9 @@ * @note This debug option is not currently compatible with the * tickless mode. */ +#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXIGEN__) #define CH_DBG_THREADS_PROFILING FALSE +#endif /** @} */