summaryrefslogtreecommitdiff
path: root/osal
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-06-03 17:31:31 +0800
committersakumisu <[email protected]>2025-06-03 22:43:35 +0800
commitbff8a632a926cf976c3bbb18097f8a70d7cd9b93 (patch)
treed2219f3e1674f78b8cc69bae6aa18df06cac8be5 /osal
parenta8bf2687bde6ff5eb8e5b501226cb21945a7f8df (diff)
feat(class): add usb_osal_thread_schedule_other to allow the applications which use the struct usbh_xxx to exit properly before free struct usbh_xxx
Signed-off-by: sakumisu <[email protected]>
Diffstat (limited to 'osal')
-rw-r--r--osal/idf/usb_osal_idf.c12
-rw-r--r--osal/usb_osal_freertos.c12
-rw-r--r--osal/usb_osal_liteos_m.c12
-rw-r--r--osal/usb_osal_nuttx.c12
-rw-r--r--osal/usb_osal_rtthread.c17
-rw-r--r--osal/usb_osal_threadx.c12
-rw-r--r--osal/usb_osal_zephyr.c16
7 files changed, 93 insertions, 0 deletions
diff --git a/osal/idf/usb_osal_idf.c b/osal/idf/usb_osal_idf.c
index b64539d9..a79faf8e 100644
--- a/osal/idf/usb_osal_idf.c
+++ b/osal/idf/usb_osal_idf.c
@@ -25,6 +25,18 @@ void usb_osal_thread_delete(usb_osal_thread_t thread)
vTaskDelete(thread);
}
+void usb_osal_thread_schedule_other(void)
+{
+ TaskHandle_t xCurrentTask = xTaskGetCurrentTaskHandle();
+ const UBaseType_t old_priority = uxTaskPriorityGet(xCurrentTask);
+
+ vTaskPrioritySet(xCurrentTask, tskIDLE_PRIORITY);
+
+ taskYIELD();
+
+ vTaskPrioritySet(xCurrentTask, old_priority);
+}
+
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
{
return (usb_osal_sem_t)xSemaphoreCreateCounting(1, initial_count);
diff --git a/osal/usb_osal_freertos.c b/osal/usb_osal_freertos.c
index e03275c1..6bdd883b 100644
--- a/osal/usb_osal_freertos.c
+++ b/osal/usb_osal_freertos.c
@@ -30,6 +30,18 @@ void usb_osal_thread_delete(usb_osal_thread_t thread)
vTaskDelete(thread);
}
+void usb_osal_thread_schedule_other(void)
+{
+ TaskHandle_t xCurrentTask = xTaskGetCurrentTaskHandle();
+ const UBaseType_t old_priority = uxTaskPriorityGet(xCurrentTask);
+
+ vTaskPrioritySet(xCurrentTask, tskIDLE_PRIORITY);
+
+ taskYIELD();
+
+ vTaskPrioritySet(xCurrentTask, old_priority);
+}
+
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
{
usb_osal_sem_t sem = (usb_osal_sem_t)xSemaphoreCreateCounting(1, initial_count);
diff --git a/osal/usb_osal_liteos_m.c b/osal/usb_osal_liteos_m.c
index 9e97dbb9..cda86665 100644
--- a/osal/usb_osal_liteos_m.c
+++ b/osal/usb_osal_liteos_m.c
@@ -55,6 +55,18 @@ void usb_osal_thread_delete(usb_osal_thread_t thread)
}
}
+void usb_osal_thread_schedule_other(void)
+{
+ UINT32 task_id = LOS_CurTaskIDGet();
+ const UINT16 old_priority = LOS_TaskPriGet(task_id);
+
+ LOS_TaskPriSet(task_id, OS_TASK_PRIORITY_LOWEST);
+
+ LOS_TaskYield();
+
+ LOS_TaskPriSet(task_id, old_priority);
+}
+
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
{
UINT32 sem_handle;
diff --git a/osal/usb_osal_nuttx.c b/osal/usb_osal_nuttx.c
index 3a4e7f0c..49911573 100644
--- a/osal/usb_osal_nuttx.c
+++ b/osal/usb_osal_nuttx.c
@@ -63,6 +63,18 @@ void usb_osal_thread_delete(usb_osal_thread_t thread)
kthread_delete(pid);
}
+void usb_osal_thread_schedule_other(void)
+{
+ struct tcb_s *tcb = nxsched_self();
+ const int old_priority = tcb->sched_priority;
+
+ nxsched_set_priority(tcb, SCHED_PRIORITY_MIN);
+
+ sched_yield();
+
+ nxsched_set_priority(tcb, old_priority);
+}
+
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
{
int ret;
diff --git a/osal/usb_osal_rtthread.c b/osal/usb_osal_rtthread.c
index dd1075a5..14448fc4 100644
--- a/osal/usb_osal_rtthread.c
+++ b/osal/usb_osal_rtthread.c
@@ -34,6 +34,23 @@ void usb_osal_thread_delete(usb_osal_thread_t thread)
rt_thread_delete(thread);
}
+void usb_osal_thread_schedule_other(void)
+{
+ rt_thread_t self = rt_thread_self();
+ rt_uint8_t priority;
+#if (RTTHREAD_VERSION >= RT_VERSION_CHECK(5, 0, 0))
+ const rt_uint8_t old_priority = RT_SCHED_PRIV(self).current_priority;
+#else
+ const rt_uint8_t old_priority = self->current_priority;
+#endif
+ priority = RT_THREAD_PRIORITY_MAX - 1;
+ rt_thread_control(self, RT_THREAD_CTRL_CHANGE_PRIORITY, (void *)&priority);
+
+ rt_thread_yield();
+
+ rt_thread_control(self, RT_THREAD_CTRL_CHANGE_PRIORITY, (void *)&old_priority);
+}
+
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
{
usb_osal_sem_t sem = (usb_osal_sem_t)rt_sem_create("usbh_sem", initial_count, RT_IPC_FLAG_FIFO);
diff --git a/osal/usb_osal_threadx.c b/osal/usb_osal_threadx.c
index 5d2e13c7..62dd3b84 100644
--- a/osal/usb_osal_threadx.c
+++ b/osal/usb_osal_threadx.c
@@ -69,6 +69,18 @@ void usb_osal_thread_delete(usb_osal_thread_t thread)
tx_byte_release(thread);
}
+void usb_osal_thread_schedule_other(void)
+{
+ TX_THREAD *current_thread = tx_thread_identify();
+ const UINT old_priority = current_thread->tx_thread_priority;
+
+ tx_thread_priority_change(current_thread, TX_MAX_PRIORITIES - 1, &old_priority);
+
+ tx_thread_relinquish();
+
+ tx_thread_priority_change(current_thread, old_priority, &old_priority);
+}
+
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
{
TX_SEMAPHORE *sem_ptr = TX_NULL;
diff --git a/osal/usb_osal_zephyr.c b/osal/usb_osal_zephyr.c
index c087c962..ce214e6e 100644
--- a/osal/usb_osal_zephyr.c
+++ b/osal/usb_osal_zephyr.c
@@ -74,6 +74,22 @@ void usb_osal_thread_delete(usb_osal_thread_t thread)
k_free(thread);
}
+void usb_osal_thread_schedule_other(void)
+{
+#if (KERNELVERSION >= 0x3070000)
+ struct k_thread *current_thread = k_sched_current_thread_query();
+#else
+ struct k_thread *current_thread = z_current_get();
+#endif
+ const int old_priority = k_thread_priority_get(current_thread);
+
+ k_thread_priority_set(current_thread, K_LOWEST_APPLICATION_THREAD_PRIO);
+
+ k_yield();
+
+ k_thread_priority_set(current_thread, old_priority);
+}
+
usb_osal_sem_t usb_osal_sem_create(uint32_t initial_count)
{
struct k_sem *sem;