博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
liteos的启动
阅读量:4214 次
发布时间:2019-05-26

本文共 2668 字,大约阅读时间需要 8 分钟。

liteos 目前支持多款平台,具体支持的平台在\LiteOS-master\targets 下,我们这里以STM32F103RB_NUCLEO为例。其入口函数在\LiteOS-master\targets\STM32F103RB_NUCLEO\GCC\los_startup_gcc.s 中的Reset_Handler入口函数Reset_Handler:#设定栈指针  ldr   sp, =_estack      /* set stack pointer *//* Copy the vector_ram segment initializers from flash to SRAM */  movs  r1, #0  b  LoopCopyVectorInit#拷贝中断向量CopyVectorInit:  ldr   r3, =_si_liteos_vector_data  ldr   r3, [r3, r1]  str   r3, [r0, r1]  adds   r1, r1, #4LoopCopyVectorInit:  ldr   r0, =_s_liteos_vector  ldr   r3, =_e_liteos_vector  adds   r2, r0, r1  cmp   r2, r3  bcc   CopyVectorInit#将data段从flash 拷贝到sram中/* Copy the data segment initializers from flash to SRAM */  movs r1, #0  b LoopCopyDataInitCopyDataInit:  ldr r3, =_sidata  ldr r3, [r3, r1]  str r3, [r0, r1]  adds r1, r1, #4LoopCopyDataInit:  ldr r0, =_sdata  ldr r3, =_edata  adds r2, r0, r1  cmp r2, r3  bcc CopyDataInit  ldr r2, =_sbss  b LoopFillZerobss#清零bss段/* Zero fill the bss segment. */FillZerobss:  movs r3, #0  str r3, [r2], #4LoopFillZerobss:  ldr r3, = _ebss  cmp r2, r3  bcc FillZerobss/* Call the clock system initialization function.*/#时钟初始化    bl  SystemInit/* Call static constructors */    bl __libc_init_array/* Call the application's entry point.*/#开始调到c语言的入口函数  bl mainLiteOS-master\LiteOS-master\targets\STM32F103RB_NUCLEO\Src\main.cint main(void){    UINT32 uwRet = LOS_OK;#初始化硬件,这个函数主要设置系统时钟和uart    HardWare_Init();#os初始化,os支持的各种特性都在这个函数中初始化    uwRet = LOS_KernelInit();    if (uwRet != LOS_OK)    {        return LOS_NOK;    }#建一个线程    LOS_Inspect_Entry();#让os开启动调度    LOS_Start();}我们重点看看UINT32 LOS_Inspect_Entry(VOID){    UINT32 uwRet;    TSK_INIT_PARAM_S stTaskInitParam;#线程结构体清零    (VOID)memset((VOID *)(&stTaskInitParam), 0, sizeof(TSK_INIT_PARAM_S));#设置线程的执行函数    stTaskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)LOS_Inspect_TskDeal;#设置线程的栈大小    stTaskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE;#设置线程的名字    stTaskInitParam.pcName = "InspectTsk";#设置线程的优先级    stTaskInitParam.usTaskPrio = 9;#开始创建线程    uwRet = LOS_TaskCreate(&g_uwDemoTaskID, &stTaskInitParam);    if (uwRet != LOS_OK)    {        return LOS_NOK;    }    return LOS_OK;}我们重点看下线程的回调函数是否是死循环static VOID LOS_Inspect_TskDeal(VOID){    UINT32 ulRet = LOS_OK;    gInspectErrCnt = 0;    /* output a message on hyperterminal using printf function */    dprintf("\r\nLos Inspect start.\r\n");    for(UINT32 index = 0;index < LOS_INSPECT_BUFF; index++)    {        ulRet = LOS_InspectByID((enInspectID)index);        if(LOS_OK != ulRet)        {            gInspectErrCnt++;        }    }    dprintf("Inspect completed,gInspectErrCnt = [%d]\r\n\r\n", gInspectErrCnt);#果然线程的执行函数是个死循环,为什么执行完不退出呢?    while(1);}

 

转载地址:http://opnmi.baihongyu.com/

你可能感兴趣的文章
CopyOnWriteArraySet源码学习
查看>>
Openfiler 配置 NFS 示例
查看>>
Oracle 11.2.0.1 RAC GRID 无法启动 : Oracle High Availability Services startup failed
查看>>
Oracle 18c 单实例安装手册 详细截图版
查看>>
Oracle Linux 6.1 + Oracle 11.2.0.1 RAC + RAW 安装文档
查看>>
Oracle 11g 新特性 -- Online Patching (Hot Patching 热补丁)说明
查看>>
Oracle 11g 新特性 -- ASM 增强 说明
查看>>
Oracle 11g 新特性 -- Database Replay (重演) 说明
查看>>
Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
查看>>
Oracle 11g 新特性 -- RMAN Data Recovery Advisor(DRA) 说明
查看>>
CSDN博客之星 投票说明
查看>>
Oracle wallet 配置 说明
查看>>
Oracle smon_scn_time 表 说明
查看>>
VBox fdisk 不显示 添加的硬盘 解决方法
查看>>
Secure CRT 自动记录日志 配置 小记
查看>>
RMAN RAC 到 单实例 duplicate 自动分配通道 触发 ORA-19505 错误
查看>>
mysql 随机分页的优化
查看>>
DB2快速创建测试库
查看>>
利用db2look查看ddl
查看>>
java中的mmap实现
查看>>