test.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. ///*
  2. // * Copyright (c) 2006-2021, RT-Thread Development Team
  3. // *
  4. // * SPDX-License-Identifier: Apache-2.0
  5. // *
  6. // * Change Logs:
  7. // * Date Author Notes
  8. // * 2026-03-12 RuoFeng the first version
  9. // */
  10. //#include <finsh.h>
  11. //#include <rtthread.h>
  12. //
  13. ///* 测试函数声明 */
  14. //static void test_hardfault_div0(void);
  15. //static void test_hardfault_jump0(void);
  16. //static void test_hardfault_stack_overflow(void);
  17. //static void test_hardfault_mem_access(void);
  18. //
  19. ///*=============================================================================
  20. // * 硬错误触发测试命令
  21. // *============================================================================*/
  22. //
  23. ///**
  24. // * @brief 触发除零错误
  25. // *
  26. // * 通过除零操作引发 UsageFault
  27. // */
  28. //static void test_hardfault_div0(void)
  29. //{
  30. // rt_kprintf("\n=== 触发除零错误 ===\n");
  31. // rt_kprintf("正在执行除零操作...\n");
  32. //
  33. // volatile int a = 1;
  34. // volatile int b = 0;
  35. // volatile int c;
  36. //
  37. // __asm volatile(
  38. // "MOV R0, %0\n"
  39. // "MOV R1, %1\n"
  40. // "UDIV R2, R0, R1\n" /* R0 / R1,除零操作 */
  41. // : : "r"(a), "r"(b) : "r0", "r1", "r2"
  42. // );
  43. //
  44. // c = a / b; /* 后备的C语言除零,如果汇编没触发的话 */
  45. // rt_kprintf("结果: %d\n", c);
  46. //}
  47. //MSH_CMD_EXPORT(test_hardfault_div0, Trigger divide by zero hard fault);
  48. //
  49. ///**
  50. // * @brief 跳转到零地址执行
  51. // *
  52. // * 通过跳转到0地址引发 MemManageFault 或 BusFault
  53. // */
  54. //static void test_hardfault_jump0(void)
  55. //{
  56. // rt_kprintf("\n=== 跳转到零地址 ===\n");
  57. // rt_kprintf("正在跳转到0x00000000地址...\n");
  58. //
  59. // void (*func)(void) = (void(*)(void))0;
  60. // func(); /* 执行空指针函数 */
  61. //}
  62. //MSH_CMD_EXPORT(test_hardfault_jump0, Jump to address 0 to trigger hard fault);
  63. //
  64. ///**
  65. // * @brief 触发栈溢出
  66. // *
  67. // * 通过无限递归导致栈溢出
  68. // */
  69. //static void recursive_func(int depth)
  70. //{
  71. // char buffer[256]; /* 在栈上分配内存 */
  72. // rt_kprintf("递归深度: %d, 栈地址: %p\n", depth, buffer);
  73. //
  74. // /* 无限递归 */
  75. // recursive_func(depth + 1);
  76. //}
  77. //
  78. //static void test_hardfault_stack_overflow(void)
  79. //{
  80. // rt_kprintf("\n=== 触发栈溢出 ===\n");
  81. // rt_kprintf("开始无限递归...\n");
  82. //
  83. // recursive_func(1);
  84. //}
  85. //MSH_CMD_EXPORT(recursive_func, Trigger stack overflow hard fault);
  86. //
  87. ///**
  88. // * @brief 非法内存访问
  89. // *
  90. // * 访问未映射的内存地址
  91. // */
  92. //static void test_hardfault_mem_access(void)
  93. //{
  94. // rt_kprintf("\n=== 触发非法内存访问 ===\n");
  95. //
  96. // /* 尝试写入一个通常不可访问的地址 */
  97. // volatile uint32_t *bad_addr = (uint32_t*)0xE0000000; /* Cortex-M 系统控制空间外区域 */
  98. // rt_kprintf("正在向地址 0xE0000000 写入数据...\n");
  99. //
  100. // *bad_addr = 0xDEADBEEF;
  101. //
  102. // /* 如果上面没触发,尝试另一个地址 */
  103. // bad_addr = (uint32_t*)0xFFFFFFFF;
  104. // rt_kprintf("正在向地址 0xFFFFFFFF 写入数据...\n");
  105. //
  106. // *bad_addr = 0xDEADBEEF;
  107. //}
  108. //MSH_CMD_EXPORT(test_hardfault_mem_access, Trigger invalid memory access hard fault);
  109. //
  110. ///**
  111. // * @brief 触发硬错误综合测试
  112. // *
  113. // * 依次执行所有硬错误测试,但每个测试都会导致系统复位
  114. // * 所以这个函数实际上只会执行第一个测试
  115. // */
  116. //static void test_hardfault_all(int argc, char **argv)
  117. //{
  118. // rt_kprintf("\n========================================\n");
  119. // rt_kprintf(" 硬错误综合测试 - 将依次触发多种错误\n");
  120. // rt_kprintf("========================================\n");
  121. //
  122. // if (argc > 1) {
  123. // int type = atoi(argv[1]);
  124. // switch (type) {
  125. // case 1:
  126. // test_hardfault_div0();
  127. // break;
  128. // case 2:
  129. // test_hardfault_jump0();
  130. // break;
  131. // case 3:
  132. // test_hardfault_stack_overflow();
  133. // break;
  134. // case 4:
  135. // test_hardfault_mem_access();
  136. // break;
  137. // default:
  138. // test_hardfault_div0();
  139. // break;
  140. // }
  141. // } else {
  142. // /* 默认触发除零错误 */
  143. // test_hardfault_div0();
  144. // }
  145. //}
  146. //MSH_CMD_EXPORT(test_hardfault_all, Test hard fault: test_hf [1-4] (1=div0,2=jump0,3=stack,4=mem));
  147. //
  148. //