RT-Thread启动

分析main函数

第一句是关中断;
第二句是启动RT-Thread操作系统;
第三句:返回,如果系统正常运行起来,永远不会执行到这里。

int main(void)
{
    /* disable interrupt first */
    rt_hw_interrupt_disable();

    /* startup RT-Thread RTOS */
    rtthread_startup();

    return 0;
}

分析rtthread_startup();

  • rt_hw_board_init();电路板上的硬件初始化
  • rt_show_version();显示操作系统的版本信息
  • rt_system_heap_init(); 系统堆初始化
  • rt_system_scheduler_init();系统调度器初始化
  • rt_system_timer_init(); 系统定时器初始化
  • rt_system_timer_thread_init();系统定时器线程初始化
  • rt_application_init();应用程序初始化
  • finsh_system_init(); finsh系统初始化
  • finsh_set_device(RT_CONSOLE_DEVICE_NAME); 设置finsh交互的串口设备
  • rt_thread_idle_init(); 空线程初始化
  • rt_system_scheduler_start(); 系统调度器初始化

用户主要关注的几个函数:

  • rt_hw_board_init();电路板上的硬件初始化
  • rt_application_init();应用程序初始化
/**
 * This function will startup RT-Thread RTOS.
 */
void rtthread_startup(void)
{
    /* init board */
    rt_hw_board_init();

    /* show version */
    rt_show_version();

#ifdef RT_USING_HEAP
#if STM32_EXT_SRAM
    rt_system_heap_init((void*)STM32_EXT_SRAM_BEGIN, (void*)STM32_EXT_SRAM_END);
#else
#ifdef __CC_ARM
    rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)STM32_SRAM_END);
#elif __ICCARM__
    rt_system_heap_init(__segment_end("HEAP"), (void*)STM32_SRAM_END);
#else
    /* init memory system */
    rt_system_heap_init((void*)&__bss_end, (void*)STM32_SRAM_END);
#endif
#endif  /* STM32_EXT_SRAM */
#endif /* RT_USING_HEAP */

    /* init scheduler system */
    rt_system_scheduler_init();

    /* initialize timer */
    rt_system_timer_init();

    /* init timer thread */
    rt_system_timer_thread_init();

    /* init application */
    rt_application_init();
#ifdef RT_USING_FINSH
    finsh_system_init();
    finsh_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
    /* init idle thread */
    rt_thread_idle_init();

    /* start scheduler */
    rt_system_scheduler_start();

    /* never reach here */
    return ;
}

rt_hw_board_init();电路板上的硬件初始化

  • HAL_Init();
  • SystemClock_Config();系统时钟配置
  • rt_hw_usart_init();串口初始化
  • rt_hw_pin_init(); I/O口初始化
  • rt_console_set_device(RT_CONSOLE_DEVICE_NAME);控制台设备指定
/**
 * This function will initial STM32 board.
 */
void rt_hw_board_init(void)
{
  HAL_Init();
  SystemClock_Config();
#ifdef RT_USING_SERIAL
  rt_hw_usart_init();
#endif
#ifdef RT_USING_PIN
  rt_hw_pin_init();
#endif
#ifdef RT_USING_CONSOLE
  rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

}

rt_application_init(void) 用户应用程序初始化函数

  • init_thread = rt_thread_create();动态创建线程
  • rt_thread_startup(init_thread);线程从初始态转就绪态
int rt_application_init(void)
{
    rt_thread_t init_thread;

//    rt_err_t result;

#if (RT_THREAD_PRIORITY_MAX == 32)
    init_thread = rt_thread_create("init",
                                   rt_init_thread_entry, RT_NULL,
                                   1024, 8, 20);
#else
    init_thread = rt_thread_create("init",
                                   rt_init_thread_entry, RT_NULL,
                                   1024, 80, 20);
#endif

    if (init_thread != RT_NULL)
        rt_thread_startup(init_thread);

    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 3,216评论 0 3
  • RT-Thread启动流程 1. Boot Loader LPC17xx系列芯片的Boot Loader一般命名为...
    令狐蛋蛋阅读 2,668评论 0 1
  • 1:InputChannel提供函数创建底层的Pipe对象 2: 1)客户端需要新建窗口 2)new ViewRo...
    自由人是工程师阅读 5,718评论 0 18
  • 偶尔会是深夜赶路的人。任由车灯划破黑暗,肆意自己破浪前行。瞥瞥四周,隐约看到远处的山和近处的树往身后赶,即使...
    上孟默蒹阅读 482评论 0 0
  • 日期:2018年6月11日 地点:济南 茶品:正山小种,红茶 用水:过滤自来水 茶具:自备 干茶:条索 条索,少量...
    汪汪_小固阅读 521评论 0 0

友情链接更多精彩内容