一、内核标志flag

在内核对象控制块中有一个标志成员flag(rt_uint8_t flag; ),这个标志在不同有内核对象中具有不同的含义。rt-thread的内核对象有定时器、线程、信号量、互斥锁、事件、邮箱、消息队列、内存堆、设备、模块,这些内核对象都继承了内核对象的成员,其中也就包含了内核对象的flag成员,因此,内核对象成员flag在这些不同的场合是具体不同的含义的。

二、flag在定时器中的定义   

#define RT_TIMER_FLAG_DEACTIVATED       0x0             /**< timer is deactive *///定时器未激活,即初始化值
#define RT_TIMER_FLAG_ACTIVATED 0x1 /**< timer is active *///定时器激活,当定时器start后将会置为此状态
#define RT_TIMER_FLAG_ONE_SHOT 0x0 /**< one shot timer *///单次定时器.即定时器时间一到自动失效
#define RT_TIMER_FLAG_PERIODIC 0x2 /**< periodic timer *///周期定时器.即时间一到,自动时行下一次定时
#define RT_TIMER_FLAG_HARD_TIMER 0x0 /**< hard timer,the timer's callback function will be called in tick isr. *///硬时钟.硬件定时器中断模式
#define RT_TIMER_FLAG_SOFT_TIMER 0x4 /**< soft timer,the timer's callback function will be called in timer thread. *///软件时钟.软件定时器线程模式

三、flag在线程中的定义

线程虽然也继承了内核对象,但是它的数据定义并未直接包含内核对象结构体变量成员,而是直接在线程控制块中包含其成员,如下:

struct rt_thread
{
/* rt object */
char name[RT_NAME_MAX]; /**< the name of thread */
rt_uint8_t type; /**< type of object */
rt_uint8_t flags; /**< thread's flags */ #ifdef RT_USING_MODULE
void *module_id; /**< id of application module */
#endif rt_list_t list; /**< the object list */
rt_list_t tlist; /**< the thread list */
......

由以上线程控制块定义可知,从开始到list成员都是保持与内核对象一致,至于为什么会是这样,估计是RTT作者应该是很早之前就写好了线程相关的代码,所以一直沿续至今.注意,在线程控制块中是flags,多了一个s,但这并不妨碍它继承自内核对象控制块的特点,但是这个内核对象的flags对于线程,在内核中似乎并没有多大的作用,从线程的初始化接口函数中可以看出并没有使用这个flags参数,也没有从外部实参传进来,似乎RTT作者将它遗忘了,或是暂时还没有想好在线程中如何使用这个参数.

四、flag在IPC中的定义

RTT在IPC对象在信号量,互斥锁,事件,邮件,消息队列这五类这里我们统称为IPC内核对象。flag在这些IPC内核对象中只有两种定义:

#define RT_IPC_FLAG_FIFO                0x00            /**< FIFOed IPC. @ref IPC. *///按队列先进先出的方式处理.
#define RT_IPC_FLAG_PRIO 0x01 /**< PRIOed IPC. @ref IPC. *///按线程优先级的方式处理,即哪个线程的优先级高,则哪个先操作.

五、其他

flag在设备、内存池、内存堆中均没有用到。flag在模块中有用到,bit0被用作带entry point与否标志。

六、RT-thread内核总结

在rtthread-2.0.0正式版中,系统内核主要在src文件夹中:

在前面所讲的rtthread有关内核的章节中,主要对其中10个源文件所涉及的内核对象作了详细介绍:

对于其中kservice.c(有关链表初始化,往前插入,向后插入)、memheap.c(内存堆)、mempool.c(内在池)、moudule.c(moudule.h,应用模块)、slab.c(SLAB内存管理算法)5个部份没有详细介绍。

最新文章

  1. Ue4的容器(数据结构)
  2. Java子类属性继承父类属性
  3. malloc杀内存于无形
  4. 【Clr in c#】方法
  5. android 模拟器
  6. Simple Data
  7. js鼠标及对象坐标控制属性详细解析
  8. ie中弹出框中元素的定位
  9. crm使用FetchXml聚合查询
  10. 关于PHP的内置服务器的使用
  11. Django权限管理测试
  12. 我对let和const理解
  13. index() checkbox单选问题
  14. vue-cli配置
  15. 日积月累--Lock锁机制
  16. EMF32名词解释
  17. canvas学习总结四:绘制虚线
  18. Java笔记(四)常用基础类
  19. linux中文件名有英文括号的问题
  20. Android Studio 解析json文件出现中文乱码解决方法

热门文章

  1. java的编码格式
  2. spring-boot、mybatis整合
  3. PHP程序员如何理解依赖注入容器(dependency injection container)
  4. nodejs 实现套接字服务
  5. 使用CRF做命名实体识别(三)
  6. windows安装logstash-input-jdbc并使用其导入MMSQL数据
  7. 「日常训练」Caterpillar(POJ-3310)
  8. 【JSON类】使用说明
  9. lintcode: Missing String
  10. 爬虫1.6-selenium+HeadlessChrome