1 /* 2 * 程序清单:邮箱例程_发送阻塞 3 * 4 * 这个程序用来测试邮箱发送时候的阻塞情况。 5 * 6 */ 7 #include <rtthread.h> 8 #include "tc_comm.h" 9 10 /* 指向线程控制块的指针 */ 11 static rt_thread_t tid1 = RT_NULL; 12 static rt_thread_t tid2 = RT_NULL; 13 14 /* 邮箱控制块 */ 15 static struct rt_mailbox mb; 16 /* 用于放邮件的内存池 */ 17 static char mb_pool[32]; 18 19 static char mb_str1[] = "I'm a mail!"; 20 static char mb_str2[] = "this is another mail!"; 21 22 /* 线程1入口 */ 23 static void thread1_entry(void* parameter) 24 { 25 unsigned char* str; 26 27 while (1) 28 { 29 /* 从邮箱中收取邮件 */ 30 if (rt_mb_recv(&mb, (rt_uint32_t*)&str, RT_WAITING_FOREVER) == RT_EOK) 31 { 32 rt_kprintf("thread1: get a mail from mailbox, the content:%s\n", str); 33 34 /* 延时20个OS Tick */ 35 rt_thread_delay(50); 36 } 37 } 38 } 39 40 /* 线程2入口 */ 41 static void thread2_entry(void* parameter) 42 { 43 rt_uint8_t count; 44 char *str; 45 46 count = 0; 47 while (1) 48 { 49 count ++; 50 if (count & 0x1) 51 { 52 /* 发送mb_str1地址到邮箱中 */ 53 str = mb_str1; 54 } 55 else 56 { 57 /* 发送mb_str2地址到邮箱中 */ 58 str = mb_str2; 59 } 60 61 /* 不停的发送邮件,如果满了则等待10个tick,然后超时 */ 62 if( rt_mb_send_wait(&mb, (rt_uint32_t)str,10) == RT_EOK ) 63 rt_kprintf("thread2: sent a mail to mailbox, the content:%s\n", str); 64 else 65 rt_kprintf("thread2: timeout while waiting to send a mail.\n"); 66 } 67 } 68 69 int mbox_send_wait_init() 70 { 71 /* 初始化一个mailbox */ 72 rt_mb_init(&mb, 73 "mbt", /* 名称是mbt */ 74 &mb_pool[0], /* 邮箱用到的内存池是mb_pool */ 75 sizeof(mb_pool)/4, /* 大小是mb_pool大小除以4,因为一封邮件的大小是4字节 */ 76 RT_IPC_FLAG_FIFO); /* 采用FIFO方式进行线程等待 */ 77 78 /* 创建线程1 */ 79 tid1 = rt_thread_create("t1", 80 thread1_entry, RT_NULL, /* 线程入口是thread1_entry, 入口参数是RT_NULL */ 81 THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); 82 if (tid1 != RT_NULL) 83 rt_thread_startup(tid1); 84 else 85 tc_stat(TC_STAT_END | TC_STAT_FAILED); 86 87 /* 创建线程2 */ 88 tid2 = rt_thread_create("t2", 89 thread2_entry, RT_NULL, /* 线程入口是thread2_entry, 入口参数是RT_NULL */ 90 THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); 91 if (tid2 != RT_NULL) 92 rt_thread_startup(tid2); 93 else 94 tc_stat(TC_STAT_END | TC_STAT_FAILED); 95 96 return 0; 97 } 98 99 #ifdef RT_USING_TC 100 static void _tc_cleanup() 101 { 102 /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */ 103 rt_enter_critical(); 104 105 /* 删除线程 */ 106 if (tid1 != RT_NULL && tid1->stat != RT_THREAD_CLOSE) 107 rt_thread_delete(tid1); 108 if (tid2 != RT_NULL && tid2->stat != RT_THREAD_CLOSE) 109 rt_thread_delete(tid2); 110 111 /* 执行邮箱对象脱离 */ 112 rt_mb_detach(&mb); 113 114 /* 调度器解锁 */ 115 rt_exit_critical(); 116 117 /* 设置TestCase状态 */ 118 tc_done(TC_STAT_PASSED); 119 } 120 121 int _tc_mbox_send_wait() 122 { 123 /* 设置TestCase清理回调函数 */ 124 tc_cleanup(_tc_cleanup); 125 mbox_send_wait_init(); 126 127 /* 返回TestCase运行的最长时间 */ 128 return 300; 129 } 130 /* 输出函数命令到finsh shell中 */ 131 FINSH_FUNCTION_EXPORT(_tc_mbox_send_wait, a example of mailbox send wait); 132 #else 133 /* 用户应用入口 */ 134 int rt_application_init() 135 { 136 mbox_send_wait_init(); 137 138 return 0; 139 } 140 #endif 141 142