You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

testbug.c 1.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <rtthread.h>
  2. void EnableDiv0Bug(void)
  3. {
  4. /* 100ask add */
  5. /* 使能除0错误
  6. * CCR(0xE000ED14)的bit4(DIV_0_TRP)设置为1
  7. */
  8. volatile int *CCR = (volatile int *)0xE000ED14;
  9. *CCR |= (1<<4);
  10. }
  11. volatile int g_val = 0x12345678;
  12. int CreateBug(int b, int n)
  13. {
  14. int ret;
  15. int (*f)(int, int) = 0;
  16. rt_kprintf("in CreateBug\n");
  17. ret = b / n;
  18. //f(1,2);
  19. for (int i =0; i < 10000000; i++)
  20. rt_thread_delay(10);
  21. rt_kprintf("leave CreateBug\n");
  22. return ret;
  23. }
  24. void D(int n, int m)
  25. {
  26. rt_kprintf("in D\n");
  27. CreateBug(n, m);
  28. rt_kprintf("leave D\n");
  29. }
  30. void C(int n, int m)
  31. {
  32. rt_kprintf("in C\n");
  33. D(n, m);
  34. rt_kprintf("leave C\n");
  35. }
  36. void B(int n, int m)
  37. {
  38. rt_kprintf("in B\n");
  39. C(n, m);
  40. rt_kprintf("leave B\n");
  41. }
  42. void AA(void)
  43. {
  44. volatile int a = 1;
  45. }
  46. void A(int n, int m)
  47. {
  48. rt_kprintf("in A\n");
  49. AA();
  50. B(g_val*n, m);
  51. rt_kprintf("leave A\n");
  52. }
  53. void buf_overflow(int n, char val)
  54. {
  55. volatile char buf[5];
  56. buf[0] = 0x5a;
  57. buf[n] = val;
  58. rt_kprintf("buf[0] is 0x%08x\n", buf[0]);
  59. }
  60. void test_softbreakpoint(void)
  61. {
  62. volatile int a = 0x55;
  63. rt_kprintf("\n****** a's address is ***** 0x%08x\n", (unsigned int)&a);
  64. A(100, 1);
  65. buf_overflow(16, 'A');
  66. rt_kprintf("\n****** a is ***** 0x%08x\n", a);
  67. }