FreeRTOS关于信号量和全局变量问题


        刚接触RTOS的时候,不管是ucos还是freertos,都有一个疑问,就是信号量和全局变量比有什么优势。很多资料上讲解是资源的合理分配,后来对源代码进行了分析,也知道了消息队列和信号量的整个使用过程。但是还是没有真正领会其中的意义。最近在做一个电机运动的项目,在电机运动的时候需要用超声波模块进行到位判定,超声波模块发送数据的频率是10hz。具体实现的方法是电机运动的时候,打开串口,开始接收超声波数据。不运动的时候,关闭串口。调试的时候发现一个问题,电机强制停止时的位置靠超声波挡位的距离不一致。调试判断是没有第一时间停止,因为是伺服电机,不存在惯性,所以就推断是没有在接收到串口信息之后第一时间判定。简单来说就是在电机刚进入挡位极限距离时,串口处于关闭状态(线程保护),处理完数据再次打开串口的时候,电机已经又运动了100ms的时间,如果电机速度够快,那么就会撞上挡位。

        这时候就想起了信号量,看它是怎么实现这个过程的。串口中断接收完成,释放信号量。任务中设置阻塞时间等待信号量,阻塞时间的时候CPU处理其它任务,一旦串口信号量释放成功,那么任务会在第一时间获取信号量,前提是任务的优先级足够高。解决了这个问题。此时,应该算是真正理解了信号量(其实队列也一样),它做到了全局变量做不到的事情。这是中断和任务之间的通信,如果换做任务和任务之间,应该也是差不多的。

        当然,我相信,如果加入足够的代码,也可以用全局变量实现信号量的功能,但是如果这样,那岂不是白白浪费了前辈们的心血。前人在大量实践经验基础上创造的实现机制,如果暴殄天物,那就实在是罪过罪过。唉!到现在才理解,确实感觉好丢人。面壁思过中。。。

总结:1.要多思考,要不是一直思考这个问题,那么用操作系统的时候一律信号量和消息队列,那我也不会理解。

           2.多实践,没有大量的实践,就无法理解(理解和知道我觉得不是一个意思)一个知识点,当然天赋异禀的除外。

           3.勇于尝试,虽然尝试会浪费很多时间,也会带来风险,但是不尝试,一直呆在舒适区,那就永远无法进步。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM