diff --git a/include/sys/sem.h b/include/sys/sem.h index 94e0b15f46d..c34354c3e23 100644 --- a/include/sys/sem.h +++ b/include/sys/sem.h @@ -39,6 +39,41 @@ struct sys_sem { #endif }; +/** + * @brief Statically define and initialize a sys_sem + * + * The semaphore can be accessed outside the module where it is defined using: + * + * @code extern struct sys_sem ; @endcode + * + * Route this to memory domains using K_APP_DMEM(). + * + * @param _name Name of the semaphore. + * @param _initial_count Initial semaphore count. + * @param _count_limit Maximum permitted semaphore count. + */ +#ifdef CONFIG_USERSPACE +#define SYS_SEM_DEFINE(_name, _initial_count, _count_limit) \ + struct sys_sem _name = { \ + .futex = { _initial_count }, \ + .limit = _count_limit \ + }; \ + BUILD_ASSERT(((_count_limit) != 0) && \ + ((_initial_count) <= (_count_limit))) +#else +/* Stuff this in the section with the rest of the k_sem objects, since they + * are identical and can be treated as a k_sem in the boot initialization code + */ +#define SYS_SEM_DEFINE(_name, _initial_count, _count_limit) \ + Z_DECL_ALIGN(struct sys_sem) _name \ + __in_section(_k_sem, static, _name) = { \ + .kernel_sem = Z_SEM_INITIALIZER(_name.kernel_sem, \ + _initial_count, _count_limit) \ + }; \ + BUILD_ASSERT(((_count_limit) != 0) && \ + ((_initial_count) <= (_count_limit))) +#endif + /** * @brief Initialize a semaphore. * diff --git a/tests/kernel/mem_protect/sys_sem/src/main.c b/tests/kernel/mem_protect/sys_sem/src/main.c index 5ee1e95d973..df5585b765b 100644 --- a/tests/kernel/mem_protect/sys_sem/src/main.c +++ b/tests/kernel/mem_protect/sys_sem/src/main.c @@ -21,7 +21,7 @@ ZTEST_BMEM struct sys_sem simple_sem; ZTEST_BMEM struct sys_sem low_prio_sem; ZTEST_BMEM struct sys_sem mid_prio_sem; ZTEST_DMEM struct sys_sem high_prio_sem; -ZTEST_DMEM struct sys_sem multiple_thread_sem; +ZTEST_DMEM SYS_SEM_DEFINE(multiple_thread_sem, SEM_INIT_VAL, SEM_MAX_VAL); K_THREAD_STACK_DEFINE(stack_1, STACK_SIZE); K_THREAD_STACK_DEFINE(stack_2, STACK_SIZE); @@ -344,7 +344,6 @@ void test_sem_take_multiple(void) sys_sem_init(&high_prio_sem, SEM_INIT_VAL, SEM_MAX_VAL); sys_sem_init(&mid_prio_sem, SEM_INIT_VAL, SEM_MAX_VAL); sys_sem_init(&low_prio_sem, SEM_INIT_VAL, SEM_MAX_VAL); - sys_sem_init(&multiple_thread_sem, SEM_INIT_VAL, SEM_MAX_VAL); k_thread_create(&sem_tid, stack_1, STACK_SIZE, sem_take_multiple_low_prio_helper, @@ -512,7 +511,6 @@ void test_sem_multiple_threads_wait(void) #endif sys_sem_init(&simple_sem, SEM_INIT_VAL, SEM_MAX_VAL); - sys_sem_init(&multiple_thread_sem, SEM_INIT_VAL, SEM_MAX_VAL); do { for (int i = 0; i < TOTAL_THREADS_WAITING; i++) {