Browse Source

update:优化os的event机制,可以运行的快那么一点

alienwalker 3 years ago
parent
commit
561008481f

+ 2 - 2
bsp/air105/include/FreeRTOSConfig.h

@@ -79,7 +79,7 @@
 #define configUSE_IDLE_HOOK               1
 #define configUSE_TICK_HOOK               0
 #define configMAX_PRIORITIES              (7)
-#define configSUPPORT_STATIC_ALLOCATION   0
+#define configSUPPORT_STATIC_ALLOCATION   1
 #define configCPU_CLOCK_HZ                (SystemCoreClock)
 #define configTICK_RATE_HZ                ((TickType_t)100)
 #define configMINIMAL_STACK_SIZE          ((uint16_t)256)
@@ -96,7 +96,7 @@
 #define configUSE_APPLICATION_TASK_TAG    0
 #define configUSE_COUNTING_SEMAPHORES     1
 #define configGENERATE_RUN_TIME_STATS     0
-#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 4
+#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0
 #define configUSE_TASK_NOTIFICATIONS		1
 #define configTASK_NOTIFICATION_ARRAY_ENTRIES    2
 /* Co-routine definitions. */

+ 1 - 1
bsp/air105/test/full_ota_test.c

@@ -168,7 +168,7 @@ void prvFOTA_Test(void *p)
 	{
 		OutFlash_Test();
 	}
-	Task_Exit();
+	Task_Exit(NULL);
 }
 
 void FOTA_InFlashInit(void)

+ 1 - 1
bsp/air105/test/test_usb_device.c

@@ -114,7 +114,7 @@ void prvUSB_Test(void *p)
     	Test_USBStart();
     	Core_USBDefaultDeviceStart(0);
     }
-	Task_Exit();
+	Task_Exit(NULL);
 }
 void USB_TestInit(void)
 {

+ 1 - 1
bsp/common/include/core_task.h

@@ -30,6 +30,6 @@ HANDLE Task_GetCurrent(void);
 void Task_DelayTick(uint64_t Tick);
 void Task_DelayUS(uint32_t US);
 void Task_DelayMS(uint32_t MS);
-void Task_Exit(void);
+void Task_Exit(HANDLE TaskHandle);
 void Task_Debug(HANDLE TaskHandle);
 #endif

+ 1 - 1
bsp/common/src/bsp_common.c

@@ -161,6 +161,7 @@ __attribute__((weak)) uint32_t OS_EnterCritical(void)
 	{
 		__disable_irq();
 	}
+	return 0;
 }
 __attribute__((weak)) void OS_ExitCritical(uint32_t Critical)
 {
@@ -343,7 +344,6 @@ int32_t OS_BufferWriteLimit(Buffer_Struct *Buf, void *Data, uint32_t Len)
 void OS_BufferRemove(Buffer_Struct *Buf, uint32_t Len)
 {
 	uint32_t RestLen;
-	uint32_t i;
 	if (!Buf)
 		return ;
 	if (!Buf->Data)

+ 105 - 83
bsp/common/src/core_task.c

@@ -22,22 +22,26 @@
 #include "user.h"
 #ifdef __BUILD_OS__
 #define __USE_FREERTOS_NOTIFY__
+#define __USE_CORE_TIMER__
 enum
 {
-	TASK_POINT_LIST_HEAD,
-#ifdef __USE_SEMAPHORE__
-	TASK_POINT_EVENT_SEM,
-	TASK_POINT_DELAY_SEM,
-#endif
-	TASK_POINT_EVENT_TIMER,
-	TASK_POINT_DELAY_TIMER,
-	TASK_POINT_DEBUG,
-#ifdef __USE_FREERTOS_NOTIFY__
 	TASK_NOTIFY_EVENT = tskDEFAULT_INDEX_TO_NOTIFY,
 	TASK_NOTIFY_DELAY,
-#endif
 };
 
+typedef struct
+{
+	StaticTask_t TCB;
+	uint8_t dummy[1];	//不加这个就会死机
+	volatile llist_head EventHead;
+#ifdef __USE_CORE_TIMER__
+	Timer_t *EventTimer;
+	Timer_t *DelayTimer;
+#endif
+	uint16_t EventCnt;
+	uint8_t isRun;
+}Core_TaskStruct;
+
 typedef struct
 {
 	llist_head Node;
@@ -47,11 +51,10 @@ typedef struct
 	uint32_t Param3;
 }Core_EventStruct;
 
-extern void * vTaskGetPoint(TaskHandle_t xHandle, uint8_t Sn);
-extern void vTaskSetPoint(TaskHandle_t xHandle, uint8_t Sn, void * p);
+
 extern void *vTaskGetCurrent(void);
 extern char * vTaskInfo(void *xHandle, uint32_t *StackTopAddress, uint32_t *StackStartAddress, uint32_t *Len);
-extern void vTaskModifyPoint(TaskHandle_t xHandle, uint8_t Sn, int Add);
+
 
 static int32_t prvTaskTimerCallback(void *pData, void *pParam)
 {
@@ -59,89 +62,96 @@ static int32_t prvTaskTimerCallback(void *pData, void *pParam)
 	return 0;
 }
 
+#ifdef __USE_CORE_TIMER__
 static int32_t prvTaskDelayTimerCallback(void *pData, void *pParam)
 {
-#ifdef __USE_SEMAPHORE__
-	SemaphoreHandle_t sem = (SemaphoreHandle_t)vTaskGetPoint(pParam, TASK_POINT_DELAY_SEM);
-	OS_MutexRelease(sem);
-#endif
-#ifdef __USE_FREERTOS_NOTIFY__
 	BaseType_t xHigherPriorityTaskWoken = pdFALSE;
 	vTaskGenericNotifyGiveFromISR(pParam, TASK_NOTIFY_DELAY, &xHigherPriorityTaskWoken);
 	if (xHigherPriorityTaskWoken)
 	{
 		portYIELD_WITHIN_API();
 	}
-#endif
 	return 0;
 }
-
+#endif
 HANDLE Task_Create(TaskFun_t EntryFunction, void *Param, uint32_t StackSize, uint32_t Priority, const char *Name)
 {
-	TaskHandle_t Handle;
-	llist_head *Head;
-	Timer_t *Timer, *DelayTimer;
-#ifdef __USE_SEMAPHORE__
-	SemaphoreHandle_t Sem, DelaySem;
-#endif
-	if (pdPASS != xTaskCreate(EntryFunction, Name, StackSize>>2, Param, Priority, &Handle))
+	StackSize = (StackSize + 3) >> 2;
+	uint32_t *stack_mem = zalloc(StackSize * 4);
+	Core_TaskStruct *Handle = zalloc(sizeof(Core_TaskStruct));
+	if (!Handle || !stack_mem)
 	{
+		free(Handle);
+		free(stack_mem);
 		return NULL;
 	}
-	if (!Handle) return NULL;
-	Head = zalloc(sizeof(llist_head));
-#ifdef __USE_SEMAPHORE__
-	Sem = OS_MutexCreate();
-	DelaySem = OS_MutexCreate();
-#endif
-	Timer = Timer_Create(prvTaskTimerCallback, Handle, NULL);
-	DelayTimer = Timer_Create(prvTaskDelayTimerCallback, Handle, NULL);
-	INIT_LLIST_HEAD(Head);
-	vTaskSetPoint(Handle, TASK_POINT_LIST_HEAD, Head);
-#ifdef __USE_SEMAPHORE__
-	vTaskSetPoint(Handle, TASK_POINT_EVENT_SEM, Sem);
-	vTaskSetPoint(Handle, TASK_POINT_DELAY_SEM, DelaySem);
+	if (!xTaskCreateStatic(EntryFunction, Name, StackSize, Param, Priority, stack_mem, &Handle->TCB))
+	{
+		free(Handle);
+		free(stack_mem);
+		return NULL;
+	}
+#ifdef __USE_CORE_TIMER__
+	Handle->EventTimer = Timer_Create(prvTaskTimerCallback, Handle, NULL);
+	Handle->DelayTimer = Timer_Create(prvTaskDelayTimerCallback, Handle, NULL);
 #endif
-	vTaskSetPoint(Handle, TASK_POINT_DELAY_TIMER, DelayTimer);
-	vTaskSetPoint(Handle, TASK_POINT_EVENT_TIMER, Timer);
-	vTaskSetPoint(Handle, TASK_POINT_DEBUG, 0);
-//	DBG("%s, %x", Name, Handle);
+	Handle->TCB.uxDummy20 = 0;
+	INIT_LLIST_HEAD(&Handle->EventHead);
+	Handle->isRun = 1;
 	return Handle;
 }
 
-void Task_Exit(void)
+static int32_t DeleteTaskEvent(void *data, void *param)
+{
+	return LIST_DEL;
+}
+
+void Task_Exit(HANDLE TaskHandle)
 {
-	vTaskDelete(NULL);
+	if (!TaskHandle)
+	{
+		TaskHandle = vTaskGetCurrent();
+	}
+	Core_TaskStruct *Handle = (Core_TaskStruct *)TaskHandle;
+	uint32_t cr;
+	cr = OS_EnterCritical();
+	llist_traversal(&Handle->EventHead, DeleteTaskEvent, NULL);
+	Handle->isRun = 0;
+#ifdef __USE_CORE_TIMER__
+	Timer_Release(Handle->EventTimer);
+	Timer_Release(Handle->DelayTimer);
+#endif
+	OS_ExitCritical(cr);
+	vTaskDelete(&Handle->TCB);
+
 }
 
 void Task_SendEvent(HANDLE TaskHandle, uint32_t ID, uint32_t P1, uint32_t P2, uint32_t P3)
 {
 	if (!TaskHandle) return;
 	uint32_t Critical;
-	volatile llist_head *Head = (llist_head *)vTaskGetPoint(TaskHandle, TASK_POINT_LIST_HEAD);
-#ifdef __USE_SEMAPHORE__
-	SemaphoreHandle_t sem = (SemaphoreHandle_t)vTaskGetPoint(TaskHandle, TASK_POINT_EVENT_SEM);
-#endif
-	Core_EventStruct *Event = zalloc(sizeof(Core_EventStruct));
+
+	Core_TaskStruct *Handle = (void *)TaskHandle;
+	volatile Core_EventStruct *Event = zalloc(sizeof(Core_EventStruct));
+	volatile Core_EventStruct *Event2;
 	Event->ID = ID;
 	Event->Param1 = P1;
 	Event->Param2 = P2;
 	Event->Param3 = P3;
 
 	Critical = OS_EnterCritical();
-	vTaskModifyPoint(TaskHandle, TASK_POINT_DEBUG, 1);
-	llist_add_tail(&Event->Node, Head);
-	if (vTaskGetPoint(TaskHandle, TASK_POINT_DEBUG) >= 1024)
+	Handle->EventCnt++;
+	Event2 = Handle->EventHead.next;
+	llist_add_tail(&Event->Node, &(Handle->EventHead));
+	Event2 = Handle->EventHead.next;
+	if (Handle->EventCnt >= 1024)
 	{
-		DBG_Trace("%s wait too much msg! %u", vTaskInfo(TaskHandle, &ID, &P1, &P2), vTaskGetPoint(TaskHandle, TASK_POINT_DEBUG));
+		DBG_Trace("%s wait too much msg! %u", vTaskInfo(TaskHandle, &ID, &P1, &P2), Handle->EventCnt);
 		Core_PrintServiceStack();
 		__disable_irq();
 		while(1) {;}
 	}
 	OS_ExitCritical(Critical);
-#ifdef __USE_SEMAPHORE__
-	OS_MutexRelease(sem);
-#endif
 #ifdef __USE_FREERTOS_NOTIFY__
 	BaseType_t xHigherPriorityTaskWoken = pdFALSE;
 	if (OS_CheckInIrq())
@@ -171,25 +181,25 @@ int32_t Task_GetEvent(HANDLE TaskHandle, uint32_t TargetEventID, OS_EVENT *OutEv
 		return -ERROR_PERMISSION_DENIED;
 	}
 	if (!TaskHandle) return -ERROR_PARAM_INVALID;
-	llist_head *Head = (llist_head *)vTaskGetPoint(TaskHandle, TASK_POINT_LIST_HEAD);
-#ifdef __USE_SEMAPHORE__
-	SemaphoreHandle_t sem = (SemaphoreHandle_t)vTaskGetPoint(TaskHandle, TASK_POINT_EVENT_SEM);
-#endif
-	Timer_t *Timer = (Timer_t *)vTaskGetPoint(TaskHandle, TASK_POINT_EVENT_TIMER);
+	Core_TaskStruct *Handle = (void *)TaskHandle;
+	if (vTaskGetCurrent() != TaskHandle)
+	{
+		return -1;
+	}
 	if (Tick)
 	{
 		ToTick = GetSysTick() + Tick;
 	}
 GET_NEW_EVENT:
 	Critical = OS_EnterCritical();
-
-	if (!llist_empty(Head))
+	if (!llist_empty(&Handle->EventHead))
 	{
-		Event = (Core_EventStruct *)Head->next;
+
+		Event = (Core_EventStruct *)Handle->EventHead.next;
 		llist_del(&Event->Node);
-		if (vTaskGetPoint(TaskHandle, TASK_POINT_DEBUG) > 0)
+		if (Handle->EventCnt > 0)
 		{
-			vTaskModifyPoint(TaskHandle, TASK_POINT_DEBUG, -1);
+			Handle->EventCnt--;
 		}
 
 	}
@@ -249,7 +259,7 @@ WAIT_NEW_EVENT:
 	{
 		if (ToTick > (5 * SYS_TIMER_1US + GetSysTick()))
 		{
-			Timer_Start(Timer, ToTick - GetSysTick(), 0);
+			Timer_Start(Handle->EventTimer, ToTick - GetSysTick(), 0);
 
 		}
 		else
@@ -258,15 +268,12 @@ WAIT_NEW_EVENT:
 			goto GET_EVENT_DONE;
 		}
 	}
-#ifdef __USE_SEMAPHORE__
-	OS_MutexLock(sem);
-#endif
 #ifdef __USE_FREERTOS_NOTIFY__
 	xTaskGenericNotifyWait(TASK_NOTIFY_EVENT, 0, 0, NULL, portMAX_DELAY);
 #endif
 	goto GET_NEW_EVENT;
 GET_EVENT_DONE:
-	Timer_Stop(Timer);
+	Timer_Stop(Handle->EventTimer);
 	return Result;
 }
 
@@ -297,14 +304,8 @@ void Task_DelayTick(uint64_t Tick)
 		return;
 	}
 	HANDLE TaskHandle = vTaskGetCurrent();
-#ifdef __USE_SEMAPHORE__
-	SemaphoreHandle_t sem = (SemaphoreHandle_t)vTaskGetPoint(TaskHandle, TASK_POINT_DELAY_SEM);
-#endif
-	Timer_t *Timer = (Timer_t *)vTaskGetPoint(TaskHandle, TASK_POINT_DELAY_TIMER);
-	Timer_Start(Timer, Tick, 0);
-#ifdef __USE_SEMAPHORE__
-	OS_MutexLock(sem);
-#endif
+	Core_TaskStruct *Handle = (void *)TaskHandle;
+	Timer_Start(Handle->DelayTimer, Tick, 0);
 #ifdef __USE_FREERTOS_NOTIFY__
 	xTaskGenericNotifyWait(TASK_NOTIFY_DELAY, 0, 0, NULL, portMAX_DELAY);
 #endif
@@ -330,8 +331,8 @@ void Task_Debug(HANDLE TaskHandle)
 	{
 		TaskHandle = vTaskGetCurrent();
 	}
-	volatile llist_head *Head = (llist_head *)vTaskGetPoint(TaskHandle, TASK_POINT_LIST_HEAD);
-	DBG("%x,%x,%x", Head, Head->next, Head->prev);
+	Core_TaskStruct *Handle = (void *)TaskHandle;
+	DBG("%x,%x,%x", &Handle->EventHead, Handle->EventHead.next, Handle->EventHead.prev);
 }
 #else
 void Task_SendEvent(HANDLE TaskHandle, uint32_t ID, uint32_t P1, uint32_t P2, uint32_t P3)
@@ -339,3 +340,24 @@ void Task_SendEvent(HANDLE TaskHandle, uint32_t ID, uint32_t P1, uint32_t P2, ui
 
 }
 #endif
+
+static StaticTask_t prvIdleTCB;
+static StaticTask_t prvTimerTaskTCB;
+StackType_t  prvIdleTaskStack[256];
+StackType_t  prvTimerTaskStack[256];
+void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
+                                           StackType_t ** ppxIdleTaskStackBuffer,
+                                           uint32_t * pulIdleTaskStackSize ) /*lint !e526 Symbol not defined as it is an application callback. */
+{
+	*ppxIdleTaskTCBBuffer = &prvIdleTCB;
+	*ppxIdleTaskStackBuffer = prvIdleTaskStack;
+	*pulIdleTaskStackSize = 256;
+}
+void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
+                                      StackType_t ** ppxTimerTaskStackBuffer,
+                                          uint32_t * pulTimerTaskStackSize )
+{
+	*ppxTimerTaskTCBBuffer = &prvTimerTaskTCB;
+	*ppxTimerTaskStackBuffer = prvTimerTaskStack;
+	*pulTimerTaskStackSize = 256;
+}

+ 0 - 29
os/FreeRTOS_v10/src/tasks.c

@@ -5440,35 +5440,6 @@ char * vTaskName(void)
 }
 /*-----------------------------------------------------------*/
 
-void * vTaskGetPoint(TaskHandle_t xHandle, uint8_t Sn)
-{
-	if (Sn >= configNUM_THREAD_LOCAL_STORAGE_POINTERS) return NULL;
-	TCB_t * pxTCB = prvGetTCBFromHandle( xHandle );
-	return pxTCB->pvThreadLocalStoragePointers[Sn];
-}
-
-void vTaskSetPoint(TaskHandle_t xHandle, uint8_t Sn, void * p)
-{
-	if (Sn >= configNUM_THREAD_LOCAL_STORAGE_POINTERS) return ;
-	TCB_t * pxTCB = prvGetTCBFromHandle( xHandle );
-	pxTCB->pvThreadLocalStoragePointers[Sn] = p;
-}
-
-void vTaskModifyPoint(TaskHandle_t xHandle, uint8_t Sn, int Add)
-{
-	if (Sn >= configNUM_THREAD_LOCAL_STORAGE_POINTERS) return ;
-	TCB_t * pxTCB = prvGetTCBFromHandle( xHandle );
-	if (Add > 0)
-	{
-		pxTCB->pvThreadLocalStoragePointers[Sn]++;
-	}
-	else
-	{
-		pxTCB->pvThreadLocalStoragePointers[Sn]--;
-	}
-
-}
-
 void *vTaskGetCurrent(void)
 {
 	return pxCurrentTCB;