至此,main线程创建完毕后,线程结构体和线程栈空间如下所示。 Step 10. 继续单步到rt_system_scheduler_start函数处,并单独跟踪进入到该函数内部。 期间,RT-Thread会调用rt_thread_idle_init函数,在该函数中使用静态创建方式初始化tidle0线程。可以按照上述过程记录tidle0线程的栈空间。 Step 11. 继续单步到rt_hw_c...
1.8 rt_system_scheduler_start(),启动调度机,开始对线程进行调度,其原理就是找最高优先级线程并执行,下一次调度机再切换上下文时,要么系统定时器来驱动,要么当前线程主动放弃运行,强制进行上下文切换。 void rt_system_scheduler_start(void) { register struct rt_thread *to_thread; rt_ubase_t highest_ready_p...
rt_system_timer_thread_init(); /* 空闲线程初始化 */ rt_thread_idle_init(); #ifdef RT_USING_SMP rt_hw_spin_lock(&_cpus_lock); #endif /*RT_USING_SMP*/ /* 启动调度器 */ rt_system_scheduler_start(); /* never reach here */ return 0; } 1. 2. 3. 4. 5. 6. 7. 8. 9....
7、关于rt_system_scheduler_start()函数,主要是开始使能操作系统调度器,调度器启动后,会根据系统的调度规则,从线程就绪列表里面,选择优先级最高的线程进行启动。 8、从以上分析可知,RT-Thread系统在启动的时候,至少会启动一个main主线程和一个idle空闲线程,如果系统配置有使能软件定时器,还会启动一个timer定时器线程...
7.关于rt_system_scheduler_start()函数,主要是开始使能操作系统调度器,调度器启动后,会根据系统的调度规则,从线程就绪列表里面,选择优先级最高的线程进行启动。 8.从以上分析可知,RT-Thread系统在启动的时候,至少会启动一个main主线程和一个idle空闲线程,如果系统配置有使能软件定时器,还会启动一个timer定时器线程,...
rt_system_timer_thread_init(); /* 空闲线程初始化 */ rt_thread_idle_init(); #ifdef RT_USING_SMP rt_hw_spin_lock(&_cpus_lock); #endif /*RT_USING_SMP*/ /* 启动调度器 */ rt_system_scheduler_start();
该函数在rt_system_scheduler_start函数最后被调用,也就是当系统初始化完成后,然后进行调度第一个最高优先级并已经就绪的任务。 而这次的初始化函数就不需要返回了。 03rt_hw_context_switch 该函数将当前线程的上下文压入栈中,根据当前Thumb状态调整返回时状态寄存器,并保存在栈中。线程在栈中保存的寄存器自顶向下...
至此,main线程创建完毕后,线程结构体和线程栈空间如下所示。 Step 10. 继续单步到rt_system_scheduler_start函数处,并单独跟踪进入到该函数内部。 期间,RT-Thread会调用rt_thread_idle_init函数,在该函数中使用静态创建方式初始化tidle0线程。可以按照上述过程记录tidle0线程的栈空间。
在scheduler.c中rt_system_scheduler_start函数: #if RT_THREAD_PRIORITY_MAX > 32 register rt_ubase_t number; number = __rt_ffs(rt_thread_ready_priority_group) - 1;//number为一中间参数,表示根据二级位图rt_thread_ready_priority_group查表得到一级位图32个字节中最低非0字节,取值范围为0-31 ...
调度器初始化:void rt_system_scheduler_init(void); 在系统启动时需要执行调度器的初始化,以初始化系统调度器用到的一些全局变量。 启动线程调度器:void rt_system_scheduler_start(void); 在系统完成初始化后切换到第一个线程,可以调用下面的函数接口。