Эх сурвалжийг харах

Fix a bug in TCB recovery

Youngbin Kim 1 жил өмнө
parent
commit
6c72151791

+ 1 - 1
Core/Inc/ImC/imc_api.h

@@ -38,7 +38,7 @@
 #define POWER_OFF				GPIO_PIN_RESET		// CAM, Sensors, etc. (KETI, 230811)
 
 #define EPS_CAP_VOLT_GPIO		0
-#define EPS_CAP_VOLT_ADC		1
+#define EPS_CAP_VOLT_ADC		0
 
 #if (EPS_CAP_VOLT_GPIO)
 #define EPS_SBC_OFF_LEVEL		1					// 1~7

+ 1 - 1
Core/Inc/ImC/imc_kernel.h

@@ -3,7 +3,7 @@
 
 #define imcUSE_IMC_KERNEL 1
 
-#define imcSTM32_CUBE_IDE 1
+#define imcSTM32_CUBE_IDE 0
 
 #define imcMAX_NUM_TASKS 5
 #define imcSTACK_SIZE (1024)

+ 3 - 1
Core/Src/ImC/imc_api.c

@@ -108,6 +108,7 @@ INIT_ERROR:
 
 uint16_t ilen = 0;
 
+uint8_t buf[4096];
 
 /* 2022. 8. 25. fix logical seq. error under V0706 protocol; stop -> read length -> read data -> resume */
 int32_t imc_sc03mpd_capture (sc03mpd_ifx_t* ifx) {
@@ -126,7 +127,8 @@ int32_t imc_sc03mpd_capture (sc03mpd_ifx_t* ifx) {
 	/* READ image data */
 	//printf("[SC03MPD] download to 0x%08X\r\n", IMG_RAM_ADDR);
 
-	uint8_t* imem = (uint8_t*)IMG_RAM_ADDR;
+	// uint8_t* imem = (uint8_t*)IMG_RAM_ADDR;
+	uint8_t* imem = (uint8_t*)buf;
 	uint16_t addr = 0;
 	uint16_t nreq = 0;
 	uint16_t rest = ilen;

+ 57 - 26
Core/Src/main.c

@@ -106,17 +106,18 @@ SRAM_HandleTypeDef hsram3;
 SRAM_HandleTypeDef hsram4;
 
 /* Definitions for taskEPS */
-osThreadId_t taskEPSHandle;
-uint32_t taskEPSBuffer[ imcSTACK_SIZE ];
-osStaticThreadDef_t taskEPSControlBlock;
-const osThreadAttr_t taskEPS_attributes = {
-  .name = "taskEPS",
-  .stack_mem = &taskEPSBuffer[0],
-  .stack_size = sizeof(taskEPSBuffer),
-  .cb_mem = &taskEPSControlBlock,
-  .cb_size = sizeof(taskEPSControlBlock),
-  .priority = (osPriority_t) osPriorityRealtime,
-};
+// osThreadId_t taskEPSHandle;
+// uint32_t taskEPSBuffer[ imcSTACK_SIZE ];
+// osStaticThreadDef_t taskEPSControlBlock;
+// const osThreadAttr_t taskEPS_attributes = {
+//   .name = "taskEPS",
+//   .stack_mem = &taskEPSBuffer[0],
+//   .stack_size = sizeof(taskEPSBuffer),
+//   .cb_mem = &taskEPSControlBlock,
+//   .cb_size = sizeof(taskEPSControlBlock),
+//   .priority = (osPriority_t) osPriorityRealtime,
+// };
+
 /* Definitions for taskSnap */
 osThreadId_t taskSnapHandle;
 uint32_t taskSnapBuffer[ imcSTACK_SIZE ];
@@ -129,18 +130,45 @@ const osThreadAttr_t taskSnap_attributes = {
   .cb_size = sizeof(taskSnapControlBlock),
   .priority = (osPriority_t) osPriorityRealtime,
 };
-/* Definitions for taskAI */
-osThreadId_t taskAIHandle;
-uint32_t taskAIBuffer[ 37968 ];
-osStaticThreadDef_t taskAIControlBlock;
-const osThreadAttr_t taskAI_attributes = {
-  .name = "taskAI",
-  .stack_mem = &taskAIBuffer[0],
-  .stack_size = sizeof(taskAIBuffer),
-  .cb_mem = &taskAIControlBlock,
-  .cb_size = sizeof(taskAIControlBlock),
-  .priority = (osPriority_t) osPriorityNormal,
+
+/* Definitions for taskTest1 */
+osThreadId_t taskTest1Handle;
+uint32_t taskTest1Buffer[ imcSTACK_SIZE ];
+osStaticThreadDef_t taskTest1ControlBlock;
+const osThreadAttr_t taskTest1_attributes = {
+  .name = "taskTest1",
+  .stack_mem = &taskTest1Buffer[0],
+  .stack_size = sizeof(taskTest1Buffer),
+  .cb_mem = &taskTest1ControlBlock,
+  .cb_size = sizeof(taskTest1ControlBlock),
+  .priority = (osPriority_t) osPriorityRealtime,
 };
+
+/* Definitions for taskTest2 */
+osThreadId_t taskTest2Handle;
+uint32_t taskTest2Buffer[ imcSTACK_SIZE ];
+osStaticThreadDef_t taskTest2ControlBlock;
+const osThreadAttr_t taskTest2_attributes = {
+  .name = "taskTest2",
+  .stack_mem = &taskTest2Buffer[0],
+  .stack_size = sizeof(taskTest2Buffer),
+  .cb_mem = &taskTest2ControlBlock,
+  .cb_size = sizeof(taskTest2ControlBlock),
+  .priority = (osPriority_t) osPriorityRealtime,
+};
+
+/* Definitions for taskAI */
+// osThreadId_t taskAIHandle;
+// uint32_t taskAIBuffer[ 37968 ];
+// osStaticThreadDef_t taskAIControlBlock;
+// const osThreadAttr_t taskAI_attributes = {
+//   .name = "taskAI",
+//   .stack_mem = &taskAIBuffer[0],
+//   .stack_size = sizeof(taskAIBuffer),
+//   .cb_mem = &taskAIControlBlock,
+//   .cb_size = sizeof(taskAIControlBlock),
+//   .priority = (osPriority_t) osPriorityNormal,
+// };
 /* USER CODE BEGIN PV */
 
 /* USER CODE END PV */
@@ -299,9 +327,9 @@ int main(void)
 
   /* creation of taskSnap */
   #if (imcUSE_IMC_KERNEL == 1)
-  // taskSnapHandle = imcOsThreadNew(taskSnapRunner, NULL, &taskSnap_attributes);
-  taskSnapHandle = imcOsThreadNew(taskImcTest, NULL, &taskSnap_attributes);
-  taskEPSHandle = imcOsThreadNew(taskImcTest_2, NULL, &taskEPS_attributes);
+  taskSnapHandle = imcOsThreadNew(taskSnapRunner, NULL, &taskSnap_attributes);
+  taskTest1Handle = imcOsThreadNew(taskImcTest, NULL, &taskTest1_attributes);
+  taskTest2Handle = imcOsThreadNew(taskImcTest_2, NULL, &taskTest2_attributes);
   #else
   // taskSnapHandle = osThreadNew(taskSnapRunner, NULL, &taskSnap_attributes);
   #endif
@@ -1411,12 +1439,12 @@ void taskEPSRunner(void *argument)
 * @param argument: Not used
 * @retval None
 */
-uint32_t trial = 1;
 extern uint16_t ilen;
 /* USER CODE END Header_taskSnapRunner */
 void taskSnapRunner(void *argument)
 {
   /* USER CODE BEGIN taskSnapRunner */
+  uint32_t trial = 1;
 	sc03mpd_ifx_t ifx = {
 		.context = (void*)&UART_HANDLER_CAM,
 		.sendif  = hal_uart_ifx_send,
@@ -1481,6 +1509,8 @@ void taskSnapRunner(void *argument)
 		 */
 		imc_cam_power_off();
 
+    imcREQUEST_CHECKPOINT();
+
 		// error_count reset
 		error_count = 0;
 
@@ -1568,6 +1598,7 @@ void taskImcTest_2(void *argument)
   {
     osDelay(2000);
     printf("\tj=%d\r\n", i++);
+    // imcREQUEST_CHECKPOINT();
   }
 }
 

+ 8 - 0
Middlewares/Third_Party/FreeRTOS/Source/tasks.c

@@ -5358,9 +5358,17 @@ void vRecoverTask(TCB_t *tcb)
 	UBaseType_t taskNumber = pxCurrentTCB->uxTCBNumber;
 	uint8_t bufferIndex = ucLatestBufferIndex[taskNumber];
 
+	// Should not recover TCB list items; save it and overwrite afterwards
+	// All members of ListItem_t is a pointer, so use a shallow copy
+	ListItem_t state = tcb->xStateListItem;
+	ListItem_t event = tcb->xEventListItem;
+
 	// recover TCB
 	memcpy(tcb, &xTcbSnapshots[taskNumber][bufferIndex], sizeof(TCB_t));
 
+	tcb->xStateListItem = state;
+	tcb->xEventListItem = event;
+
 	// recover stack
 	memcpy((void *)(tcb->pxTopOfStack), (void *)((unsigned int)(xImcTaskStackBuffers[taskNumber][bufferIndex]) + (unsigned int)(prvUNUSED_STACK_SIZE(tcb))), prvUSED_STACK_SIZE(tcb));