共2条
1/1 1 跳转至页
ucos 请教ucos任务通信问题
问
我实际开发经验比较少,有些任务通信问题想请大家指教一下。
我觉得能用二值信号量(0,1)的地方都能用全局变量标志,那么,什么情况下用信号量,什么情况下用全局变量标志哪?(如果不考虑优先极反转问题)
还有,对于邮箱和队列,当释放消息时,所传递的指针类型任务参数,比如定义了全局变量 uint8 buf[100];一个任务调用OSMboxPost(Mbox,(void *)buf),另一个串口发送任务调用OSMboxPend(Mbox,0,&err),将buf数组的内容发送到串口,那么我觉得这个(void *)buf参数没什么用,因为不管往邮箱里放什么消息,我的串口任务只要接受到消息,那么他就可以发送buf数组。我想是因为我编程经验少,所以感觉不到这个指针参数的用处,请大家帮忙指点指点我这个参数怎么用。
恳请大家指教。 答 1: 一个建议
楼主应仔细回忆一下操作系统原理中与并发控制有关的内容,你对第一个问题的理解完全是错误的。
第二个问题和你的实现有关,也许是正确的,也许是错误的。 答 2: 唉唉,努力学习操作系统,要学的东西真多啊 答 3: 对操作系统的学习还不够深入,要加油哦 答 4: 关于第二个问题用指针相对数组来实现数据传递的好处很多,比如可以不用规定大小,以及能够创建链表结构。这些就是指针用法的灵活,建议你把C中的指针内容好好看并好好琢磨一下。 答 5: 一个是存贮机制;一个是通信机制一个是存贮机制,解决的是变量放在哪里,谁能访问,是静态的;一个是通信机制,是动态的。 答 6: 二值信号量和全局变量的一点区别对于第一个问题:
1.信号量的操作支持将等待在这个信号量上的各任务id记录在此信号量的等待表中;全局变量则不支持。一旦信号量被释放,可以通过等待表找到等待这个信号量的任务,并将信号量发给它们中优先级最高的任务。
2.一个任务获得信号量后,在信号量没有被释放前,可以调度其他高优先级任务运行。而使用全局变量需要关中断,阻止调度其他任务,影响了系统实时性。
信号量和全局变量虽然都可以保证同一时刻只有一个任务占有某资源,但前者功能强于后者,更能保证实时性。 具体用哪个,要看你应用的特点。如果你访问某资源时间非常短,可以考虑用全局变量,否则要用信号量。 关中断时间要尽量短是重要原则。
对于第二个问题:
用指针传参数是很明智的
建议多看看书
答 7: 谢谢大家谢谢大家的指教,最近在看操作系统,发现里面全是有趣的思想,真是一门很有意思,很博大精深的学问啊,好好学。再次谢谢大家的解答。 答 8: re老兄:
Char txmsg;
OSMboxPost(TxMbox, (void *)&txmsg)中,txmsg就是一个消息了,OSMboxPost函数将把这个消息跟TxMbox这个Event联系起来;
Char rxmsg;
在rxmsg = (char *)OSMboxPend(TxMbox, 0, &err);rxmsg指向的就是前面txmsg的内容!
我觉得能用二值信号量(0,1)的地方都能用全局变量标志,那么,什么情况下用信号量,什么情况下用全局变量标志哪?(如果不考虑优先极反转问题)
还有,对于邮箱和队列,当释放消息时,所传递的指针类型任务参数,比如定义了全局变量 uint8 buf[100];一个任务调用OSMboxPost(Mbox,(void *)buf),另一个串口发送任务调用OSMboxPend(Mbox,0,&err),将buf数组的内容发送到串口,那么我觉得这个(void *)buf参数没什么用,因为不管往邮箱里放什么消息,我的串口任务只要接受到消息,那么他就可以发送buf数组。我想是因为我编程经验少,所以感觉不到这个指针参数的用处,请大家帮忙指点指点我这个参数怎么用。
恳请大家指教。 答 1: 一个建议
楼主应仔细回忆一下操作系统原理中与并发控制有关的内容,你对第一个问题的理解完全是错误的。
第二个问题和你的实现有关,也许是正确的,也许是错误的。 答 2: 唉唉,努力学习操作系统,要学的东西真多啊 答 3: 对操作系统的学习还不够深入,要加油哦 答 4: 关于第二个问题用指针相对数组来实现数据传递的好处很多,比如可以不用规定大小,以及能够创建链表结构。这些就是指针用法的灵活,建议你把C中的指针内容好好看并好好琢磨一下。 答 5: 一个是存贮机制;一个是通信机制一个是存贮机制,解决的是变量放在哪里,谁能访问,是静态的;一个是通信机制,是动态的。 答 6: 二值信号量和全局变量的一点区别对于第一个问题:
1.信号量的操作支持将等待在这个信号量上的各任务id记录在此信号量的等待表中;全局变量则不支持。一旦信号量被释放,可以通过等待表找到等待这个信号量的任务,并将信号量发给它们中优先级最高的任务。
2.一个任务获得信号量后,在信号量没有被释放前,可以调度其他高优先级任务运行。而使用全局变量需要关中断,阻止调度其他任务,影响了系统实时性。
信号量和全局变量虽然都可以保证同一时刻只有一个任务占有某资源,但前者功能强于后者,更能保证实时性。 具体用哪个,要看你应用的特点。如果你访问某资源时间非常短,可以考虑用全局变量,否则要用信号量。 关中断时间要尽量短是重要原则。
对于第二个问题:
用指针传参数是很明智的
建议多看看书
答 7: 谢谢大家谢谢大家的指教,最近在看操作系统,发现里面全是有趣的思想,真是一门很有意思,很博大精深的学问啊,好好学。再次谢谢大家的解答。 答 8: re老兄:
Char txmsg;
OSMboxPost(TxMbox, (void *)&txmsg)中,txmsg就是一个消息了,OSMboxPost函数将把这个消息跟TxMbox这个Event联系起来;
Char rxmsg;
在rxmsg = (char *)OSMboxPend(TxMbox, 0, &err);rxmsg指向的就是前面txmsg的内容!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |