rtthread中的线程切换是通过rt_schedule( )线程调度来实现的; rt_schedule( )线程调度 通过 rt_thread_ready_priority_group 搭配 rt_thread_priority_table 进行调度; 1.1 rt_thread_ready_priority_group 线程就绪优先级组 线程就绪优先级组是一个32bits常数,每1bit对应一...
rt_current_thread=to_thread; RT_OBJECT_HOOK_CALL(rt_scheduler_hook,(from_thread,to_thread)); if(need_insert_from_thread) { rt_schedule_insert_thread(from_thread); } rt_schedule_remove_thread(to_thread); to_thread->stat=RT_THREAD_RUNNING|(to_thread->stat&~RT_THREAD_STAT_MASK); /* ...
插入线程到就绪列表:当一个线程被恢复或者新创建的线程需要被调度时,系统会调用rt_schedule_insert_thread(rt_thread_t thread),将该线程按优先级插入到相应的就绪队列中。 从就绪列表删除线程:当线程被挂起、延时或者删除时,会调用rt_schedule_remove_thread(rt_thread_t thread)将线程从就绪队列中移除。 线程切换...
rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];//就绪线程优先级链表数组(在rt_schedule_insert_thread函数中将线程设置为就绪状态后,将当前线程链表节点插入对应优先级线程链表中) struct rt_thread *rt_current_thread; //保存当前运行的线程(在线程跳转时设置为目标线程to_thread) rt_uint8_t ...
void rt_schedule(void); void rt_schedule_insert_thread(struct rt_thread *thread); void rt_schedule_remove_thread(struct rt_thread *thread); void rt_enter_critical(void); void rt_exit_critical(void); rt_uint16_t rt_critical_level(void); ...
rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];//就绪线程优先级链表数组(在rt_schedule_insert_thread函数中将线程设置为就绪状态后,将当前线程链表节点插入对应优先级线程链表中) 1. struct rt_thread *rt_current_thread; //保存当前运行的线程(在线程跳转时设置为目标线程to_thread) ...
总的来看,线程皆有由几类成员组成:object,栈相关信息,优先级信息,事件,定时器信息,私有数据指针。在RT-Thread中提供的线程接口函数都是围绕线程的各种状态展开的。 /* * 线程的状态定义 */ #define RT_THREAD_INIT 0x00 /**< 初始化状态 */ #define RT_THREAD_READY 0x01 /**< 就绪状态 */ ...
RT-Thread 线程具有独立的栈,当进行线程切换时,会将当前线程的上下文存在栈中,当线程要恢复运行时,再从栈中读取上下文信息(具体来说就是各个变量和数据,包括所有的寄存器变量、堆栈、内存信息等),进行恢复。1.1.1、线程栈大小设置对于资源相对较大的 MCU,可以适当设计较大的线程栈;也可以在初始时设置较大的栈,...
** 函数名称: rt_thread_init ** 函数功能: 静态初始化线程实例 ** 入口參数: thread 线程对象句柄 ** name 线程的名字 ** entry 线程的入口函数 ** parameter 附加參数 ** stack_start 栈底指针 ** stack_size 栈的大小 ** priority 线程的优先级 ...
** 入口参数: thread 线程对象句柄 ** 返回值: 无 ** 调 用: rt_schedule ***/ static void _rt_scheduler_stack_check(struct rt_thread *thread) { /** 参数检查 */ RT_ASSERT(thread != RT_NULL); if ((rt_uint32_t)thread->sp <= (rt_uint32_t)thread->stack_addr ||...