memp_simple.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. * 程序清单:内存池例程
  3. *
  4. * 这个程序会创建2个动态线程,一个静态的内存池对象,它们会试图分别从内存池中获得
  5. * 内存块
  6. */
  7. #include <rtthread.h>
  8. #include "tc_comm.h"
  9. static rt_uint8_t *ptr[48];
  10. static rt_uint8_t mempool[4096];
  11. static struct rt_mempool mp;
  12. /* 指向线程控制块的指针 */
  13. static rt_thread_t tid1 = RT_NULL;
  14. static rt_thread_t tid2 = RT_NULL;
  15. /* 线程1入口 */
  16. static void thread1_entry(void* parameter)
  17. {
  18. int i;
  19. char *block;
  20. while(1)
  21. {
  22. for (i = 0; i < 48; i++)
  23. {
  24. rt_kprintf("allocate No.%d\n", i);
  25. ptr[i] = rt_mp_alloc(&mp, RT_WAITING_FOREVER);
  26. }
  27. block = rt_mp_alloc(&mp, RT_WAITING_FOREVER);
  28. rt_kprintf("allocate the block mem\n");
  29. rt_mp_free(block);
  30. block = RT_NULL;
  31. }
  32. }
  33. /* 线程2入口 */
  34. static void thread2_entry(void *parameter)
  35. {
  36. int i;
  37. while(1)
  38. {
  39. rt_kprintf("try to release block\n");
  40. for (i = 0 ; i < 48; i ++)
  41. {
  42. if (ptr[i] != RT_NULL)
  43. {
  44. rt_kprintf("release block %d\n", i);
  45. rt_mp_free(ptr[i]);
  46. ptr[i] = RT_NULL;
  47. }
  48. }
  49. // rt_thread_delay(100);
  50. }
  51. }
  52. int mempool_simple_init()
  53. {
  54. int i;
  55. for (i = 0; i < 48; i ++) ptr[i] = RT_NULL;
  56. rt_mp_init(&mp, "mp1", &mempool[0], sizeof(mempool), 80);
  57. /* 创建线程1 */
  58. tid1 = rt_thread_create("t1",
  59. thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */
  60. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  61. if (tid1 != RT_NULL)
  62. rt_thread_startup(tid1);
  63. else
  64. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  65. /* 创建线程2 */
  66. tid2 = rt_thread_create("t2",
  67. thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */
  68. THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  69. if (tid2 != RT_NULL)
  70. rt_thread_startup(tid2);
  71. else
  72. tc_stat(TC_STAT_END | TC_STAT_FAILED);
  73. return 0;
  74. }
  75. #ifdef RT_USING_TC
  76. static void _tc_cleanup()
  77. {
  78. /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */
  79. rt_enter_critical();
  80. /* 删除线程 */
  81. if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE)
  82. rt_thread_delete(tid1);
  83. if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE)
  84. rt_thread_delete(tid2);
  85. /* 执行内存池脱离 */
  86. rt_mp_detach(&mp);
  87. /* 调度器解锁 */
  88. rt_exit_critical();
  89. /* 设置TestCase状态 */
  90. tc_done(TC_STAT_PASSED);
  91. }
  92. int _tc_mempool_simple()
  93. {
  94. /* 设置TestCase清理回调函数 */
  95. tc_cleanup(_tc_cleanup);
  96. mempool_simple_init();
  97. /* 返回TestCase运行的最长时间 */
  98. return 100;
  99. }
  100. /* 输出函数命令到finsh shell中 */
  101. FINSH_FUNCTION_EXPORT(_tc_mempool_simple, a memory pool example);
  102. #else
  103. /* 用户应用入口 */
  104. int rt_application_init()
  105. {
  106. mempool_simple_init();
  107. return 0;
  108. }
  109. #endif