liteos的启动

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tiantao2012/article/details/86600668
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, #4

LoopCopyVectorInit:
  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 LoopCopyDataInit

CopyDataInit:
  ldr r3, =_sidata
  ldr r3, [r3, r1]
  str r3, [r0, r1]
  adds r1, r1, #4

LoopCopyDataInit:
  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], #4

LoopFillZerobss:
  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 main

LiteOS-master\LiteOS-master\targets\STM32F103RB_NUCLEO\Src\main.c
int 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);
}

猜你喜欢

转载自blog.csdn.net/tiantao2012/article/details/86600668