Selaa lähdekoodia

add:添加rtos_task

Dozingfiretruck 3 vuotta sitten
vanhempi
sitoutus
e34a3c9bbc
1 muutettua tiedostoa jossa 103 lisäystä ja 38 poistoa
  1. 103 38
      app/port/luat_rtos_air101.c

+ 103 - 38
app/port/luat_rtos_air101.c

@@ -33,47 +33,119 @@
 #define LUAT_LOG_TAG "luat.rtos"
 #include "luat_log.h"
 
-// int luat_thread_start(luat_thread_t* thread){
-// 	thread->task_stk = luat_heap_malloc((thread->stack_size)*sizeof(uint32_t));
-// 	return tls_os_task_create(NULL, thread->name,(void (*)(void *param))thread->entry,NULL,thread->task_stk,(thread->stack_size)*sizeof(uint32_t),thread->priority,0);
-// }
 
-// LUAT_RET luat_thread_stop(luat_thread_t* thread) {
-//     return LUAT_ERR_FAIL;
-// }
+int luat_rtos_task_create(luat_rtos_task_handle *task_handle, uint32_t stack_size, uint8_t priority, const char *task_name, luat_rtos_task_entry task_fun, void* user_data, uint16_t event_cout)
+{
+	if (!task_handle) return -1;
+	return xTaskCreate(task_fun,
+		task_name,
+		stack_size/sizeof(uint32_t),
+		user_data,
+		priority,
+		task_handle	);
+}
 
-// LUAT_RET luat_thread_delete(luat_thread_t* thread) {
-// 	return LUAT_ERR_FAIL;
-// }
+int luat_rtos_task_delete(luat_rtos_task_handle task_handle)
+{
+	if (!task_handle) return -1;
+	vTaskDelete(task_handle);
+	return 0;
+}
 
+int luat_rtos_task_suspend(luat_rtos_task_handle task_handle)
+{
+	if (!task_handle) return -1;
+	vTaskSuspend(task_handle);
+	return 0;
+}
 
+int luat_rtos_task_resume(luat_rtos_task_handle task_handle)
+{
+	if (!task_handle) return -1;
+	vTaskResume(task_handle);
+	return 0;
+}
+uint32_t luat_rtos_task_HighWaterMark(luat_rtos_task_handle task_handle)
+{
+	if (!task_handle) return -1;
+	return uxTaskGetStackHighWaterMark(task_handle);
+}
+void luat_rtos_task_sleep(uint32_t ms)
+{
+	vTaskDelay(ms);
+}
 
-// void *luat_queue_create(size_t msgcount, size_t msgsize){
-// 	tls_os_queue_t *queue = (tls_os_queue_t *)luat_heap_malloc(sizeof(tls_os_queue_t));
-// 	tls_os_queue_create(&queue, msgcount);
-// 	return queue;
-// }
+void luat_task_suspend_all(void)
+{
+	vTaskSuspendAll();
+}
+void luat_task_resume_all(void)
+{
+	xTaskResumeAll();
+}
 
-// LUAT_RET luat_queue_send(void*   queue, void* msg,  size_t msg_size, size_t timeout){
-// 	return tls_os_queue_send((tls_os_queue_t *)queue, msg, msg_size);
-// }
+void *luat_get_current_task(void)
+{
+	return xTaskGetCurrentTaskHandle();
+}
 
-// LUAT_RET luat_queue_recv(void*   queue, void* msg, size_t msg_size, size_t timeout){
-// 	return tls_os_queue_receive((tls_os_queue_t *)queue, (void **) &msg, msg_size, timeout);
-// }
 
-// LUAT_RET luat_queue_reset(void*   queue){
-// 	return tls_os_queue_flush((tls_os_queue_t *)queue);
-// }
+int luat_rtos_queue_create(luat_rtos_queue_t *queue_handle, uint32_t item_count, uint32_t item_size)
+{
+	if (!queue_handle) return -1;
+	xQueueHandle pxNewQueue;
+	pxNewQueue = xQueueCreate(item_count, item_size);
+	if (!pxNewQueue)
+		return -1;
+	*queue_handle = pxNewQueue;
+	return 0;
+}
 
-// LUAT_RET luat_queue_delete(void*   queue){
-// 	return tls_os_queue_delete((tls_os_queue_t *)queue);
-// }
+int luat_rtos_queue_delete(luat_rtos_queue_t queue_handle)
+{
+	if (!queue_handle) return -1;
+    vQueueDelete ((xQueueHandle)queue_handle);
+	return 0;
+}
 
-// LUAT_RET luat_queue_free(void*   queue){
-// 	luat_heap_free((tls_os_queue_t *)queue);
-// 	return 0;
-// }
+int luat_rtos_queue_send(luat_rtos_queue_t queue_handle, void *item, uint32_t item_size, uint32_t timeout)
+{
+	if (!queue_handle || !item) return -1;
+	if (tls_get_isr_count()>0)
+	{
+		BaseType_t pxHigherPriorityTaskWoken;
+		if (xQueueSendToBackFromISR(queue_handle, item, &pxHigherPriorityTaskWoken) != pdPASS)
+			return -1;
+		portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);
+		return 0;
+	}
+	else
+	{
+		if (xQueueSendToBack (queue_handle, item, timeout) != pdPASS)
+			return -1;
+	}
+	return 0;
+}
+
+int luat_rtos_queue_recv(luat_rtos_queue_t queue_handle, void *item, uint32_t item_size, uint32_t timeout)
+{
+	if (!queue_handle || !item)
+		return -1;
+	BaseType_t yield = pdFALSE;
+	if (tls_get_isr_count()>0)
+	{
+		if (xQueueReceiveFromISR(queue_handle, item, &yield) != pdPASS)
+			return -1;
+		portYIELD_FROM_ISR(yield);
+		return 0;
+	}
+	else
+	{
+		if (xQueueReceive(queue_handle, item, timeout) != pdPASS)
+			return -1;
+	}
+	return 0;
+}
 
 // LUAT_RET luat_send_event_to_task(void *task_handle, uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3) {
 //     return LUAT_ERR_OK;
@@ -132,10 +204,3 @@ void luat_release_rtos_timer(void *timer){
 	luat_heap_free(luat_timer);
 }
 
-void luat_task_suspend_all(void){
-	vTaskSuspendAll();
-}
-
-void luat_task_resume_all(void){
-	xTaskResumeAll();
-}