betway88必威体育
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于任务调度

共4条 1/1 1 跳转至

关于任务调度

菜鸟
2005-03-07 20:33:06     打赏

关于任务调度 void scan()/*循环向串口发送数据*/ { while(1) { senddata(); taskDelay(10); } }

void query()/*循环向串口发送数据*/ { while(1) { senddata(); taskDelay(10); } } void receive() { /*这是一个接收串口的数据的程序,当程序每发送一帧数据,马上就得到一帧 返回数据,发送的时候是不能接收的,实现时是通过控制相应的引脚电平实现 的,当引脚信号为高电平,则允许发送,反之,则允许接收*/ } void senddata() { /*这是一个启动串口发送中断的程序,每执行一次这个程序,则向串口发送 一帧数据(具体是通过中断实现的)*/ /*具体程序略*/ }

void main() { taskSpawn("QueryTask",60,0,4000,(FUNCPTR)query,0,0,0,0,0,0,0,0,0,0); taskSpawn("ScanTask",65,0,4000,(FUNCPTR)scan,0,0,0,0,0,0,0,0,0,0); taskSpawn("RevTask",70,0,4000,(FUNCPTR)receive,0,0,0,0,0,0,0,0,0,0); }

请问现在的情况是没使用时间片轮转调度,那么这三个任务是如何调度的, query和scan两个程序发送的时候会不会“打架”,它们发送的数据会不会 交错着的,具体是一个什么样的情况,谢谢了




关键词: 关于     任务     调度    

菜鸟
2005-03-07 21:06:00     打赏
2楼

应该会出现冲突, 因为query和scan有不同优先级

串口应该作为互斥资源保护起来, 或使用spooling方式


菜鸟
2005-03-08 20:30:00     打赏
3楼

谢谢amine版主,那么如果query和scan两个任务的优先级相同,那么结果又如 何呢? 又如果两个任务优先级还是不同,程序改正如下,情况是什么样的呢? void scan()/*循环向串口发送数据*/ { while(1) { senddata(); taskDelay(10); } }

void query()/*循环向串口发送数据*/ { while(1) { taskSuspend(scan任务的id); senddata(); taskDelay(10); taskResume(scan任务的id); } } 其他程序都不变。

spooling方式又是什么东东呢?

谢谢了!


菜鸟
2005-03-09 17:37:00     打赏
4楼

如果优先级相同而又禁止时间片, 这两任务严格顺序执行, 不会互抢占, 所以不会冲突

修改的代码还是有问题, 输出数据会混杂

spooling表示假脱机, 也就是用一个独立的任务管理串口, 其他任务要使用串口都需通过该任务


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]