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;
    }
  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/8522587.html
Copyright © 2011-2022 走看看