海思Hi3518EV300 Sample启动流程

海思Hi3518EV300 Sample启动流程:
这里从los_config.c的main函数开始分析起,我把跑过的重要代码都列出来,建议现在开发板上跑起来,对着log看的话会清楚些。

主流程是:main()----osMain()----osAppInit()----app_init()

//以下内容都是los_config.c的流程,从main()函数开始分析
//下面都是函数调用,不需要全部看懂,前面的函数知道意思就好了,重点是app_init
OsMemSystemInit((AARCHPTR)&__bss_end + OS_EXC_INTERACTMEM_SIZE);
OsHwiInit();
OsTickInit(g_sysClock, LOSCFG_BASE_CORE_TICK_PER_SECOND);           g_sysClock = OS_SYS_CLOCK;  //50000000
                                                                    g_tickPerSecond =  LOSCFG_BASE_CORE_TICK_PER_SECOND;  //100  
uart_init();
OsTaskInit();                                                       g_taskCBArray           LOSCFG_BASE_CORE_TSK_LIMIT = 64     //创建64个任务
OsPriqueueInit();                                                   g_priorityQueueList     OS_PRIORITY_QUEUE_PRIORITYNUM = 32  //创建32个队列
OsSortLinkInit(&g_taskSortLink);                                    g_taskSortLink          sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;      //创建8个taskSortLink

OsTaskMonInit();                                                    g_taskSwitchHook = OsTaskStackCheck;

osCpupInit();
OsSemInit();                        //g_allSem                      //LOSCFG_BASE_IPC_SEM_LIMIT = 1024个sem
OsMuxInit();                        //g_allMux                      //LOSCFG_BASE_IPC_MUX_LIMIT
OsQueueInit();                      //g_allQueue                    //LOSCFG_BASE_IPC_QUEUE_LIMIT 
OsSwtmrInit();                      //g_swtmrCBArray                //LOSCFG_BASE_CORE_SWTMR_LIMIT
OsTimesliceInit();
OsIdleTaskCreate();                 OsIdleTask

//初始化总线和平台总线,用作device和driver
bus_init();
platform_bus_init();
do_initCalls(LEVEL_ARCH);

osAppInit();    
//接下来进入App应用部分

los_vfs_init();         //所有的文件系统都必须选择VFS作为基础
                        //比如:Block Device,FAT,RAMFS,ROMFS,YAFFS2,NFS,PROC,JFFS2
hrtimers_init();  
    hrtimer_clock_initialize();
    LOS_HwiCreate(NUM_HAL_INTERRUPT_HRTIMER, 0, 0, hrtimer_list_scan, 0);   
         hrtimer_list_scan  
    hal_interrupt_unmask(NUM_HAL_INTERRUPT_HRTIMER);

g_pstSystemWq = create_workqueue("system_wq");

stappTask.pfnTaskEntry = (TSK_ENTRY_FUNC)app_init;      //后面开始跑app_init
LOS_TaskCreate(&ipctaskid, &stappTask);

LOS_TicklessEnable();

osStart();          //此处osStart开启任务,之前创建的任务,比如app_init就开始跑了

app_init:          //挂载驱动
    //接下来开始跑 app_init,这里很重要,驱动程序都是在这里注册的,相当于Linux平台的module_init和register_driver
    //之后我们自己编写的驱动,也是在这里加载,相当于Linux下的insmod
    ran_dev_register();             register_driver("/dev/urandom", &ran_dev_ops, 0666, 0);
    SD_MMC_Host_init();             platform_driver_register(&hi_mci_driver);
                                    platform_driver_register(&sd_mci_driver[i]);
    mem_dev_register();             register_driver("/dev/mem", &mem_dev_ops, 0666, 0);
    proc_fs_init();                 mount((const char *)NULL, PROCFS_MOUNT_POINT, "procfs", 0, NULL);
                                    create_proc_entry("mounts", 0, (struct proc_dir_entry *)NULL);
    spi_dev_init();                 platform_driver_register(&hispi_driver);
    i2c_dev_init();                 platform_driver_register(&i2c_hibvt_driver);
    gpio_dev_init();                platform_device_register(&device_gpio0);
                                    platform_driver_register(&pl061_driver);
    spinor_init(); 
        hifmc100_init();            platform_driver_register(&hifmc100_driver);
        add_mtd_partition("spinor", 0x600000, 10*0x100000, 0);
        mount("/dev/spinorblk0", "/jffs0", "jffs", 0, NULL);
    net_init();

/*到这里为止,基本的初始化就已经跑完了*/                               
/*LiteOS的编译完之后的simple.bin在/osdrv/pub/liteos目录*/
/*程序到这里的时候,建议不要先接着往下看,建议把上面的register_driver和platform_driver_register先去弄懂*/

/*最后,我们肯定是要跑应用程序的,这个时候就可以去编译/ndk啦,这个也是测试程序,可以作为开发入门学习*/
ndk和原始LiteOS区别,就是加载了应用程序,应用程序代码在/ndk/sample里面
ndk在app_init()后面再加上以下代码:
SDK_init();
sample_command();
CatLogShell();

你可能感兴趣的:(海思)