diff --git a/configs/mikroe-stm32f4/kernel/up_userspace.c b/configs/mikroe-stm32f4/kernel/up_userspace.c index ed2f7d8a95..b70a4e80a6 100644 --- a/configs/mikroe-stm32f4/kernel/up_userspace.c +++ b/configs/mikroe-stm32f4/kernel/up_userspace.c @@ -130,7 +130,7 @@ const struct userspace_s userspace __attribute__ ((section (".userspace"))) = /* User-space work queue support (declared in include/nuttx/wqueue.h) */ -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) +#ifdef CONFIG_SCHED_USRWORK .work_usrstart = work_usrstart, #endif }; diff --git a/configs/open1788/kernel/up_userspace.c b/configs/open1788/kernel/up_userspace.c index 48413ec159..29864ae106 100644 --- a/configs/open1788/kernel/up_userspace.c +++ b/configs/open1788/kernel/up_userspace.c @@ -130,7 +130,7 @@ const struct userspace_s userspace __attribute__ ((section (".userspace"))) = /* User-space work queue support (declared in include/nuttx/wqueue.h) */ -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) +#ifdef CONFIG_SCHED_USRWORK .work_usrstart = work_usrstart, #endif }; diff --git a/configs/sam3u-ek/kernel/up_userspace.c b/configs/sam3u-ek/kernel/up_userspace.c index 7a71c8ad16..c9e07a1b03 100644 --- a/configs/sam3u-ek/kernel/up_userspace.c +++ b/configs/sam3u-ek/kernel/up_userspace.c @@ -130,7 +130,7 @@ const struct userspace_s userspace __attribute__ ((section (".userspace"))) = /* User-space work queue support (declared in include/nuttx/wqueue.h) */ -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) +#ifdef CONFIG_SCHED_USRWORK .work_usrstart = work_usrstart, #endif }; diff --git a/configs/stm3240g-eval/kernel/up_userspace.c b/configs/stm3240g-eval/kernel/up_userspace.c index 7947c99de4..8a68a70e20 100644 --- a/configs/stm3240g-eval/kernel/up_userspace.c +++ b/configs/stm3240g-eval/kernel/up_userspace.c @@ -130,7 +130,7 @@ const struct userspace_s userspace __attribute__ ((section (".userspace"))) = /* User-space work queue support (declared in include/nuttx/wqueue.h) */ -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) +#ifdef CONFIG_SCHED_USRWORK .work_usrstart = work_usrstart, #endif }; diff --git a/configs/stm32f4discovery/kernel/up_userspace.c b/configs/stm32f4discovery/kernel/up_userspace.c index 36065bdaed..0c5d7548df 100644 --- a/configs/stm32f4discovery/kernel/up_userspace.c +++ b/configs/stm32f4discovery/kernel/up_userspace.c @@ -131,7 +131,7 @@ const struct userspace_s userspace __attribute__ ((section (".userspace"))) = /* User-space work queue support (declared in include/nuttx/wqueue.h) */ -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) +#ifdef CONFIG_SCHED_USRWORK .work_usrstart = work_usrstart, #endif }; diff --git a/include/nuttx/userspace.h b/include/nuttx/userspace.h index a8286b7972..ce47a90cdc 100644 --- a/include/nuttx/userspace.h +++ b/include/nuttx/userspace.h @@ -149,7 +149,7 @@ struct userspace_s /* User-space work queue support */ -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) +#ifdef CONFIG_SCHED_USRWORK int (*work_usrstart)(void); #endif }; diff --git a/include/nuttx/wqueue.h b/include/nuttx/wqueue.h index 37c5b7b5d4..e55bdd20b5 100644 --- a/include/nuttx/wqueue.h +++ b/include/nuttx/wqueue.h @@ -51,7 +51,9 @@ * Pre-processor Definitions ****************************************************************************/ /* Configuration ************************************************************/ -/* CONFIG_SCHED_WORKQUEUE. Create a dedicated "worker" thread to +/* CONFIG_SCHED_WORKQUEUE. Not selectable. Set by the configuration system + * if either CONFIG_SCHED_HPWORK or CONFIG_SCHED_LPWORK are selected. + * CONFIG_SCHED_HPWORK. Create a dedicated "worker" thread to * handle delayed processing from interrupt handlers. This feature * is required for some drivers but, if there are not complaints, * can be safely disabled. The worker thread also performs @@ -59,7 +61,7 @@ * from interrupt handlers. If the worker thread is disabled, * then that clean will be performed by the IDLE thread instead * (which runs at the lowest of priority and may not be appropriate - * if memory reclamation is of high priority). If CONFIG_SCHED_WORKQUEUE + * if memory reclamation is of high priority). If CONFIG_SCHED_HPWORK * is enabled, then the following options can also be used: * CONFIG_SCHED_HPWORK - Build the high priority work queue. To preserve * legacy behavior, CONFIG_SCHED_HPWORK is assumed to be true in a flat @@ -77,11 +79,10 @@ * CONFIG_SIG_SIGWORK - The signal number that will be used to wake-up * the worker thread. Default: 17 * - * CONFIG_SCHED_LPWORK. If CONFIG_SCHED_WORKQUEUE is defined, then a single - * work queue is created by default. If CONFIG_SCHED_LPWORK is also defined - * then an additional, lower-priority work queue will also be created. This - * lower priority work queue is better suited for more extended processing - * (such as file system clean-up operations) + * CONFIG_SCHED_LPWORK. If CONFIG_SCHED_LPWORK is selected then a lower- + * priority work queue will be created. This lower priority work queue + * is better suited for more extended processing (such as file system + * clean-up operations) * CONFIG_SCHED_LPNTHREADS - The number of thread in the low-priority queue's * thread pool. Default: 1 * CONFIG_SCHED_LPWORKPRIORITY - The minimum execution priority of the lower @@ -119,10 +120,7 @@ # undef CONFIG_SCHED_HPWORK # undef CONFIG_SCHED_LPWORK - -# ifndef CONFIG_SCHED_USRWORK -# undef CONFIG_SCHED_WORKQUEUE -# endif +# undef CONFIG_SCHED_WORKQUEUE /* User-space worker threads are not built in a kernel build when we are * building the kernel-space libraries (but we still need to know that it @@ -144,7 +142,7 @@ # undef CONFIG_SCHED_USRWORK #endif -#ifdef CONFIG_SCHED_WORKQUEUE +#if defined(CONFIG_SCHED_WORKQUEUE) || defined(CONFIG_SCHED_USRWORK) /* High priority, kernel work queue configuration ***************************/ @@ -471,5 +469,5 @@ void lpwork_restorepriority(uint8_t reqprio); #endif #endif /* __ASSEMBLY__ */ -#endif /* CONFIG_SCHED_WORKQUEUE */ +#endif /* CONFIG_SCHED_WORKQUEUE || CONFIG_SCHED_USRWORK */ #endif /* __INCLUDE_NUTTX_WQUEUE_H */ diff --git a/libc/Kconfig b/libc/Kconfig index 028c70cfae..8226793f78 100644 --- a/libc/Kconfig +++ b/libc/Kconfig @@ -393,174 +393,15 @@ endif # ARCH_OPTIMIZED_FUNCTIONS comment "Non-standard Library Support" -config SCHED_WORKQUEUE - bool "Enable worker thread" - default n - depends on !DISABLE_SIGNALS - ---help--- - Create a dedicated "worker" thread to handle delayed processing from interrupt - handlers. This feature is required for some drivers but, if there are no - complaints, can be safely disabled. The worker thread also performs - garbage collection -- completing any delayed memory deallocations from - interrupt handlers. If the worker thread is disabled, then that clean up will - be performed by the IDLE thread instead (which runs at the lowest of priority - and may not be appropriate if memory reclamation is of high priority). - -if SCHED_WORKQUEUE - -config SCHED_HPWORK - bool "High priority (kernel) worker thread" - default y - ---help--- - If SCHED_WORKQUEUE is defined, then a single, high priority work - queue is created by default. This high priority worker thread is - intended to serve as the "bottom half" for driver interrupt - handling. - -if SCHED_HPWORK - -config SCHED_WORKPRIORITY - int "High priority worker thread priority" - default 224 - ---help--- - The execution priority of the higher priority worker thread. - - The higher priority worker thread is intended to serve as the - "bottom" half for device drivers. As a consequence it must run at - a very high, fixed priority. Typically, it should be the highest - priority thread in your system. Default: 192 - - For lower priority, application oriented worker thread support, - please consider enabling the lower priority work queue. The lower - priority work queue runs at a lower priority, of course, but has - the added advantage that it supports "priority inheritance" (if - PRIORITY_INHERITANCE is also selected): The priority of the lower - priority worker thread can then be adjusted to match the highest - priority client. - -config SCHED_WORKPERIOD - int "High priority worker thread period" - default 100000 if SCHED_LPWORK - default 50000 if !SCHED_LPWORK - ---help--- - How often the worker thread checks for work in units of microseconds. - Default: If the high priority worker thread is performing garbage - collection, then the default is 50*1000 (50 MS). Otherwise, if the - lower priority worker thread is performing garbage collection, the - default is 100*1000. - -config SCHED_WORKSTACKSIZE - int "High priority worker thread stack size" - default 2048 - ---help--- - The stack size allocated for the worker thread. Default: 2K. - -endif # SCHED_HPWORK - -config SCHED_LPWORK - bool "Low priority (kernel) worker thread" - default n - ---help--- - If SCHED_WORKQUEUE is defined, then a single work queue is created by - default. If SCHED_LPWORK is also defined then an additional, lower- - priority work queue will also be created. This lower priority work - queue is better suited for more extended, application oriented - processing (such as file system clean-up operations or asynchronous - I/O) - -if SCHED_LPWORK - -config SCHED_LPNTHREADS - int "Number of low-priority worker threads" - default 1 if !FS_AIO - default 4 if FS_AIO - ---help--- - This options selectes multiple, low-priority threads. This is - essentially a "thread pool" that provides multi-threaded service - of the low-priority work thread. This breaks the serialization - of the "queue" (hence, it is no longer a queue at all). - - This options is required to support, for example, I/O operations - that stall waiting for input. If there is only a single thread, - then the entire low-priority queue processing stalls in such cases. - Such behvior must be support for asynchronous I/O, AIO (for example). - -config SCHED_LPWORKPRIORITY - int "Low priority worker thread priority" - default 50 - ---help--- - The minimum execution priority of the lower priority worker thread. - - The lower priority worker thread is intended support application- - oriented functions. The lower priority work queue runs at a lower - priority, of course, but has the added advantage that it supports - "priority inheritance" (if PRIORITY_INHERITANCE is also selected): - The priority of the lower priority worker thread can then be - adjusted to match the highest priority client. Default: 50 - - NOTE: This priority inheritance feature is not automatic. The - lower priority worker thread will always a fixed priority unless - you implement logic that calls lpwork_boostpriority() to raise the - priority of the lower priority worker thread (typically called - before scheduling the work) and then call the matching - lpwork_restorepriority() when the work is completed (typically - called within the work handler at the completion of the work). - Currently, only the NuttX asynchronous I/O logic uses this dynamic - prioritization feature. - - The higher priority worker thread, on the other hand, is intended - to serve as the "bottom" half for device drivers. As a consequence - it must run at a very high, fixed priority. Typically, it should - be the highest priority thread in your system. - -config SCHED_LPWORKPRIOMAX - int "Low priority worker thread maximum priority" - default 176 - depends on PRIORITY_INHERITANCE - ---help--- - The maximum execution priority of the lower priority worker thread. - - The lower priority worker thread is intended support application- - oriented functions. The lower priority work queue runs at a lower - priority, of course, but has the added advantage that it supports - "priority inheritance" (if PRIORITY_INHERITANCE is also selected): - The priority of the lower priority worker thread can then be - adjusted to match the highest priority client. - - The higher priority worker thread, on the other hand, is intended - to serve as the "bottom" half for device drivers. As a consequence - it must run at a very high, fixed priority. Typically, it should - be the highest priority thread in your system. - - This function provides an upper limit on the priority of the lower - priority worker thread. This would be necessary, for example, if - the higher priority worker thread were to defer work to the lower - priority thread. Clearly, in such a case, you would want to limit - the maximum priority of the lower priority work thread. Default: - 176 - -config SCHED_LPWORKPERIOD - int "Low priority worker thread period" - default 50000 - ---help--- - How often the lower priority worker thread checks for work in units - of microseconds. Default: 50*1000 (50 MS). - -config SCHED_LPWORKSTACKSIZE - int "Low priority worker thread stack size" - default 2048 - ---help--- - The stack size allocated for the lower priority worker thread. Default: 2K. - -endif # SCHED_LPWORK - if BUILD_PROTECTED || BUILD_KERNEL config SCHED_USRWORK bool "User mode worker thread" default n + depends on !DISABLE_SIGNALS ---help--- - User space work queues can also be made available for deferred processing in the NuttX kernel build. + User space work queues can also be made available for deferred + processing in the NuttX kernel build. if SCHED_USRWORK @@ -585,7 +426,6 @@ config SCHED_USRWORKSTACKSIZE endif # SCHED_USRWORK endif # BUILD_PROTECTED -endif # SCHED_WORKQUEUE config LIB_KBDCODEC bool "Keyboard CODEC" diff --git a/libc/wqueue/Make.defs b/libc/wqueue/Make.defs index 36a2ccc98c..ae2d6d5f4d 100644 --- a/libc/wqueue/Make.defs +++ b/libc/wqueue/Make.defs @@ -33,7 +33,7 @@ # ############################################################################ -ifeq ($(CONFIG_SCHED_WORKQUEUE),y) +ifeq ($(CONFIG_SCHED_USRWORK),y) # Add the work queue C files to the build diff --git a/libc/wqueue/work_cancel.c b/libc/wqueue/work_cancel.c index 322a85ae70..0db49f2465 100644 --- a/libc/wqueue/work_cancel.c +++ b/libc/wqueue/work_cancel.c @@ -48,8 +48,7 @@ #include "wqueue/wqueue.h" -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) && \ - !defined(__KERNEL__) +#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) /**************************************************************************** * Pre-processor Definitions @@ -163,4 +162,4 @@ int work_cancel(int qid, FAR struct work_s *work) } } -#endif /* CONFIG_SCHED_WORKQUEUE && CONFIG_SCHED_USRWORK && !__KERNEL__ */ +#endif /* CONFIG_SCHED_USRWORK && !__KERNEL__ */ diff --git a/libc/wqueue/work_lock.c b/libc/wqueue/work_lock.c index 8c39a2bbb8..59de461bcc 100644 --- a/libc/wqueue/work_lock.c +++ b/libc/wqueue/work_lock.c @@ -46,8 +46,7 @@ #include "wqueue/wqueue.h" -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) && \ - !defined(__KERNEL__) +#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) /**************************************************************************** * Pre-processor Definitions @@ -136,4 +135,4 @@ void work_unlock(void) #endif } -#endif /* CONFIG_SCHED_WORKQUEUE && CONFIG_SCHED_USRWORK && !__KERNEL__*/ +#endif /* CONFIG_SCHED_USRWORK && !__KERNEL__*/ diff --git a/libc/wqueue/work_queue.c b/libc/wqueue/work_queue.c index 19e441178e..78280baac9 100644 --- a/libc/wqueue/work_queue.c +++ b/libc/wqueue/work_queue.c @@ -50,8 +50,7 @@ #include "wqueue/wqueue.h" -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) && \ - !defined(__KERNEL__) +#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) /**************************************************************************** * Pre-processor Definitions @@ -175,4 +174,4 @@ int work_queue(int qid, FAR struct work_s *work, worker_t worker, } } -#endif /* CONFIG_SCHED_WORKQUEUE && CONFIG_SCHED_USRWORK && !__KERNEL__ */ +#endif /* CONFIG_SCHED_USRWORK && !__KERNEL__ */ diff --git a/libc/wqueue/work_signal.c b/libc/wqueue/work_signal.c index 1ab861dfed..62a29e26c3 100644 --- a/libc/wqueue/work_signal.c +++ b/libc/wqueue/work_signal.c @@ -46,7 +46,7 @@ #include "wqueue/wqueue.h" -#ifdef CONFIG_SCHED_WORKQUEUE +#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) /**************************************************************************** * Pre-processor Definitions @@ -113,4 +113,3 @@ int work_signal(int qid) } #endif /* CONFIG_SCHED_USRWORK && !__KERNEL__ */ -#endif /* CONFIG_SCHED_WORKQUEUE */ diff --git a/libc/wqueue/work_usrthread.c b/libc/wqueue/work_usrthread.c index 48ccf1f8bc..fc41837cce 100644 --- a/libc/wqueue/work_usrthread.c +++ b/libc/wqueue/work_usrthread.c @@ -52,8 +52,7 @@ #include "wqueue/wqueue.h" -#if defined(CONFIG_SCHED_WORKQUEUE) && defined(CONFIG_SCHED_USRWORK) && \ - !defined(__KERNEL__) +#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) /**************************************************************************** * Pre-processor Definitions @@ -404,4 +403,4 @@ int work_usrstart(void) #endif } -#endif /* CONFIG_SCHED_WORKQUEUE && CONFIG_SCHED_USRWORK && !__KERNEL__*/ +#endif /* CONFIG_SCHED_USRWORK && !__KERNEL__*/ diff --git a/libc/wqueue/wqueue.h b/libc/wqueue/wqueue.h index 13bfacf0a0..e40a7f0371 100644 --- a/libc/wqueue/wqueue.h +++ b/libc/wqueue/wqueue.h @@ -47,7 +47,7 @@ #include -#ifdef CONFIG_SCHED_WORKQUEUE +#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) /**************************************************************************** * Pre-processor Definitions @@ -70,7 +70,6 @@ struct usr_wqueue_s * Public Data ****************************************************************************/ -#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) /* The state of the user mode work queue */ extern struct usr_wqueue_s g_usrwork; @@ -105,9 +104,7 @@ extern pthread_mutex_t g_usrmutex; * ****************************************************************************/ -#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) int work_lock(void); -#endif /**************************************************************************** * Name: work_unlock @@ -123,9 +120,7 @@ int work_lock(void); * ****************************************************************************/ -#if defined(CONFIG_SCHED_USRWORK) && !defined(__KERNEL__) void work_unlock(void); -#endif -#endif /* CONFIG_SCHED_WORKQUEUE */ +#endif /* CONFIG_SCHED_USRWORK && !__KERNEL__*/ #endif /* __LIBC_WQUEUE_WQUEUE_H */ diff --git a/sched/Kconfig b/sched/Kconfig index 3b9f8d0062..641002b46b 100644 --- a/sched/Kconfig +++ b/sched/Kconfig @@ -786,7 +786,7 @@ config SIG_SIGCONDTIMEDOUT config SIG_SIGWORK int "SIGWORK" default 17 - depends on SCHED_WORKQUEUE + depends on SCHED_WORKQUEUE || SCHED_USRWORK ---help--- SIGWORK is a non-standard signal used to wake up the internal NuttX worker thread. This setting specifies the signal number that will be @@ -813,6 +813,175 @@ config MQ_MAXMSGSIZE endmenu # POSIX Message Queue Options +menu "Work Queue Support" + +config SCHED_WORKQUEUE +# bool "Enable worker thread" + bool + default n + depends on !DISABLE_SIGNALS + ---help--- + Create dedicated "worker" threads to handle delayed or asynchronous + processing. + +config SCHED_HPWORK + bool "High priority (kernel) worker thread" + default y + depends on !DISABLE_SIGNALS + select SCHED_WORKQUEUE + ---help--- + Create a dedicated high-priority "worker" thread to handle delayed + processing from interrupt handlers. This feature is required for + some drivers but, if there are no complaints, can be safely + disabled. The high priority worker thread also performs garbage + collection -- completing any delayed memory deallocations from + interrupt handlers. If the high-priority worker thread is disabled, + then that clean up will be performed either by (1) the low-priority + worker thread, if enabled, and if not (2) the IDLE thread instead + (which runs at the lowest of priority and may not be appropriate if + memory reclamation is of high priority) + + For other, less-critical asynchronous or delayed process, the + low-priority worker thread is recommended. + +if SCHED_HPWORK + +config SCHED_WORKPRIORITY + int "High priority worker thread priority" + default 224 + ---help--- + The execution priority of the higher priority worker thread. + + The higher priority worker thread is intended to serve as the + "bottom" half for device drivers. As a consequence it must run at + a very high, fixed priority. Typically, it should be the highest + priority thread in your system. Default: 192 + + For lower priority, application oriented worker thread support, + please consider enabling the lower priority work queue. The lower + priority work queue runs at a lower priority, of course, but has + the added advantage that it supports "priority inheritance" (if + PRIORITY_INHERITANCE is also selected): The priority of the lower + priority worker thread can then be adjusted to match the highest + priority client. + +config SCHED_WORKPERIOD + int "High priority worker thread period" + default 100000 if SCHED_LPWORK + default 50000 if !SCHED_LPWORK + ---help--- + How often the worker thread checks for work in units of microseconds. + Default: If the high priority worker thread is performing garbage + collection, then the default is 50*1000 (50 MS). Otherwise, if the + lower priority worker thread is performing garbage collection, the + default is 100*1000. + +config SCHED_WORKSTACKSIZE + int "High priority worker thread stack size" + default 2048 + ---help--- + The stack size allocated for the worker thread. Default: 2K. + +endif # SCHED_HPWORK + +config SCHED_LPWORK + bool "Low priority (kernel) worker thread" + default n + depends on !DISABLE_SIGNALS + select SCHED_WORKQUEUE + ---help--- + If SCHED_LPWORK is defined then a lower-priority work queue will + be created. This lower priority work queue is better suited for + more extended, application oriented processing (such as file system + clean-up operations or asynchronous I/O) + +if SCHED_LPWORK + +config SCHED_LPNTHREADS + int "Number of low-priority worker threads" + default 1 if !FS_AIO + default 4 if FS_AIO + ---help--- + This options selects multiple, low-priority threads. This is + essentially a "thread pool" that provides multi-threaded service + of the low-priority work thread. This breaks the serialization + of the "queue" (hence, it is no longer a queue at all). + + This options is required to support, for example, I/O operations + that stall waiting for input. If there is only a single thread, + then the entire low-priority queue processing stalls in such cases. + Such behvior must be support for asynchronous I/O, AIO (for example). + +config SCHED_LPWORKPRIORITY + int "Low priority worker thread priority" + default 50 + ---help--- + The minimum execution priority of the lower priority worker thread. + + The lower priority worker thread is intended support application- + oriented functions. The lower priority work queue runs at a lower + priority, of course, but has the added advantage that it supports + "priority inheritance" (if PRIORITY_INHERITANCE is also selected): + The priority of the lower priority worker thread can then be + adjusted to match the highest priority client. Default: 50 + + NOTE: This priority inheritance feature is not automatic. The + lower priority worker thread will always a fixed priority unless + you implement logic that calls lpwork_boostpriority() to raise the + priority of the lower priority worker thread (typically called + before scheduling the work) and then call the matching + lpwork_restorepriority() when the work is completed (typically + called within the work handler at the completion of the work). + Currently, only the NuttX asynchronous I/O logic uses this dynamic + prioritization feature. + + The higher priority worker thread, on the other hand, is intended + to serve as the "bottom" half for device drivers. As a consequence + it must run at a very high, fixed priority. Typically, it should + be the highest priority thread in your system. + +config SCHED_LPWORKPRIOMAX + int "Low priority worker thread maximum priority" + default 176 + depends on PRIORITY_INHERITANCE + ---help--- + The maximum execution priority of the lower priority worker thread. + + The lower priority worker thread is intended support application- + oriented functions. The lower priority work queue runs at a lower + priority, of course, but has the added advantage that it supports + "priority inheritance" (if PRIORITY_INHERITANCE is also selected): + The priority of the lower priority worker thread can then be + adjusted to match the highest priority client. + + The higher priority worker thread, on the other hand, is intended + to serve as the "bottom" half for device drivers. As a consequence + it must run at a very high, fixed priority. Typically, it should + be the highest priority thread in your system. + + This function provides an upper limit on the priority of the lower + priority worker thread. This would be necessary, for example, if + the higher priority worker thread were to defer work to the lower + priority thread. Clearly, in such a case, you would want to limit + the maximum priority of the lower priority work thread. Default: + 176 + +config SCHED_LPWORKPERIOD + int "Low priority worker thread period" + default 50000 + ---help--- + How often the lower priority worker thread checks for work in units + of microseconds. Default: 50*1000 (50 MS). + +config SCHED_LPWORKSTACKSIZE + int "Low priority worker thread stack size" + default 2048 + ---help--- + The stack size allocated for the lower priority worker thread. Default: 2K. + +endif # SCHED_LPWORK +endmenu # Work Queue Support + menu "Stack and heap information" config IDLETHREAD_STACKSIZE