Bladeren bron

Add validation and date2025/expr1 script

Youngbin Kim 1 jaar geleden
bovenliggende
commit
9ed83369e9

+ 2 - 1
.gitignore

@@ -7,4 +7,5 @@
 imc_freertos_app_m33.launch
 build/
 build.sh
-imc/exprs/validation/output
+imc/exprs/**/output
+__pycache__

+ 8 - 3
CMakeLists.txt

@@ -1,5 +1,8 @@
 cmake_minimum_required(VERSION 3.16...3.24)
 
+# include(static_kernel.cmake)
+
+if(true)
 set(CMAKE_BUILD_TYPE Debug)
 set(CMAKE_VERBOSE_MAKEFILE 0)
 set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
@@ -12,7 +15,8 @@ set(IMC_USE_CHECKPOINT_VOLTAGE_CHECK 0 CACHE BOOL "")
 set(IMC_CHECKPOINT_PASS_COUNT 100 CACHE STRING "")
 
 # 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)
+# set(CMAKE_C_COMPILER /home/ybkim/workspace/imc/llvm/llvm-17/build/bin/clang)
+set(CMAKE_C_COMPILER /home/ybkim/workspace/imc/llvm/llvm-17/build_release/bin/clang)
 set(CMAKE_SYSROOT "/opt/gcc-arm-none-eabi/arm-none-eabi")
 set(ARM_CORTEXM_MULTI_DIR "/opt/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/v8-m.main+fp/hard")
 set(ARM_CORTEXM_BUILTINS_DIR "/opt/gcc-arm-none-eabi/lib/gcc/arm-none-eabi/11.2.1/thumb/v8-m.main+fp/hard")
@@ -188,7 +192,7 @@ if(IMC_APP_FILES)
         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}")
+        # set(TARGET_TRIPPLE "--target=armv7em-none-eabi --sysroot=${CMAKE_SYSROOT}")
 
         foreach(APP_SRC ${IMC_APP_FILES})
             add_custom_command(
@@ -215,4 +219,5 @@ else()
 endif()
 
 target_compile_options(imc_freeRTOS PRIVATE "-g")
-set_target_properties(imc_freeRTOS PROPERTIES LINK_DEPENDS ${LINKER_SCRIPT})
+set_target_properties(imc_freeRTOS PROPERTIES LINK_DEPENDS ${LINKER_SCRIPT})
+endif()

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

@@ -23,7 +23,7 @@
 
 #define imcSTM32_CUBE_IDE 0
 
-#define imcMAX_NUM_TASKS 2
+#define imcMAX_NUM_TASKS 5
 #define imcSTACK_SIZE (4096)
 
 #define IMC_GLOBAL __attribute__((section(".imc_global")))

+ 1 - 1
Core/Src/benchmarks/aes/aes.c

@@ -369,7 +369,7 @@ void vAes() {
         }
 
         if(imc == IMC_REPEAT-1) {
-            printf("CBC encrypt: ");
+            printf("(OUT) CBC encrypt: ");
 
             if (0 == memcmp((char *)out, (char *)in, 64))
             {

+ 1 - 1
Core/Src/benchmarks/basicmath/basicmath.c

@@ -33,7 +33,7 @@ void vBasicMath()
     /* Now solve some random equations */
     for (a1 = 1; a1 < 3; a1++)
     {
-      imcREQUEST_CHECKPOINT();
+      // imcREQUEST_CHECKPOINT();
       for (b1 = 10; b1 > 0; b1--)
       {
         for (c1 = 5; c1 < 15; c1 += 0.5)

+ 9 - 3
Core/Src/benchmarks/conv2d/conv2d.c

@@ -13,11 +13,11 @@ static int kernel[KERNEL_SIZE][KERNEL_SIZE] = {
 
 void vConv2d()
 {
-    int IMC_REPEAT = 10;
+    int IMC_REPEAT = 100;
 
     int output[OUTPUT_SIZE * OUTPUT_SIZE];
 
-#pragma clang loop unroll(disable)
+// #pragma clang loop unroll(disable)
     for (int imc_repeat = 0; imc_repeat < IMC_REPEAT; imc_repeat++)
     {
 
@@ -25,7 +25,8 @@ void vConv2d()
 // for(int i=0; i<OUTPUT_SIZE; i++) {
 //     #pragma clang loop unroll(disable)
 //     for(int j=0; j<OUTPUT_SIZE; j++) {
-#pragma clang loop unroll(disable)
+
+// #pragma clang loop unroll(disable)
         for (int _i = 0; _i < OUTPUT_SIZE * OUTPUT_SIZE; _i++)
         {
             int i = _i / OUTPUT_SIZE;
@@ -48,6 +49,8 @@ void vConv2d()
         // }
     }
 
+    int sum = 0;
+
 #pragma clang loop unroll(disable)
     for (int _i = 0; _i < OUTPUT_SIZE * OUTPUT_SIZE; _i++)
     {
@@ -56,7 +59,10 @@ void vConv2d()
         {
             printf("\r\n");
         }
+        sum += output[_i];
     }
 
     printf("\r\n");
+
+    printf("(OUT) sum: %d\r\n", sum);
 }

+ 1 - 1
Core/Src/benchmarks/crc/crc_32.c

@@ -180,7 +180,7 @@ void vCrc()
       register DWORD oldcrc32;
       register int c;
 
-      int IMC_REPEAT = 10;
+      int IMC_REPEAT = 200;
       // IMC_REPEAT = 6000;
 
       for (int imc_repeat = 0; imc_repeat < IMC_REPEAT; imc_repeat++)

+ 1 - 1
Core/Src/benchmarks/fft/fft.c

@@ -30,7 +30,7 @@ void vFFT()
     MAXSIZE = 128;
     MAXWAVES = 4;
 
-    int IMC_REPEAT = 10;
+    int IMC_REPEAT = 30;
     // IMC_REPEAT = 100;
 
     // srand(1);

+ 6 - 1
Core/Src/benchmarks/matmul/matmul.c

@@ -8,7 +8,7 @@ int B[MAT_SIZE][MAT_SIZE] = {
     [0 ... MAT_SIZE - 1] = {[0 ... MAT_SIZE - 1] = 2}};
 
 void vMatMul() {
-    int IMC_REPEAT = 50;
+    int IMC_REPEAT = 2000;
     int C[MAT_SIZE * MAT_SIZE] = { 0 };
     for(int imc=0; imc<IMC_REPEAT; imc++) {
 
@@ -23,12 +23,17 @@ void vMatMul() {
         }
     }
 
+    int sum = 0;
+
     for (int _i = 0; _i < MAT_SIZE * MAT_SIZE; _i++)
     {
         if(_i % MAT_SIZE == 0) {
             printf("\r\n");
         }
         printf("%d ", C[_i]);
+        sum += C[_i];
     }
     printf("\r\n");
+
+    printf("(OUT) sum: %d\r\n", sum);
 }

+ 1 - 1
Core/Src/benchmarks/sha/sha.c

@@ -241,7 +241,7 @@ void sha_print(SHA_INFO *sha_info)
 
 void vSha() {
     SHA_INFO sha_info;
-    int IMC_REPEAT = 1;
+    int IMC_REPEAT = 3;
     // IMC_REPEAT = 70;
     for(int imc_repeat=0; imc_repeat < IMC_REPEAT; imc_repeat++) {
         memset(&sha_info, 0, sizeof(SHA_INFO));

+ 11 - 9
Core/Src/benchmarks/stringsearch/stringsearch_local.c

@@ -108,7 +108,7 @@ void vStringSearch()
     //   while(1) {
 	  
 	//   int IMC_REPEAT = 2500;
-	  int IMC_REPEAT = 50;
+	  int IMC_REPEAT = 5;
 	  for(int imc_repeat=0; imc_repeat < IMC_REPEAT; imc_repeat++) {
 
       for (i = 0; find_strings[i]; i++)
@@ -146,18 +146,20 @@ void vStringSearch()
 			}
 			if(!found) here = NULL;
 
-			// portDISABLE_INTERRUPTS();
-			// printf("\"%s\" is%s in \"%s\"", find_strings[i],
-			// 	   here ? "" : " not", search_strings[i]);
-			// if (here)
-            //       printf(" [\"%s\"]", here);
-            // putchar('\r'); putchar('\n');
-			// portENABLE_INTERRUPTS();
+			if(imc_repeat == IMC_REPEAT -1 && find_strings[i+1] == NULL) {
+				portDISABLE_INTERRUPTS();
+				printf("(OUT) ");
+				printf("\"%s\" is%s in \"%s\"", find_strings[i],
+					here ? "" : " not", search_strings[i]);
+				if (here)
+					printf(" [\"%s\"]", here);
+				putchar('\r'); putchar('\n');
+				portENABLE_INTERRUPTS();
+			}
 			// for(int j=0; j<1000000; j++) {__asm__(" nop");}
       }
 
 	  } // imc_repeat
-	
 
     //   }
 

File diff suppressed because it is too large
+ 28 - 11
imc/exprs/date2025/1_overhead_stable_power/draw_graph_expr_1.ipynb


+ 90 - 0
imc/exprs/date2025/1_overhead_stable_power/draw_graph_expr_1.py

@@ -0,0 +1,90 @@
+import pickle
+import os
+import pandas as pd
+import seaborn as sns
+
+import plot_utils
+
+def validate_and_cleanup_df(df):
+    rename_dict = {
+        "checkpoint_enabled": "ckpt",
+        "voltage_check_enabled": "VC",
+        "pass_counter_enabled": "PC"
+    }
+    df = df.rename(columns=rename_dict)
+
+    assert(df["is_correct"].all())
+
+    def category_mapper(row):
+        if row["ckpt"] == False:
+            return "Baseline"
+        else:
+            if row["VC"] == False:
+                assert(row["PC"] == True)
+                return "PC"
+            else:
+                assert(row["PC"] == False)
+                return "VC"
+
+    category_column_name = "config"
+    df[category_column_name] = df.apply(category_mapper, axis=1)
+
+    drop_columns = [
+        "start",
+        "end",
+        "recovery",
+        "outputs",
+        "ckpt",
+        "VC",
+        "PC",
+        "is_correct"
+    ]
+    df = df.drop(columns = drop_columns) 
+    return df
+
+
+def draw_graph():
+    benchmarks = ["vBasicMath", "vCrc", "vFFT", "vSha"]
+    benchmarks = [ "vBasicMath", "vCrc", "vFFT", "vSha", "vStringSearch", "vMatMul", "vConv2d", "vAes"]
+    output_dir = "/home/ybkim/workspace/imc/imc_freertos_app_m33/imc/exprs/date2025/1_overhead_stable_power/output"
+
+    all_dfs = []
+
+    for benchmark in benchmarks:
+        pickle_filename = f"{output_dir}/{benchmark}.pickle"
+        if not os.path.exists(pickle_filename):
+            continue
+        with open(pickle_filename, "rb") as f:
+            orig_df = pickle.load(f)
+            df = validate_and_cleanup_df(orig_df)
+            all_dfs.append(df)
+
+    orig_df = pd.concat(all_dfs)
+    df = orig_df.groupby(["bench_name", "config"]).mean()
+    df = df.reset_index()
+
+    df = df.pivot(index="bench_name", columns="config", values="time_taken")
+
+    df2 = pd.DataFrame()
+    df2["PC"] = df["PC"] / df["Baseline"]
+    df2["VC"] = df["VC"] / df["Baseline"]
+
+    df2 = df2.reset_index().melt(id_vars=["bench_name"], var_name="config", value_name="normalized")
+    df2 = df2.sort_values(by="bench_name")
+    df2 = df2[df2["config"] == "PC"]
+    # df2 = df2[df2["config"] == "VC"]
+    # df2 = df2[df2["bench_name"] == "vFFT"]
+
+    print(df2)
+
+    plot_utils.set_theme_seaborn()
+    g = sns.catplot(
+        data=df2,
+        kind="bar",
+        x="bench_name",
+        y = "normalized",
+        hue="config",
+        aspect=2.3
+    )
+
+    return g

+ 54 - 58
imc/exprs/date2025/1_overhead_stable_power/run_expr_1.py

@@ -1,9 +1,12 @@
 import tempfile
 import time
+import pickle
+import pandas as pd
 
 from imc_utils.pps_e36311a import PPS_E36311A
 from imc_utils.build_config.cortex_m33 import BuildConfigM33
 from imc_utils.build_config.test_env import TestEnv
+from imc_utils.serial_watch import SerialWatcher
 import imc_utils.serial_device
 
 # from ..common_configs import WORKSPACE_ROOT, NVM_RESET_BIN, OPENOCD_SCRIPT
@@ -16,63 +19,53 @@ def main():
     pps = PPS_E36311A()
     config = get_default_build_config()
 
-    config.bench_name = "vBasicMath"
-    config.insert_compiler_checkpoints = True
-    config.use_checkpoint_voltage_check = False
-
-    pps.set_voltage(3.3, 1)
-    pps.set_current(0.1, 1)
-
-    env = TestEnv(WORKSPACE_ROOT, NVM_RESET_BIN, OPENOCD_SCRIPT)
-
-    with tempfile.TemporaryDirectory() as build_dir:
-        binary = env.build_binary(config, build_dir)
-        env.clear_nvm_and_load_binary(binary, resume=True)
-    
-    total_iterations = 5
-    measured_times = measure_execution_time(total_iterations)
-    print(measured_times)
-
-
-def measure_execution_time(total_iterations):
-    ser = imc_utils.serial_device.get_serial()
-
-    num_finished = 0
-    start_detected = False
-    time_takens = []
-    time_total = 0
-
-    ser.read_all()
-
-    while num_finished < total_iterations:
-        if ser.readable():
-            res = ser.readline()
-            try:
-                line = res.decode()[: len(res) - 1]
-            except:
-                continue
-
-        if line.startswith("hardfault"):
-            print("\nHARD FAULT")
-
-        if not start_detected:
-            if line.startswith("Start benchmark"):
-                print("\nbenchmark start detected")
-                t_start = time.time()
-                start_detected = True
-        else:
-            if line.startswith("End benchmark"):
-                t_end = time.time()
-                t_diff = t_end - t_start
-                time_takens.append(t_diff)
-                time_total += t_diff
-                num_finished += 1
-                print(
-                    f"\nbenchmark end detected, time: {t_diff:.2f} secs, finished: {num_finished}, average: {time_total/num_finished:.2f} secs"
-                )
-                start_detected = False
-                # print(time_takens)
-    return time_takens
+    benchmarks = [ "vBasicMath", "vCrc", "vFFT", "vSha", "vStringSearch", "vMatMul", "vConv2d", "vAes"]
+    benchmarks = ["vMatMul", "vStringSearch"]
+
+    # (insert_compiler_checkpoints, voltage_check, enable_pass_counter)
+    measure_configs = [
+        (False, False, False),
+        # (True, True, False),
+        (True, False, True)
+    ]
+
+    for benchmark in benchmarks:
+        all_records = []
+        for measure_config in measure_configs:
+            insert_compiler_checkpoints = measure_config[0]
+            use_checkpoint_voltage_check = measure_config[1]
+            use_checkpoint_pass_counter = measure_config[2]
+
+            config.bench_name = benchmark
+            config.insert_compiler_checkpoints = insert_compiler_checkpoints
+            config.use_checkpoint_voltage_check = use_checkpoint_voltage_check
+            config.use_checkpoint_pass_counter = use_checkpoint_pass_counter
+            config.checkpoint_pass_count = 1000000
+
+            pps.set_voltage(3.3, 1)
+            pps.set_current(0.1, 1)
+            pps.output_on(1)
+
+            env = TestEnv(WORKSPACE_ROOT, NVM_RESET_BIN, OPENOCD_SCRIPT)
+
+            with tempfile.TemporaryDirectory() as build_dir:
+                binary = env.build_binary(config, build_dir)
+                env.clear_nvm_and_load_binary(binary, resume=True)
+
+            total_iterations = 10
+            watcher = SerialWatcher(benchmark, total_iterations)
+            records = watcher.run()
+            for record in records:
+                record.update({
+                    "checkpoint_enabled": insert_compiler_checkpoints,
+                    "voltage_check_enabled": use_checkpoint_voltage_check,
+                    "pass_counter_enabled": use_checkpoint_pass_counter
+                })
+                all_records.append(record)
+        df = pd.DataFrame(all_records)
+        print(df)
+        save_records(benchmark, df)
+    pps.output_off(1)
 
 
 def get_default_build_config():
@@ -85,7 +78,10 @@ def get_default_build_config():
     config.bench_infinite_loop = True
     return config
 
+def save_records(bench_name, df):
+    with open(f"output/{bench_name}.pickle", "wb") as f:
+        pickle.dump(df, f)
+
 
 if __name__ == "__main__":
     main()
-

+ 9 - 7
imc/exprs/validation/validation.py

@@ -7,6 +7,7 @@ from imc_utils.pps_e36311a import PPS_E36311A
 from imc_utils.build_config.cortex_m33 import BuildConfigM33
 from imc_utils.build_config.test_env import TestEnv
 import imc_utils.serial_device
+from imc_utils.serial_watch import SerialWatcher
 
 WORKSPACE_ROOT = "/home/ybkim/workspace/imc/imc_freertos_app_m33"
 NVM_RESET_BIN = f"{WORKSPACE_ROOT}/imc/utils/nvm_reset.elf"
@@ -17,16 +18,15 @@ def main():
     config = get_default_build_config()
 
     benchmarks = [
-        "vBasicMath", "vCrc", "vFFT", "vSha"
-        # "vSha"
+        "vBasicMath", "vCrc", "vFFT", "vSha", "vStringSearch", "vMatMul", "vConv2d", "vAes"
     ]
 
     for benchmark in benchmarks:
         config.bench_name = benchmark
         config.insert_compiler_checkpoints = True
-        config.use_checkpoint_pass_counter = False
-        config.use_checkpoint_voltage_check = True
-        config.checkpoint_pass_count = 100
+        config.use_checkpoint_pass_counter = True
+        config.use_checkpoint_voltage_check = False
+        config.checkpoint_pass_count = 1000
         config.bench_infinite_loop = True
 
         pps.set_voltage(3.3, 1)
@@ -37,13 +37,15 @@ def main():
 
         with tempfile.TemporaryDirectory() as build_dir:
             binary = env.build_binary(config, build_dir)
-            env.clear_nvm_and_load_binary(binary, resume=True)
+            env.clear_nvm_and_load_binary(binary, resume=False)
         
         pps.set_current(0.015, 1)
         time.sleep(1)
 
+        env.resume_board(terminate=True)
         total_iterations = 5
-        records = measure_execution_time(benchmark, total_iterations)
+        records = SerialWatcher(benchmark, total_iterations).run()
+        # records = measure_execution_time(benchmark, total_iterations)
         df = pd.DataFrame(records)
         save_records(benchmark, df)
         print(df)

+ 1 - 1
imc/utils/program_binary.sh

@@ -7,4 +7,4 @@ ninja
 cd $PROJECT_ROOT_DIR
 /home/ybkim/opt/xpack-openocd-0.11.0-4/bin/openocd -f ${OPENOCD_SCRIPT_DIR} -c "program ${NVM_RESET_DIR}" -c reset -c resume -c exit
 sleep 5
-/home/ybkim/opt/xpack-openocd-0.11.0-4/bin/openocd -f ${OPENOCD_SCRIPT_DIR} -c "program ${BIN_DIR}" -c reset -c resume -c exit
+/home/ybkim/opt/xpack-openocd-0.11.0-4/bin/openocd -f ${OPENOCD_SCRIPT_DIR} -c "program ${BIN_DIR}" -c reset -c resume -c exit

+ 1 - 1
imc/utils/set_pps.py

@@ -25,4 +25,4 @@ if command == "on":
 
 elif command == "off":
     instr.write("OUTP OFF,(@1)")
-    instr.write("OUTP OFF,(@2)")
+    #instr.write("OUTP OFF,(@2)")

+ 3 - 3
setup_build_dir.py

@@ -10,12 +10,12 @@ OPENOCD_SCRIPT = f"{WORKSPACE_ROOT}/imc_freertos_app_m33.cfg"
 BUILD_DIR = f"{WORKSPACE_ROOT}/build"
 
 config = BuildConfigM33()
-config.bench_name = "vBasicMath"
+config.bench_name = "vStringSearch"
 config.insert_compiler_checkpoints = False
 config.enable_extension = True
 config.use_checkpoint_pass_counter = False
-config.use_checkpoint_voltage_check = False
-config.bench_infinite_loop = False
+config.use_checkpoint_voltage_check = True
+config.bench_infinite_loop = True
 
 env = TestEnv(WORKSPACE_ROOT, NVM_RESET_BIN, OPENOCD_SCRIPT)
 

+ 95 - 0
static_kernel.cmake

@@ -0,0 +1,95 @@
+cmake_minimum_required(VERSION 3.16...3.24)
+
+set(CMAKE_BUILD_TYPE Debug)
+set(CMAKE_VERBOSE_MAKEFILE 0)
+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 "")
+set(IMC_ENABLE_EXTENSION 0 CACHE BOOL "")
+set(IMC_USE_CHECKPOINT_PASS_COUNTER 1 CACHE BOOL "")
+set(IMC_USE_CHECKPOINT_VOLTAGE_CHECK 0 CACHE BOOL "")
+set(IMC_CHECKPOINT_PASS_COUNT 100 CACHE STRING "")
+
+# 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)
+set(CMAKE_SYSROOT "/opt/gcc-arm-none-eabi/arm-none-eabi")
+set(ARM_CORTEXM_MULTI_DIR "/opt/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/v8-m.main+fp/hard")
+set(ARM_CORTEXM_BUILTINS_DIR "/opt/gcc-arm-none-eabi/lib/gcc/arm-none-eabi/11.2.1/thumb/v8-m.main+fp/hard")
+set(OPT_BIN /home/ybkim/workspace/imc/llvm/llvm-17/build/bin/opt)
+set(LLC_BIN /home/ybkim/workspace/imc/llvm/llvm-17/build/bin/llc)
+set(LLVM_OPT_PLUGIN /home/ybkim/workspace/imc/loop_duplication/build/lib/libImcInsertCheckpoints.so)
+
+set(SRC_FILES
+    Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
+    Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
+    Middlewares/Third_Party/FreeRTOS/Source/tasks.c
+)
+
+include_directories(
+    Core/Inc 
+    Drivers/STM32L5xx_HAL_Driver/Inc 
+    Drivers/STM32L5xx_HAL_Driver/Inc/Legacy 
+    Drivers/CMSIS/Device/ST/STM32L5xx/Include 
+    Drivers/CMSIS/Include 
+    USB_Device/App 
+    USB_Device/Target 
+    Middlewares/ST/STM32_USB_Device_Library/Core/Inc 
+    Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc 
+    Middlewares/Third_Party/FreeRTOS/Source/include 
+    Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 
+    Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure 
+)
+
+# link_directories(
+#     ${ARM_CORTEXM_BUILTINS_DIR}
+#     ${ARM_CORTEXM_MULTI_DIR}
+# )
+
+# if(IMC_ENABLE_EXTENSION)
+#     include(imc_extension.cmake)
+#     add_compile_definitions(imcUSE_IMC_EXTENSION=1)
+# else()
+#     add_compile_definitions(imcUSE_IMC_EXTENSION=0)
+# endif()
+
+# compile flags
+
+add_compile_definitions(USE_HAL_DRIVER STM32L552xx)
+set(CMAKE_SYSTEM_NAME Generic)
+
+set(CPU "-mcpu=cortex-m33")
+set(FPU "-mfpu=fpv5-sp-d16")
+set(FLOAT-ABI "-mfloat-abi=hard")
+set(MCU "${CPU} -mthumb ${FPU} ${FLOAT-ABI}")
+set(OPT "-O1")
+set(C_FLAGS_NO_ASM )
+set(C_FLAGS_EXTRA "-Wall -Wno-char-subscripts -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-format -nostdlib -fdata-sections -ffunction-sections")
+
+set(COMPILER_SPECIFIC_CFLAGS )
+if (CMAKE_C_COMPILER MATCHES "clang")
+    set(TARGET-TRIPPLE "--target=armv8m-none-eabi --sysroot=${CMAKE_SYSROOT}")
+    set(COMPILER_SPECIFIC_CFLAGS "${TARGET-TRIPPLE}")
+endif()
+
+set(COMMON_CC_FLAGS "${MCU} ${TARGET-TRIPPLE} ${OPT} ${C_FLAGS_EXTRA} ${COMPILER_SPECIFIC_CFLAGS}")
+
+set(CMAKE_C_FLAGS "${COMMON_CC_FLAGS} ${C_FLAGS_NO_ASM}")
+
+# asm options
+set(ASM_OPTIONS "-x assembler-with-cpp -Wno-null-character")
+set(CMAKE_ASM_FLAGS "${COMMON_CC_FLAGS} ${ASM_OPTIONS}")
+
+# linker options
+# set(ARM_CORTEXM_BUILTINS "-L${ARM_CORTEXM_BUILTINS_DIR}")
+# set(LD_ADDITIONAL_FILES "${ARM_CORTEXM_BUILTINS_DIR}/crti.o ${ARM_CORTEXM_BUILTINS_DIR}/crtn.o ${IMC_LINK_OBJS}")
+
+# set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/STM32L552ZETX_FLASH.ld")
+# set(CMAKE_EXE_LINKER_FLAGS "${LD_ADDITIONAL_FILES} -T ${LINKER_SCRIPT}")
+
+project(imc_freeRTOS C ASM)
+add_library(imc_freeRTOS ${SRC_FILES})
+# add_executable(imc_freeRTOS ${SRC_FILES})
+
+# target_compile_options(imc_freeRTOS PRIVATE "-g")
+# set_target_properties(imc_freeRTOS PROPERTIES LINK_DEPENDS ${LINKER_SCRIPT})

Some files were not shown because too many files changed in this diff