注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学习笔记

正确的方法如同学习书法,开始的时候要临摹,临摹好了然后创造自己的风格。

 
 
 

日志

 
 

[C/C++笔记]C对结构体的赋值(以RTThread为例)  

2013-12-01 18:11:32|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
       之前有个同事问到RTthread的初始化问题,发现主要是在C中对结构体成员的赋值问题,记录一下。
1、首先介绍几个数据结构
1.1 链表节点,便于将某个内核对象加入到一链表中,其结构如下定义
struct rt_list_node
{
    struct rt_list_node *next; //指向下一节点
    struct rt_list_node *prev; //指向前一节点
};
typedef struct rt_list_node rt_list_t;

1.2 内核对象的取值有如下内型:
/**
 *  The object type can be one of the follows with specific
 *  macros enabled:
 *  - Thread
 *  - Semaphore
 *  - Mutex
 *  - Event
 *  - MailBox
 *  - MessageQueue
 *  - MemHeap
 *  - MemPool
 *  - Device
 *  - Timer
 *  - Module
 *  - Unknown
 *  - Static
 */
enum rt_object_class_type
{
    RT_Object_Class_Thread = 0, //线程
#ifdef RT_USING_SEMAPHORE
    RT_Object_Class_Semaphore, //信号量
#endif
#ifdef RT_USING_MUTEX
    RT_Object_Class_Mutex,   //互斥锁
#endif
#ifdef RT_USING_EVENT
    RT_Object_Class_Event,  //事件
#endif
#ifdef RT_USING_MAILBOX
    RT_Object_Class_MailBox,  //邮箱
#endif
#ifdef RT_USING_MESSAGEQUEUE
    RT_Object_Class_MessageQueue,  //消息队列
#endif
#ifdef RT_USING_MEMHEAP
    RT_Object_Class_MemHeap,      //内存堆
#endif
#ifdef RT_USING_MEMPOOL
    RT_Object_Class_MemPool,     //内存池
#endif
#ifdef RT_USING_DEVICE
    RT_Object_Class_Device,     //设备驱动
#endif
    RT_Object_Class_Timer,      //时钟
#ifdef RT_USING_MODULE
    RT_Object_Class_Module,     //模块
#endif
    RT_Object_Class_Unknown,      //未知内核对象类型
    RT_Object_Class_Static = 0x80  //rt-thread以此位标志是否为系统内核对象
};

1.3 内核对象容器
/**
 * The information of the kernel object
 */
struct rt_object_information
{
    enum rt_object_class_type type;          //内核对象类型
    rt_list_t                 object_list;   //内核对象链表
    rt_size_t                 object_size;   //内核对象所占的大小
};

1.4 宏定义
#define _OBJ_CONTAINER_LIST_INIT(c)\//内核对象容器的链表初始化,这里用一个宏来定义,链表的前一节点和后一节点在初始化时都指向本身所在地址
    {&(rt_object_container[c].object_list), &(rt_object_container[c].object_list)}

1.5 内核对象管理系统,这里用rt_object_information数组实现
struct rt_object_information rt_object_container[RT_Object_Class_Unknown] =
{
       /* initialize object container - thread */)},//线程对象信息
       {RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Class_Thread), sizeof(struct rt_thread)},
       ...
};
       上面的结构体定义等价于:
struct rt_object_information rt_object_container[RT_Object_Class_Unknown] =
{
       {
              RT_Object_Class_Thread,
              &(rt_object_container[RT_Object_Class_Thread].object_list,
              &(rt_object_container[RT_Object_Class_Thread].object_list,
              object_size = sizeof(struct rt_thread),
       },
       ...
};
       等价于:
struct rt_object_information rt_object_container[RT_Object_Class_Unknown] =
{
       [0] = {
              .type = RT_Object_Class_Thread,
              .object_list.next = &(rt_object_container[RT_Object_Class_Thread].object_list,
              .object_list.prev = &(rt_object_container[RT_Object_Class_Thread].object_list,
              .object_size = sizeof(struct rt_thread),
       },
       ...
};
       C语言对结构体数组赋值时,如果不明确指定,会按照顺序来进行,可参考上一篇博文:http://weimenlove.blog.163.com/blog/static/1777547320138852750703/
  评论这张
 
阅读(882)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017