rt_thread学习笔记(1)---rt_thread启动流程分析
2014-12-27 09:06
861 查看
rt_thread启动流程分析
1, main()
rt_thread是从main函数开始启动的,在启动之前要先关中断,以便使系统处于可靠的复位状态;
然后启动rtthread_startup()内核,开始进行相关操作。
2,rtthread_startup()
在rtthread_startup()函数中先多个进行初始化,如rt_hw_board_init,rt_system_tick_init,rt_system_object_init,rt_system_timer_init,rt_system_scheduler_init,rt_application_init,rt_thread_idle_init,然后调度rt_system_scheduler_start。
2.1,rt_hw_borad_init()
rt_hw_borad_init做了以下几件事情:
(1),中断向量配置nvic_configuration,
(2),系统心跳也即系统滴答书配置SysTick_Config
(3),底层硬件串口初始化rt_hw_usart_init
(4),控制台设置rt_console_set_device
2.2,rt_system_tick_init()此函数 since 1.1.0, this function does not need to be invoked in the system initialization.
为什么要这样做呢?在stm32f10x.h中,给出了如下定义:
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
个人理解,当的编译开关#if (__Vendor_SysTickConfig == 0)条件为假时,SysTick_Config不会被编译,预留rt_system_tick_init()可以让用户自定义SysTic。
2.3,rt_system_object_init(),@deprecated since 0.3.0, this function does not need to be invoked in the system initialization
为什么要这样做呢在rtthread.h中已经声明了rt_system_object_init()
2.4,rt_system_timer_init(),
rt_system_timer_init()初始化了一个链表rt_timer_list,个人理解这个链表是用来相同优先级线程的时间片轮换,供scheduler调度用的
2.5,rt_system_scheduler_init(),
rt_system_stheduler_ini()做了以下几件事情‘
(1)注册了 rt_base_t,offset
(2)将调度器嵌套锁计数器rt_scheduler_lock_nest设为0
(3)所有优先级线程列表初始化
(4)初始化全局变量 rt_current_prority
(5)初始化全局变量 rt_current_thread为空
(6)初始化全局变量rt_thread_ready_priority_group 为 0
(7)初始化全局空闲线程处理的回调线程链表
2.6,rt_application_init(),
在这个函数中做了两件事情,创建和启动线程。
(1)调用rt_thread_create创建了一个初始化线程init,代码如下
tid=rt_thread_create("init",
rt_init_thread_entry, RT_NULL,
2048, RT_THREAD_PRIORITY_MAX/3, 20);
(2)调用rt_thread_startup(tid)启动这个线程
2.7,那么现在有个问题,它是如何进入到init线程进行初始化的呢?
通过rt_thread_creat()创建线程init,首先为这线程分配一个对象,如果分配成功,那么再分配栈空间,给它一个起始地址,然后通过内部调用函数_rt_thread_init创建此线程,然后返回此线程的ID号。
接下来通过rt_thread_startup()来启动init线程。首先获取当前待启动线程优先级,其次获取当前线程状态,然后做一次线程调度把就绪态切换到rt_init_thread_entry线程入口。在这个线程里进行平台初始化rt_platform_init()
2.8rt_platform_init()
在rt_platform_init()中初始化了spi总线和eth网络接口
1, main()
rt_thread是从main函数开始启动的,在启动之前要先关中断,以便使系统处于可靠的复位状态;
然后启动rtthread_startup()内核,开始进行相关操作。
2,rtthread_startup()
在rtthread_startup()函数中先多个进行初始化,如rt_hw_board_init,rt_system_tick_init,rt_system_object_init,rt_system_timer_init,rt_system_scheduler_init,rt_application_init,rt_thread_idle_init,然后调度rt_system_scheduler_start。
2.1,rt_hw_borad_init()
rt_hw_borad_init做了以下几件事情:
(1),中断向量配置nvic_configuration,
(2),系统心跳也即系统滴答书配置SysTick_Config
(3),底层硬件串口初始化rt_hw_usart_init
(4),控制台设置rt_console_set_device
2.2,rt_system_tick_init()此函数 since 1.1.0, this function does not need to be invoked in the system initialization.
为什么要这样做呢?在stm32f10x.h中,给出了如下定义:
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
个人理解,当的编译开关#if (__Vendor_SysTickConfig == 0)条件为假时,SysTick_Config不会被编译,预留rt_system_tick_init()可以让用户自定义SysTic。
2.3,rt_system_object_init(),@deprecated since 0.3.0, this function does not need to be invoked in the system initialization
为什么要这样做呢在rtthread.h中已经声明了rt_system_object_init()
2.4,rt_system_timer_init(),
rt_system_timer_init()初始化了一个链表rt_timer_list,个人理解这个链表是用来相同优先级线程的时间片轮换,供scheduler调度用的
2.5,rt_system_scheduler_init(),
rt_system_stheduler_ini()做了以下几件事情‘
(1)注册了 rt_base_t,offset
(2)将调度器嵌套锁计数器rt_scheduler_lock_nest设为0
(3)所有优先级线程列表初始化
(4)初始化全局变量 rt_current_prority
(5)初始化全局变量 rt_current_thread为空
(6)初始化全局变量rt_thread_ready_priority_group 为 0
(7)初始化全局空闲线程处理的回调线程链表
2.6,rt_application_init(),
在这个函数中做了两件事情,创建和启动线程。
(1)调用rt_thread_create创建了一个初始化线程init,代码如下
tid=rt_thread_create("init",
rt_init_thread_entry, RT_NULL,
2048, RT_THREAD_PRIORITY_MAX/3, 20);
(2)调用rt_thread_startup(tid)启动这个线程
2.7,那么现在有个问题,它是如何进入到init线程进行初始化的呢?
通过rt_thread_creat()创建线程init,首先为这线程分配一个对象,如果分配成功,那么再分配栈空间,给它一个起始地址,然后通过内部调用函数_rt_thread_init创建此线程,然后返回此线程的ID号。
接下来通过rt_thread_startup()来启动init线程。首先获取当前待启动线程优先级,其次获取当前线程状态,然后做一次线程调度把就绪态切换到rt_init_thread_entry线程入口。在这个线程里进行平台初始化rt_platform_init()
2.8rt_platform_init()
在rt_platform_init()中初始化了spi总线和eth网络接口
相关文章推荐
- 【RT-Thread学习笔记 6】RT-Thread下的串口驱动程序分析
- QNX学习笔记-Neutrino-QNX-boot启动流程分析
- 天嵌科技TQ2440的uboot启动流程分析学习笔记
- Linux 学习笔记_5_Linux引导流程解析_2_inittab文件剖析及系统启动流程分析
- 【鸟哥的linux私房菜-学习笔记】Linux 的启动流程分析
- STM32 + RT Thread OS 学习笔记[四]
- RT_thread 学习笔记2——TCP/IP协议栈(LwIP)
- MonoRail学习笔记四:MonoRail基本流程分析
- 【Linux学习笔记十二】inux系统启动流程
- Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程
- Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程
- 【嵌入式Linux学习七步曲之第四篇 Linux内核移植】PPC Linux启动流程分析
- STM32 + RT Thread OS 学习笔记[七]
- STM32 + RT Thread OS 学习笔记[二]
- Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程
- MonoRail学习笔记四:MonoRail基本流程分析
- Ubuntu启动流程学习笔记(Upstart事件机制)
- STM32 + RT Thread OS 学习笔记[五]