文章目录
前言
本文会介绍进入$$spuermain之前系统的准备工作
一、思维导图
二、submain
1.系统启动rtthread_startup();
1.系统开始初始化:
int rtthread_startup(void)
{
rt_hw_interrupt_disable();//关中断1
/* board level initalization
* NOTE: please initialize heap inside board initialization.
*/
rt_hw_board_init();//硬件初始化
/* show RT-Thread version */
rt_show_version();//打印软件信息
/* timer system initialization */
rt_system_timer_init();//系统定时器初始化
/* scheduler system initialization */
rt_system_scheduler_init();//系统调度器初始化
#ifdef RT_USING_SIGNALS
/* signal system initialization */
rt_system_signal_init();//信号信息初始化
#endif
/* create init_thread */
rt_application_init();//应用程序初始化
/* timer thread initialization */
rt_system_timer_thread_init();//线程定时器初始化
/* idle thread initialization */
rt_thread_idle_init();//空闲线程初始化
/* start scheduler */
rt_system_scheduler_start();//开启系统调度器
/* never reach here */
return 0;
}
2. 硬件初始化
void rt_hw_board_init(void)
{
HAL_Init();//HAL初始化
SystemClock_Config();//系统时钟(晶振)设置
#ifdef RT_USING_HEAP
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);//系统内存堆初始化
#endif
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();//版的RT线程组件初始化
#endif
#ifdef RT_USING_CONSOLE
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);//设置控制台初始化
#endif
}
3.打印系统信息
void rt_show_version(void)
{
rt_kprintf("\n \\ | /\n");
rt_kprintf("- RT - Thread Operating System\n");
rt_kprintf(" / | \\ %d.%d.%d build %s\n",
RT_VERSION, RT_SUBVERSION, RT_REVISION, __DATE__);
rt_kprintf(" 2006 - 2018 Copyright by rt-thread team\n");
}
RTM_EXPORT(rt_show_version);
4.硬件时钟初始化
void rt_system_timer_init(void)
{
int i;
for (i = 0; i < sizeof(rt_timer_list) / sizeof(rt_timer_list[0]); i++)
{
rt_list_init(rt_timer_list + i);//定时器双向两链表初始化
}
}
5.系统调度器初始化
void rt_system_scheduler_init(void)
{
register rt_base_t offset;
rt_scheduler_lock_nest = 0;//调度锁标志位
RT_DEBUG_LOG(RT_DEBUG_SCHEDULER, ("start scheduler: max priority 0x%02x\n",
RT_THREAD_PRIORITY_MAX));//日志打印最大优先级
for (offset = 0; offset <