ThreadX OS通信机制--Apple的学习笔记

一,前言

不识庐山真面目,只缘生在此山中。光看细节代码不了解架构或者需求的话,很多东西都看不全面,而我的目的主要是了解设计思想为我所用,而不是了解c语言编程技巧。所以先中需求下手,然后再去看代码。主要是用来做闭环验证,验证我理解的需求是否正确而已,顺便看看c语言去实现这样的需求中用到的结构体及其算法的设计。

二,threadx OS通信机制

  1. 信号灯(量)
    主要用来做任务间同步或资源保护。主要包括二进制信号灯和计数信号灯。
    执行获取操作会将信号灯数量减一。 如果信号灯为 0,获取操作不会成功。 获取操作的逆操作是放置操作。 该操作会将信号灯数量加一。
  2. 互斥量
    主要用来做共享资源保护。
    互斥实质上是二进制信号灯。
  3. 事件集
    主要用来通知事件。
  4. 消息队列
    主要用来传递信息。
    消息队列中可以驻留一个或多个消息。比如FIFO或LIFO方式。
  5. 邮箱
    主要用来传递信息。
    保留单个消息的消息队列通常称为邮箱。新的消息会覆盖原有消息。
    以上说明了应用也说明了各类通信机制的区别点。

三,计数信号灯的源码分析

所有这些任务间通信机制的代码实现都是在关闭中断的情况下执行的。接着这些通信机制中的代码应该是短小的。其实光看上面的需求也确实是比较简单的代码。
比如获取信号的函数_txe_semaphore_get->_tx_semaphore_get
“执行获取操作会将信号灯数量减一。 如果信号灯为 0,获取操作不会成功。”

threadx的信号灯源码分析.png

信号灯结构体
从结构体来看主要是id,名称,计数值和挂起列表。然后就是标配的双链表。最后是扩展的调试信息。

typedef struct TX_SEMAPHORE_STRUCT

{
    /* Define the semaphore ID used for error checking.  */
    ULONG               tx_semaphore_id;
    /* Define the semaphore's name.  */
    CHAR                *tx_semaphore_name;
    /* Define the actual semaphore count.  A zero means that no semaphore
       instance is available.  */
    ULONG               tx_semaphore_count;
    /* Define the semaphore suspension list head along with a count of
       how many threads are suspended.  */
    struct TX_THREAD_STRUCT
                        *tx_semaphore_suspension_list;
    UINT                tx_semaphore_suspended_count;
    /* Define the created list next and previous pointers.  */
    struct TX_SEMAPHORE_STRUCT
                        *tx_semaphore_created_next,
                        *tx_semaphore_created_previous;
#ifdef TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO
    /* Define the number of semaphore puts.  */
    ULONG               tx_semaphore_performance_put_count;
    /* Define the number of semaphore gets.  */
    ULONG               tx_semaphore_performance_get_count;
    /* Define the number of semaphore suspensions.  */
    ULONG               tx_semaphore_performance_suspension_count;
    /* Define the number of semaphore timeouts.  */
    ULONG               tx_semaphore_performance_timeout_count;
#endif
#ifndef TX_DISABLE_NOTIFY_CALLBACKS
    /* Define the application callback routine used to notify the application when
       the a semaphore is put.  */
    VOID                (*tx_semaphore_put_notify)(struct TX_SEMAPHORE_STRUCT *semaphore_ptr);
#endif
    /* Define the port extension in the semaphore control block. This
       is typically defined to whitespace in tx_port.h.  */
    TX_SEMAPHORE_EXTENSION
} TX_SEMAPHORE;

从结构和代码的设计有2点值得我学习

  1. 宏定义开关添加调试信息。我设计代码一般不会考虑到调试信息的设计。但是加个宏开关就可以方便的添加调试信息了。
  2. 结构体定义中用宏定义TX_SEMAPHORE_EXTENSION,便于扩展,若不需要的时候则设置为空。比如可以添加user callback函数支持扩展。钩子函数一添加,就能有回调函数功能了。当然此处按注释可以看出不是callback函数。而且上面的callback函数用的是宏开关方式。

四,小结

所以c代码都是数据结构加算法,OS的通信机制就是按需求实现c代码即可。OS通信机制代码为什么没有设计的很复杂,原因就是它是在关全局中断中执行的。另外,我想到一个问题,就是通信机制能否可以将5类结构体抽象再合并为仅1个结构体,或再创造发明其它类的通信机制。我理解是可行的。只是拆分结构体后,从功能角度来说颗粒度就变小了,逻辑更简单,代码执行效率更高了,这才更符合RTOS的时时性。不过我以前看到过一个事件通知的描述好像就是好几个功能的合集,这不清楚它代码是如何优化性能的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,428评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,024评论 3 413
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,285评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,548评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,328评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,878评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,971评论 3 439
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,098评论 0 286
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,616评论 1 331
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,554评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,725评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,243评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,971评论 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,361评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,613评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,339评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,695评论 2 370

推荐阅读更多精彩内容