概述

        本文档核心描述了 JieLi 平台的系统初始化全链路App 核心任务处理逻辑,以main函数为入口,串联起初始化、任务创建、OS 启动、消息循环等关键环节,整体流程具有明确的先后顺序和模块划分。

一、整体流程框架

        整个流程以main函数为起点,按 “初始化→任务创建→OS 启动→App 消息循环” 的逻辑递进,流程如下:

        main → 各类初始化(架构 / 板级 / 定时器 / OS / 模块)→ task_create(创建 App 任务)→ os_start(启动 OS)→ app_core_init/app_main → 无限消息循环(while (1)

二、核心环节拆解

1. 入口函数:main

  main是整个流程的总入口,内部按固定顺序执行 “初始化操作”“任务创建”“OS 启动” 三大核心动作,是流程的 “总指挥”。

2. 核心初始化阶段

        此阶段是系统启动的基础,按 “架构→板级→定时器→OS→模块” 的顺序初始化底层资源,包含如下子模块:

初始化类型 涉及函数 核心作用
架构与板级初始化 setup_arch 完成架构相关基础初始化(如 CPU 架构配置)
board_early_init 早期板级初始化(板卡硬件的前置准备)
board_init 后续板级初始化(板卡硬件的完整配置)
系统定时器初始化 sys_timer_task_init 定时器任务的初始化(创建定时器相关任务)
sys_timer_init 定时器核心初始化(配置定时器计数 / 中断等)
操作系统初始化 os_init OS 内核基础初始化(如任务调度器、队列等)
多优先级模块初始化 __do_initcall(early_initcall) 最早优先级:启动最早期的模块(如底层驱动)
__do_initcall(platform_initcall) 平台优先级:初始化平台相关模块(适配硬件)
__do_initcall(module_initcall) 模块优先级:初始化普通业务 / 功能模块
__do_initcall(initcall) 通用优先级:执行通用初始化逻辑
__do_initcall(late_initcall) 最晚优先级:启动后期模块(如上层服务)

注:

__do_initcall(xxx)是按优先级从高到低执行,确保底层模块先于上层模块初始化,避免依赖错误。

3. 任务创建与 OS 启动

        初始化完成后,进入 “任务调度准备” 阶段,核心是创建 App 任务并启动 OS:

  • task_create(app_task_handler, NULL, "app_core")

    创建 App 的核心任务,参数分别为 “任务处理函数(app_task_handler)”“任务无参数(NULL)”“任务名(app_core)”,此任务是后续 App 逻辑的载体。

  • os_start

    启动操作系统内核,开始任务调度,此时app_core任务正式进入运行队列。

3. App 任务:app_task_hander

   app_task_handler任务运行后,执行 App 的业务逻辑,核心是 “初始化 + 无限消息循环”:

  1. app_core_init:App 核心业务的初始化(如业务模块配置、资源申请)。

  2. __do_initcall:多优先级模块初始化,对多模块进行初始化调用。(如__do_initcall(early_initcall)、__do_initcall(late_initcall)

  3. app_main:App 主逻辑入口,承接初始化后的业务流程。

  4. while (1):无限消息循环:

    持续等待并处理外部消息,是 App 的 “事件驱动核心”,流程如下:

  • os_task_pend("taskq", msg, ARRAY_SIZE(msg))

      阻塞等待 “taskq消息队列” 的消息,将收到的消息存入msg数组(数组大小由ARRAY_SIZE(msg)定义),返回结果res(标识消息接收状态)。

  • app_core_msg_handler(msg)

      调用消息处理函数,解析并处理msg中的具体消息(如硬件中断、上层指令等)。

4. App 任务:app_main

  app_main:App 主任务业务逻辑。

注:

1、不要在此写while (1),有别于main函数。

2、创建相关应用任务即可。

三、部分代码

1. 入口函数:main

int main()
{
    //init_for_stack_info();

    /* early_puts("WL8X SDK RUN !!!\r\n"); */

    __local_irq_disable();

    setup_arch();

#if CPU_CORE_NUM == 1
    EnableOtherCpu();
    //cpu1_run_flag = 0; //如果运行在SFC模式下,不希望写FLASH的时候会挂起CPU1,则打开这句话,但是需要保证cpu1_main调用到的所有函数全部放到内部ram或者sdram,防止写flash过程中引起死机
#endif

    os_init();

    task_create(app_task_handler, NULL, "app_core");

#if CPU_CORE_NUM == 1 //本来改 prvIdleTask
    __local_irq_enable();
#endif

    os_start();

#if CPU_CORE_NUM > 1
    __local_irq_enable();
#endif

#if defined CONFIG_UCOS_ENABLE
    while (1) {
        __asm__ volatile("idle");
    }
#endif

    return 0;
}

2. 任务函数:app_task_handler

static void app_task_handler(void *p)
{
    sys_timer_init();
    sys_timer_task_init();

#ifdef RTOS_STACK_CHECK_ENABLE
    sys_timer_add(NULL, rtos_stack_check_func, 60 * 1000);
#endif

#ifdef MEM_LEAK_CHECK_ENABLE
    malloc_debug_start();
    sys_timer_add(NULL, malloc_debug_dump, 60 * 1000);
#endif

    board_early_init();
    __do_initcall(early_initcall);
#ifdef CONFIG_SDFILE_EXT_ENABLE
    sdfile_ext_mount_init();
#endif
    __do_initcall(platform_initcall);
    board_init();

#ifdef RF_FCC_TEST_ENABLE
    u8 rf_fcc_test_init(void);
    if (rf_fcc_test_init()) {
#ifndef RF_FCC_IN_NORNAL_WORK
        while (1) {
            os_time_dly(10);
        }
#endif
    }
#endif

    __do_initcall(initcall);
    __do_initcall(module_initcall);
    app_core_init();
    __do_initcall(late_initcall);
    app_main();

#ifdef CONFIG_FINSH_ENABLE
    extern int finsh_system_init(void);
    finsh_system_init();
#endif

    int res;
    int msg[32];

    while (1) {
        res = os_task_pend("taskq", msg, ARRAY_SIZE(msg));
        if (res != OS_TASKQ) {
            continue;
        }
        app_core_msg_handler(msg);
    }
}

3. 应用函数:app_main

void app_main()
{
#ifdef CONFIG_CXX_SUPPORT
    //注意:使用时也可以不放置在这里调用,但必须在使用c++前进行调用初始化c++环境
    void cpp_run_init(void);
    cpp_run_init();
#endif

    printf("\r\n\r\n\r\n\r\n 1--------------- app_main run %s ---------------\r\n\r\n\r\n\r\n\r\n", __TIME__);

}

三、流程核心特点

1. 顺序性

  从底层初始化(架构 / 板级)到上层业务(App 消息循环),按依赖关系有序执行。

2. 模块化

  初始化、任务创建、消息处理拆分为独立模块,便于维护。

3. 事件驱动

  App 通过无限消息循环响应外部事件,符合嵌入式系统的常见设计模式。

四、参考文档

1. AC791N 官方 Git 仓库

2. AC791N 官方技术文档

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐