Browse Source

Add option to check capacitor voltage when checkpoint

Youngbin Kim 1 năm trước cách đây
mục cha
commit
556a4b7969

+ 56 - 31
CMakeLists.txt

@@ -7,6 +7,8 @@ set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
 # user configurations: use -D option to change these on command line
 set(IMC_INSERT_COMPILER_CHECKPOINTS 1 CACHE BOOL "" FORCE)
 set(IMC_ENABLE_EXTENSION 1 CACHE BOOL "" FORCE)
+set(IMC_USE_CHECKPOINT_PASS_COUNTER 1 CACHE BOOL "" FORCE)
+set(IMC_USE_CHECKPOINT_VOLTAGE_CHECK 0 CACHE BOOL "" FORCE)
 
 # set(CMAKE_C_COMPILER arm-none-eabi-gcc) #tested with: clang, arm-none-eabi-gcc
 set(CMAKE_C_COMPILER /home/ybkim/workspace/imc/llvm/llvm-17/build/bin/clang)
@@ -111,9 +113,26 @@ else()
     add_compile_definitions(imcUSE_IMC_EXTENSION=0)
     set(IMC_APP_FILES
         Core/Src/benchmarks/conv2d/conv2d.c
+        Core/Src/benchmarks/adc_demo/adc_demo.c
     )
 endif()
 
+if(IMC_USE_CHECKPOINT_PASS_COUNTER)
+    if(IMC_USE_CHECKPOINT_VOLTAGE_CHECK)
+        message(FATAL_ERROR "IMC_USE_CHECKPOINT_PASS_COUNTER and IMC_USE_CHECKPOINT_VOLTAGE_CHECK cannot be turned on simultaneously")
+    endif()
+    add_compile_definitions(imcUSE_CHECKPOINT_PASS_COUNTER=1)
+    add_compile_definitions(imcUSE_CHECKPOINT_VOLTAGE_CHECK=0)
+endif()
+
+if(IMC_USE_CHECKPOINT_VOLTAGE_CHECK)
+    if(IMC_USE_CHECKPOINT_PASS_COUNTER)
+        message(FATAL_ERROR "IMC_USE_CHECKPOINT_PASS_COUNTER and IMC_USE_CHECKPOINT_VOLTAGE_CHECK cannot be turned on simultaneously")
+    endif()
+    add_compile_definitions(imcUSE_CHECKPOINT_PASS_COUNTER=0)
+    add_compile_definitions(imcUSE_CHECKPOINT_VOLTAGE_CHECK=1)
+endif()
+
 # compile flags
 
 add_compile_definitions(USE_HAL_DRIVER STM32L552xx)
@@ -151,40 +170,46 @@ set(CMAKE_EXE_LINKER_FLAGS "${LD_ADDITIONAL_FILES} -T ${LINKER_SCRIPT}")
 project(imc_freeRTOS C ASM)
 add_executable(imc_freeRTOS ${SRC_FILES})
 
-if(IMC_INSERT_COMPILER_CHECKPOINTS)
-    if(NOT CMAKE_C_COMPILER MATCHES "clang")
-        message(FATAL_ERROR "compiler must be clang 17 to enable compiler checkpoint insertion")
+if(IMC_APP_FILES)
+    if(IMC_INSERT_COMPILER_CHECKPOINTS)
+        if(NOT CMAKE_C_COMPILER MATCHES "clang")
+            message(FATAL_ERROR "compiler must be clang 17 to enable compiler checkpoint insertion")
+        endif()
+        add_compile_definitions(imcUSE_IMC_KERNEL=1)
+        get_target_property(SRC_INCLUDES imc_freeRTOS INCLUDE_DIRECTORIES)
+        foreach(dir ${SRC_INCLUDES})
+            list(APPEND INCLUDE_DIRS "-I${dir}")
+        endforeach()
+        string(REPLACE " " ";" C_FLAGS ${CMAKE_C_FLAGS})
+
+        set(BASIC_OPT_PASSES "loop-simplify,loop-rotate,mem2reg,instcombine,instsimplify,dce,simplifycfg")
+        set(IMC_OPT_PASSES "imc-insert-checkpoints")
+        set(IMC_FLAGS ${IMC_BASE})
+        set(TARGET_TRIPPLE "--target=armv7em-none-eabi --sysroot=${CMAKE_SYSROOT}")
+
+        foreach(APP_SRC ${IMC_APP_FILES})
+            add_custom_command(
+                OUTPUT ${PROJECT_BINARY_DIR}/${APP_SRC}.s
+                DEPENDS ${APP_SRC}
+                # COMMAND ${CLANG_BIN} --target=armv8m-none-eabi --sysroot=${CMAKE_SYSROOT} -g ${C_FLAGS} -O0 -Xclang -disable-O0-optnone ${INCLUDE_DIRS} -D USE_HAL_DRIVER -D STM32L552xx -c -emit-llvm ${PROJECT_SOURCE_DIR}/${APP_SRC} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
+                COMMAND ${CMAKE_C_COMPILER} -g ${C_FLAGS} -O0 -Xclang -disable-O0-optnone ${INCLUDE_DIRS} -D USE_HAL_DRIVER -D STM32L552xx -c -emit-llvm ${PROJECT_SOURCE_DIR}/${APP_SRC} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
+                COMMAND ${OPT_BIN} -o ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc -load-pass-plugin=${LLVM_OPT_PLUGIN} -passes=${BASIC_OPT_PASSES},${IMC_OPT_PASSES} ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
+                COMMAND ${OPT_BIN} ${OPT} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc
+                COMMAND ${LLC_BIN} ${IMC_FLAGS} ${CPU} ${OPT} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.s ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc
+            )
+            list(APPEND APP_OPTS ${PROJECT_BINARY_DIR}/${APP_SRC}.s)
+        endforeach()
+        add_library(imc_apps "${APP_OPTS}")
+    else()
+        add_library(imc_apps "${IMC_APP_FILES}")
     endif()
-    add_compile_definitions(imcUSE_IMC_KERNEL=1)
-    get_target_property(SRC_INCLUDES imc_freeRTOS INCLUDE_DIRECTORIES)
-    foreach(dir ${SRC_INCLUDES})
-        list(APPEND INCLUDE_DIRS "-I${dir}")
-    endforeach()
-    string(REPLACE " " ";" C_FLAGS ${CMAKE_C_FLAGS})
-
-    set(BASIC_OPT_PASSES "loop-simplify,loop-rotate,mem2reg,instcombine,instsimplify,dce,simplifycfg")
-    set(IMC_OPT_PASSES "imc-insert-checkpoints")
-    set(IMC_FLAGS ${IMC_BASE})
-    set(TARGET_TRIPPLE "--target=armv7em-none-eabi --sysroot=${CMAKE_SYSROOT}")
-
-    foreach(APP_SRC ${IMC_APP_FILES})
-        add_custom_command(
-            OUTPUT ${PROJECT_BINARY_DIR}/${APP_SRC}.s
-            DEPENDS ${APP_SRC}
-            # COMMAND ${CLANG_BIN} --target=armv8m-none-eabi --sysroot=${CMAKE_SYSROOT} -g ${C_FLAGS} -O0 -Xclang -disable-O0-optnone ${INCLUDE_DIRS} -D USE_HAL_DRIVER -D STM32L552xx -c -emit-llvm ${PROJECT_SOURCE_DIR}/${APP_SRC} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
-            COMMAND ${CMAKE_C_COMPILER} -g ${C_FLAGS} -O0 -Xclang -disable-O0-optnone ${INCLUDE_DIRS} -D USE_HAL_DRIVER -D STM32L552xx -c -emit-llvm ${PROJECT_SOURCE_DIR}/${APP_SRC} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
-            COMMAND ${OPT_BIN} -o ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc -load-pass-plugin=${LLVM_OPT_PLUGIN} -passes=${BASIC_OPT_PASSES},${IMC_OPT_PASSES} ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
-            COMMAND ${OPT_BIN} ${OPT} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc
-            COMMAND ${LLC_BIN} ${IMC_FLAGS} ${CPU} ${OPT} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.s ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc
-        )
-        list(APPEND APP_OPTS ${PROJECT_BINARY_DIR}/${APP_SRC}.s)
-    endforeach()
-    add_library(imc_apps "${APP_OPTS}")
-else()
-    add_library(imc_apps "${IMC_APP_FILES}")
 endif()
 
-target_link_libraries(imc_freeRTOS PRIVATE imc_apps c m nosys gcc)
+if(IMC_APP_FILES)
+    target_link_libraries(imc_freeRTOS PRIVATE imc_apps c m nosys gcc)
+else()
+    target_link_libraries(imc_freeRTOS PRIVATE c m nosys gcc)
+endif()
 
 target_compile_options(imc_freeRTOS PRIVATE "-g")
 set_target_properties(imc_freeRTOS PROPERTIES LINK_DEPENDS ${LINKER_SCRIPT})

+ 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		0
+#define EPS_CAP_VOLT_ADC		1
 
 #if (EPS_CAP_VOLT_GPIO)
 #define EPS_SBC_OFF_LEVEL		1					// 1~7

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

@@ -5,8 +5,20 @@
     #define imcUSE_IMC_KERNEL 1
 #endif
 
+#ifndef imcUSE_CHECKPOINT_PASS_COUNTER
+    #define imcUSE_CHECKPOINT_PASS_COUNTER 0
+#endif
+
+#ifndef imcUSE_CHECKPOINT_VOLTAGE_CHECK
+    #define imcUSE_CHECKPOINT_VOLTAGE_CHECK 0
+#endif
+
 #ifndef imcCHECKPOINT_PASS_COUNT
-    #define imcCHECKPOINT_PASS_COUNT 100
+    #define imcCHECKPOINT_PASS_COUNT 1000
+#endif
+
+#ifndef imcCHECKPOINT_VOLTAGE
+    #define imcCHECKPOINT_VOLTAGE 4000 //in mV
 #endif
 
 #define imcSTM32_CUBE_IDE 0

+ 1 - 0
Core/Inc/benchmarks/benchmark_driver.h

@@ -12,6 +12,7 @@
 // void vMemAccessPatternTest();
 // void vMatMul();
 void vConv2d();
+void adc_demo();
 
 void vBenchmarkDriver(void *_benchmark);
 

+ 30 - 8
Core/Src/ImC/imc_kernel.c

@@ -1,8 +1,18 @@
+#include <stdio.h>
+
 #include "ImC/imc_kernel.h"
+#include "ImC/imc_api.h"
 #include "stm32l5xx.h"
+#include "cmsis_os.h"
+
+#if(imcUSE_CHECKPOINT_VOLTAGE_CHECK)
+    extern ADC_HandleTypeDef ADC_HANDLER_SBC;
+#endif
 
-int checkpointCounter = 0;
-const int checkpoint_pass_count = imcCHECKPOINT_PASS_COUNT;
+#if(imcUSE_CHECKPOINT_PASS_COUNTER)
+    int checkpointCounter = 0;
+    const int checkpoint_pass_count = imcCHECKPOINT_PASS_COUNT;
+#endif
 
 void imcInit()
 {
@@ -10,11 +20,23 @@ void imcInit()
 }
 
 int needCheckpointExecution() {
-    if (checkpointCounter == checkpoint_pass_count) {
-        checkpointCounter = 0;
+    #if(imcUSE_CHECKPOINT_VOLTAGE_CHECK)
+        int capacitor_voltage0 = measure_voltage(ADC_HANDLER_SBC, EPS_CAP_ID_SBC);
+        return capacitor_voltage0 < imcCHECKPOINT_VOLTAGE;
+        printf("\t\t\t\t\t\t[EPS] CAP VOLT: %d.%03d\r\n", capacitor_voltage0 / 1000, capacitor_voltage0 % 1000);
+    #endif
+
+    #if(imcUSE_CHECKPOINT_PASS_COUNTER)
+        if (checkpointCounter == checkpoint_pass_count) {
+            checkpointCounter = 0;
+            return 1;
+        } else {
+            checkpointCounter++;
+            return 0;
+        }
+    #endif
+
+    #if(!imcUSE_CHECKPOINT_VOLTAGE_CHECK && !imcUSE_CHECKPOINT_PASS_COUNTER)
         return 1;
-    } else {
-        checkpointCounter++;
-        return 0;
-    }
+    #endif
 }

+ 15 - 0
Core/Src/benchmarks/adc_demo/adc_demo.c

@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+#include "cmsis_os.h"
+#include "ImC/imc_api.h"
+
+extern ADC_HandleTypeDef ADC_HANDLER_SBC;
+
+void adc_demo()
+{
+    while(1) {
+        int volt = measure_voltage(ADC_HANDLER_SBC, EPS_CAP_ID_SBC);
+        printf("capacitor voltage: %d.%03d\r\n", volt/1000, volt%1000);
+        osDelay(200);
+    }
+}

+ 9 - 7
Core/Src/main.c

@@ -263,6 +263,7 @@ int main(void)
     #if (imcUSE_IMC_EXTENSION)
     taskSnapHandle = imcOsThreadNew(vBenchmarkDriver, imcBENCH_NAME, &taskSnap_attributes);
     #else
+    // taskSnapHandle = imcOsThreadNew(taskEPSRunner, NULL, &taskSnap_attributes);
     taskSnapHandle = imcOsThreadNew(vConv2d, NULL, &taskSnap_attributes);
     #endif
   #else
@@ -1316,13 +1317,14 @@ void taskEPSRunner(void *argument)
 		//capacitor_voltage1 = measure_voltage(ADC_HANDLER_CAM, EPS_CAP_ID_CAM);
 
 		//printf("\t\t\t\t\t\t[EPS] CAP VOLT: %d.%03d, %d.%03d\r\n", capacitor_voltage0/1000, capacitor_voltage0%1000, capacitor_voltage1/1000, capacitor_voltage1%1000);
-
-		if (capacitor_voltage0 < EPS_CAP_VOLT_LOW_THRESHOLD_SBC)
-		{
-			printf("[EPS] CAP#%d < %dmV (TODO JIT CHECKPOINT)\r\n", EPS_CAP_ID_SBC, EPS_CAP_VOLT_LOW_THRESHOLD_SBC);
-			// TODO: JIT CHECKPOINT
-			imc_sbc_power_off();
-		}
+		printf("\t\t\t\t\t\t[EPS] CAP VOLT: %d.%03d\r\n", capacitor_voltage0/1000, capacitor_voltage0%1000);
+
+		// if (capacitor_voltage0 < EPS_CAP_VOLT_LOW_THRESHOLD_SBC)
+		// {
+		// 	printf("[EPS] CAP#%d < %dmV (TODO JIT CHECKPOINT)\r\n", EPS_CAP_ID_SBC, EPS_CAP_VOLT_LOW_THRESHOLD_SBC);
+		// 	// TODO: JIT CHECKPOINT
+		// 	imc_sbc_power_off();
+		// }
 
 		osDelay(DELAY_AFTER_WORK);
 	}

+ 14 - 2
imc_extension.cmake

@@ -1,9 +1,11 @@
-set(IMC_BENCH_NAME "vConv2d" CACHE STRING "")
-set(AVAILABLE_BENCHES "vBasicMath" "vStringSearch" "vFFT" "vSha" "vCrc" "vTest_nvm" "vCustom" "vMemAccessPatternTest" "vMatMul" "vConv2d")
+set(IMC_BENCH_NAME "vConv2d" CACHE STRING "" FORCE)
+set(AVAILABLE_BENCHES "vBasicMath" "vStringSearch" "vFFT" "vSha" "vCrc" "vTest_nvm" "vCustom" "vMemAccessPatternTest" "vMatMul" "vConv2d" "adc_demo")
 if(NOT IMC_BENCH_NAME IN_LIST AVAILABLE_BENCHES)
     message( FATAL_ERROR "incorrect benchmark name: ${IMC_BENCH_NAME}")
 endif()
 
+add_compile_definitions(imcBENCH_NAME=${IMC_BENCH_NAME})
+
 if(IMC_BENCH_NAME MATCHES "vConv2d")
     set(BENCHMARK_SRC_FILES
     )
@@ -14,6 +16,16 @@ if(IMC_BENCH_NAME MATCHES "vConv2d")
     )
 endif()
 
+if(IMC_BENCH_NAME MATCHES "adc_demo")
+    set(BENCHMARK_SRC_FILES
+        Core/Src/benchmarks/adc_demo/adc_demo.c
+    )
+    set(IMC_APP_FILES
+    )
+    set(IMC_LINK_OBJS
+    )
+endif()
+
 foreach(BENCH_SRC ${BENCHMARK_SRC_FILES})
     list(APPEND SRC_FILES ${BENCH_SRC})
 endforeach()