完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
下面请问一个关于任务切换和邮箱的小问题,请大家抽时间看一下。
我定义了一个大小为2的邮箱,并建立了一个reader的task和三个writer的task进行邮箱试验。在执行的过程中,有一个现象不明白,就是在附件图片标注的那里,为什么会突然变成writer2发送数据啊,在这一步并没有进行Task_yield()任务切换啊,请大家在百忙中抽时间回答一下,麻烦了,谢谢! #include #include <ti/sy***ios/BIOS.h> #include #include #include #include #include #include #define NUMMSGS 3 /* number of messages */ #define TIMEOUT 10 typedef struct MsgObj { Int id; /* writer task id */ Char val; /* message value */ } MsgObj, *Msg; Void reader(Void); Void writer(int id_arg); Mailbox_Handle mbox; /* * ======== main ======== */ Void main() { Task_Params taskParams; Task_Handle myTsk0,myTski; Mailbox_Params mboxParams; UInt i; Error_Block eb; Error_init(&eb); /*create 1 reader_task with priority 1*/ Task_Params_init(&taskParams); taskParams.stackSize = 512; taskParams.priority = 2; myTsk0=Task_create((Task_FuncPtr)reader,&taskParams,&eb); if(myTsk0==NULL) System_abort("reader create failed"); Mailbox_Params_init(&mboxParams); mbox = Mailbox_create(8,2,&mboxParams,&eb); if(mbox==NULL) System_abort("Mailbox create failed"); /*Creat 3 tasks with priority 1*/ /*re-uses taskParams */ taskParams.priority=2; for(i=0;i<3;i++) { taskParams.arg0=i; myTski=Task_create((Task_FuncPtr)writer,&taskParams,&eb); if(myTski==NULL) System_abort("writer create failed"); } /*Start SYS/BIOS*/ System_flush(); BIOS_start(); } /* * ======== reader ======== */ Void reader(Void) { MsgObj msg; while(1) { /* wait for mailbox to be posted by writer() */ if (Mailbox_pend(mbox,&msg, BIOS_WAIT_FOREVER) == 0) //BIOS_WAIT_FOREVER { System_printf("timeout expired for MBX_pend()n"); System_flush(); break; } /* print value */ System_printf("read '%c' from (%d).n", msg.val, msg.id); System_flush(); } System_printf("reader done.n"); System_flush(); } /* * ======== writer ======== */ Void writer(int id_arg) { MsgObj msg; Int i; Int id = id_arg;// 0;//ArgToInt (id_arg); for (i=0; i < NUMMSGS; i++) { /* fill in value */ msg.id = id; msg.val = i % NUMMSGS + (Int)('a'); /* enqueue message */ Mailbox_post(mbox,&msg, BIOS_WAIT_FOREVER); System_printf("(%d) writing '%c' ...n", id, (Int)msg.val); System_flush(); } System_printf("writer (%d) done.n", id); System_flush(); Task_yield(); }
|
|
相关推荐
1个回答
|
|
求解答啊
|
|
|
|
只有小组成员才能发言,加入小组>>
2924个成员聚集在这个小组
加入小组549 浏览 1 评论
397 浏览 1 评论
595 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
849 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
692 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
150浏览 29评论
840浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
298浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
254浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
108浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-16 06:14 , Processed in 0.796882 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号