From 63cfeb8b2ea48672d7846803d98c2cea8ba7b02e Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Tue, 22 Apr 2025 13:28:49 +0200 Subject: [PATCH] Add CPU and mem test --- apps/com.example.cputest/META-INF/MANIFEST.MF | 2 + apps/com.example.cputest/assets/main.py | 83 ++++++++++++++++++ .../res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 6728 bytes .../META-INF/MANIFEST.MF | 2 + apps/com.example.memtester/assets/main.py | 83 ++++++++++++++++++ .../res/mipmap-mdpi/launcher_icon.png | Bin 0 -> 6728 bytes apps/com.example.threadtester/assets/main.py | 11 ++- main.py | 4 +- 8 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 apps/com.example.cputest/META-INF/MANIFEST.MF create mode 100644 apps/com.example.cputest/assets/main.py create mode 100644 apps/com.example.cputest/res/mipmap-mdpi/launcher_icon.png create mode 100644 apps/com.example.memtester/META-INF/MANIFEST.MF create mode 100644 apps/com.example.memtester/assets/main.py create mode 100644 apps/com.example.memtester/res/mipmap-mdpi/launcher_icon.png diff --git a/apps/com.example.cputest/META-INF/MANIFEST.MF b/apps/com.example.cputest/META-INF/MANIFEST.MF new file mode 100644 index 00000000..9e456428 --- /dev/null +++ b/apps/com.example.cputest/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Name: CPUTester diff --git a/apps/com.example.cputest/assets/main.py b/apps/com.example.cputest/assets/main.py new file mode 100644 index 00000000..ff9fe3d5 --- /dev/null +++ b/apps/com.example.cputest/assets/main.py @@ -0,0 +1,83 @@ +import time +import hashlib +import os + +# Configuration +TEST_DURATION = 5 # Duration of each test in seconds +DATA_SIZE = 1024 # 1KB of data for SHA-256 test +DATA = os.urandom(DATA_SIZE) # Generate 1KB of random data for SHA-256 + +def stress_test_busy_loop(): + print("\nStarting busy loop stress test...") + iterations = 0 + start_time = time.ticks_ms() + end_time = start_time + (TEST_DURATION * 1000) + + while time.ticks_ms() < end_time: + iterations += 1 + + duration_ms = time.ticks_diff(time.ticks_ms(), start_time) + iterations_per_second = (iterations / duration_ms) * 1000 + print(f"Busy loop test completed: {iterations_per_second:.2f} iterations/second") + return iterations_per_second + +def stress_test_busy_loop_with_yield(): + print("\nStarting busy loop with yield (sleep_ms(0)) stress test...") + iterations = 0 + start_time = time.ticks_ms() + end_time = start_time + (TEST_DURATION * 1000) + + while time.ticks_ms() < end_time: + iterations += 1 + time.sleep_ms(0) # Yield to other tasks + + duration_ms = time.ticks_diff(time.ticks_ms(), start_time) + iterations_per_second = (iterations / duration_ms) * 1000 + print(f"Busy loop with yield test completed: {iterations_per_second:.2f} iterations/second") + return iterations_per_second + +def stress_test_sha256(): + print("\nStarting SHA-256 stress test (1KB data)...") + iterations = 0 + start_time = time.ticks_ms() + end_time = start_time + (TEST_DURATION * 1000) + + while time.ticks_ms() < end_time: + hashlib.sha256(DATA).digest() # Compute SHA-256 on 1KB data + iterations += 1 + + duration_ms = time.ticks_diff(time.ticks_ms(), start_time) + iterations_per_second = (iterations / duration_ms) * 1000 + print(f"SHA-256 test completed: {iterations_per_second:.2f} iterations/second") + return iterations_per_second + +def main(): + print("Starting CPU stress tests...") + + # Run busy loop test + busy_loop_ips = stress_test_busy_loop() + + # Small delay to stabilize system + time.sleep_ms(500) + + # Run busy loop with yield test + yield_loop_ips = stress_test_busy_loop_with_yield() + + # Small delay to stabilize system + time.sleep_ms(500) + + # Run SHA-256 test + sha256_ips = stress_test_sha256() + + # Summary + print("\nTest Summary:") + print(f"Busy loop: {busy_loop_ips:.2f} iterations/second") + print(f"Busy loop with yield: {yield_loop_ips:.2f} iterations/second") + print(f"SHA-256 (1KB): {sha256_ips:.2f} iterations/second") + print("All tests completed.") + +try: + main() +except Exception as e: + print(f"Error during tests: {e}") + diff --git a/apps/com.example.cputest/res/mipmap-mdpi/launcher_icon.png b/apps/com.example.cputest/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f28f284c74819ee21d89cde77605f08f94aa9b98 GIT binary patch literal 6728 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 literal 0 HcmV?d00001 diff --git a/apps/com.example.memtester/META-INF/MANIFEST.MF b/apps/com.example.memtester/META-INF/MANIFEST.MF new file mode 100644 index 00000000..0c810526 --- /dev/null +++ b/apps/com.example.memtester/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Name: MemTest diff --git a/apps/com.example.memtester/assets/main.py b/apps/com.example.memtester/assets/main.py new file mode 100644 index 00000000..1c0f7686 --- /dev/null +++ b/apps/com.example.memtester/assets/main.py @@ -0,0 +1,83 @@ +import gc +import time + +# Configuration +ALLOCATION_TIMEOUT_MS = 100 # Timeout for a single allocation (in milliseconds) + +def test_allocation(buffer_size, n): + """Test how many buffers of a given size can be allocated with a timeout.""" + print(f"\nTesting buffer size: {buffer_size} bytes (2^{n})") + buffers = [] + count = 0 + + try: + while True: + # Measure time for allocation + start_time = time.ticks_ms() + # Allocate a new buffer + buffer = bytearray(buffer_size) + allocation_time = time.ticks_diff(time.ticks_ms(), start_time) + + # Check if allocation took too long + if allocation_time > ALLOCATION_TIMEOUT_MS: + print(f"\nStopped after allocating {count} buffers of {buffer_size} bytes: Allocation timeout ({allocation_time}ms > {ALLOCATION_TIMEOUT_MS}ms)") + break + + buffers.append(buffer) + count += 1 + # Print progress every 100 allocations to avoid flooding serial + if count % 100 == 0: + print(f"Allocated {count} buffers of {buffer_size} bytes", end="\r") + except MemoryError: + print(f"\nStopped after allocating {count} buffers of {buffer_size} bytes: MemoryError") + except Exception as e: + print(f"\nStopped after allocating {count} buffers of {buffer_size} bytes: {e}") + + # Free allocated buffers + buffers.clear() + gc.collect() + return count + +def main(): + print("Starting memory allocation test...") + + # Store results for summary + results = [] + + # Test buffer sizes of 2^n, starting from n=1 (2 bytes) + n = 1 + while True: + buffer_size = 2 ** n + # Run allocation test + max_buffers = test_allocation(buffer_size, n) + results.append((buffer_size, max_buffers)) + + # Check if we allocated 0 buffers (indicates we can't allocate this size) + if max_buffers == 0: + print(f"Cannot allocate buffers of size {buffer_size} bytes. Stopping test.") + break + + # Clean up memory before next test + gc.collect() + time.sleep_ms(100) # Brief delay to stabilize system + + n += 1 + + # Print summary report + print("\n=== Memory Allocation Test Summary ===") + print("Buffer Size (bytes) | Max Buffers Allocated") + print("-" * 40) + for buffer_size, max_buffers in results: + print(f"{buffer_size:>18} | {max_buffers:>20}") + print("=====================================") + print("Test completed.") + +if __name__ == "__main__": + try: + # Run garbage collection before starting to ensure clean state + gc.collect() + main() + except Exception as e: + print(f"Error during test: {e}") + + diff --git a/apps/com.example.memtester/res/mipmap-mdpi/launcher_icon.png b/apps/com.example.memtester/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f28f284c74819ee21d89cde77605f08f94aa9b98 GIT binary patch literal 6728 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 literal 0 HcmV?d00001 diff --git a/apps/com.example.threadtester/assets/main.py b/apps/com.example.threadtester/assets/main.py index 168a318e..1c663261 100644 --- a/apps/com.example.threadtester/assets/main.py +++ b/apps/com.example.threadtester/assets/main.py @@ -1,3 +1,11 @@ +# Maximum threads with stack size 1024: 48 +# Maximum threads with stack size 2048: 48 +# Maximum threads with stack size 4096: 48 +# Maximum threads with stack size 8192: 22 +# Maximum threads with stack size 16386: 10 +# Maximum threads with stack size 32768: 3 +# Maximum threads with stack size 65536: 1 + import _thread import time @@ -65,7 +73,7 @@ def main(): wifi_icon = lv.label(lv.screen_active()) wifi_icon.set_text("Test label") wifi_icon.align(lv.ALIGN.CENTER, 0, 0) - wifi_icon.set_style_text_color(COLOR_TEXT_WHITE, 0) + wifi_icon.set_style_text_color(lv.color_hex(0x0000FF), 0) print("done!") @@ -76,4 +84,3 @@ if __name__ == "__main__": except Exception as e: print(f"Error in main: {e}") -main() diff --git a/main.py b/main.py index 754a5a5b..2ffea7a8 100644 --- a/main.py +++ b/main.py @@ -230,8 +230,8 @@ def execute_script(script_source, is_file, lvgl_obj, return_to_launcher): script_globals = { 'lv': lv, 'subwindow': lvgl_obj, - 'run_app': run_app - #'run_launcher' : run_launcher + 'run_app': run_app, + '__name__': "__main__" } if is_file: print(f"Thread {thread_id}: reading script from file: {script_source}")