本文共 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/