您的位置:首页 > 其它

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网络接口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: