zoukankan      html  css  js  c++  java
  • RT-Thread OS的启动流程

    1、RT进入main之前,

    SystemInit函数初始化时钟。

    2、main函数位于startup.c文件中。进行两个工作

    系统开始前,rt_hw_interrupt_disable关闭所有中断。

    之后使用rtthread_startup启动RTThread

    3、函数rtthread_startup()完成的工作:

    1、调用函数rt_hw_board_init 完成板子初始化工作

    2、显示版本信息:rt_show_version

    3、初始化系统滴答:rt_system_tick_init

    4、系统内核对象初始化:rt_system_object_init

    5、定时器初始化:rt_system_timer_init

    6、系统堆栈初始化rt_system_heap_init

    7、任务调度器初始化:rt_system_scheduler_init

    8、rt_application_init //加入用户自定义的任务

    9、FINSH模块初始化 ,

    10、定时器线程初始化:rt_system_timer_thread_init

    11、空闲任务初始化rt_thread_idle_init

    12、开始任务调度,OS接管MCU:rt_system_scheduler_start

    任务调度开始之后,OS就算是启动好了。之后的东西都是在OS的管理下运行了。

    4、在RTT示例工程中添加外设驱动的方法:

      驱动头文件加入board.h

    RT-thread系统的main函数位于startup.c文件中。

    /**
     * This function will startup RT-Thread RTOS.
     */
    void rtthread_startup(void)
    {
        /* init board */
        rt_hw_board_init();//NVIC_config, SysTick_config, serial_device register, set CONSOLE for output(rt_kprintf(...)) in board.c
    
        /* show version */
        rt_show_version(); //show the version of rtthread by serial device(set to be console-device in board.c) in kservice.c 
    
        /* init tick */
        rt_system_tick_init();  //empty fucntion(since 1.1.0) in clock.c
    
        /* init kernel object */
        rt_system_object_init();//empty fucntion(since 0.3.0) in object.c
    
        /* init timer system */
        rt_system_timer_init(); //init rt_timer_list[0].next=rt_timer_list[0].prev=rt_timer_list[0](means rt_timer_list is empty) in timer.c
    
        rt_system_heap_init((void*)STM32_SRAM_BEGIN, (void*)STM32_SRAM_END);//init system heap in mem.c
    
        /* init scheduler system */
        rt_system_scheduler_init();//init the system scheduler, and init rt_thread_defunct(dead thread list) to be empty in scheduler.c
    
        /* init application */
        rt_application_init();     //init all defined thread in application.c
    
    //#ifdef RT_USING_FINSH       //replace finsh_set_device() after the function of rt_components_init() in rt_init_thread_entry() of application.c
        /* init finsh */
        //finsh_system_init();    //INIT_COMPONENT_EXPORT(finsh_system_init) in shell.c, so it needn't finsh_system_init here
        //finsh_set_device( FINSH_DEVICE_NAME );//sets the input device of finsh shell(rt_device_open(dev, RT_DEVICE_OFLAG_RDWR | 
                                                RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM) in shell.c
    //#endif
    
        /* init timer thread */
        rt_system_timer_thread_init();//init system software timer thread(opened by #define RT_USING_TIMER_SOFT in rtconfig.h) in timer.c
    
        /* init idle thread */
        rt_thread_idle_init();        //init idle thread(cleanup all dead thread), then start to be ready in idle.c
    
        /* start scheduler */
        rt_system_scheduler_start();  //startup scheduler(first swith to the highest priority thread and enable interrupt )in scheduler.c
    
        /* never reach here */
        return ;
    }
    int main(void)
    {
        /* disable interrupt first */
        //enable interrupt(CPSIE I) when the first thread switch(rt_hw_context_switch_to) in lipcpu/cortex-m4/context_rvds.S
        rt_hw_interrupt_disable();
    
        /* startup RT-Thread RTOS */
        rtthread_startup();
    
        return 0;
    }
  • 相关阅读:
    线性代数思维导图——3.向量
    微分中值定理的基础题型总结
    构造函数
    Python课程笔记(七)
    0241. Different Ways to Add Parentheses (M)
    0014. Longest Common Prefix (E)
    0013. Roman to Integer (E)
    0011. Container With Most Water (M)
    0010. Regular Expression Matching (H)
    0012. Integer to Roman (M)
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/8522587.html
Copyright © 2011-2022 走看看