• 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;
    }
  • 相关阅读:
    设置MySQL的字符编码
    数据库面试题
    java.lang.IncompatibleClassChangeError: Implementing class
    下载SpringJar包
    使用命令wsimport构建WebService客户端
    java读取.properties配置文件的几种方法
    ELK5.X使用X-Pack配置密码
    Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
    MySQL常用命令
    XPath常用定位节点元素语句总结
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/8522587.html
Copyright © 2020-2023  润新知