RT-Thread中的链表指针定义为rt_list_t或者rt_slist_t,而不是节点类型作为指针,这就可以使链表的操作(例如:插入、删除)不用和节点类型绑定,使得一套插入删除函数可以被各种节点类型使用,甚至可以将不同类型的节点插入链表。 使用举例://定义单向链表结构体类型structrt_slist_node {structrt_slist_node *next;...
#definert_list_entry(node, type, member) rt_container_of(node, type, member) //简单整理了一下上面的宏变成下面这样方便理解;只有最外层和node的括号可以去,其他括号都有用; //#define rt_list_entry(node, struct, member) (struct *)( (char *)node - (unsigned long)( &((struct *)0)->mem...
struct rt_list_node *next; // 指向下一节点 struct rt_list_node *prev; // 指向前一节点 }; typedef struct rt_list_node rt_list_t; 所有可能派生出来的对象为: /** * The object type can be one of the follows with specific * macros enabled: * - Thread * - Semaphore * - Mutex * ...
其中rt_object_class_type枚举定义内核对象类别: 而rt_object_information则抽象了对象类型,加入了一个双向链表指针数据域rt_list_node,从而将同类别的内核对象利用该双链指针链接起来,这些同类别的内核对象具有如下可能的特点: 可能在软件运行时生成,也可能在os初始化创建。 其存储类型可能为静态类型,也可能为动态类型...
typedef struct rt_list_node rt_list_t; 1. 2. 3. 4. 5. 6. rt_list_init里面又执行什么操作呢 t_inline void rt_list_init(rt_list_t *l) { l->next = l->prev = l; } 1. 2. 3. 4. rt_system_timer_thread_init软件定时器初始化,其实就是把软件定时器放入rt_list_init中,然后给每...
voidrt_system_scheduler_init(void){register rt_base_t offset;rt_scheduler_lock_nest=0;for(offset=0;offset<RT_THREAD_PRIORITY_MAX;offset++){rt_list_init(&rt_thread_priority_table[offset]);}rt_current_priority=RT_THREAD_PRIORITY_MAX-1;rt_current_thread=RT_NULL;/* initialize ready priority ...
/**频率是1000HZ,周期是1/1000 s*所以节拍是1ms*/#define RT_TICK_PER_SECOND 1000 系统滴答定时器中断处理函数(每1ms触发一次systick定时器中断): void SysTick_Handler(void) { ... rt_tick_increase(); //++ rt_tick; 全局变量自加,记录的是系统从启动到现在的时间节拍数 ...
rt_object_information抽象了对象类型,并引入了一个双向链表指针数据域rt_list_node。这个数据域将同一类型的内核对象通过双链指针链接起来,形成逻辑上的统一管理。这些内核对象在软件运行时可能生成,或在os初始化时创建,其存储类型可能是静态的,也可能是动态的(即在内核堆上动态申请的内存区域)。尽管它们在内存...
struct rt_list_node *prev; /**< point to prev node. */ }; 一 初始化定时器列表 在rt_list_init中进行next,prev指针的初始化 两个指针均指向节点本身 二 定时器在线程中的定义 在线程结构体rt_thread中定义了rt_timer。rt_timer的定义如下: ...
voidrt_system_scheduler_init(void){register rt_base_t offset;rt_scheduler_lock_nest=0;for(offset=0;offset<RT_THREAD_PRIORITY_MAX;offset++){rt_list_init(&rt_thread_priority_table[offset]);}rt_current_priority=RT_THREAD_PRIORITY_MAX-1;rt_current_thread=RT_NULL;/* initialize ready priority ...