转:liteos的启动

举报
一加一大于二 发表于 2019/07/22 16:03:55 2019/07/22
【摘要】 LiteOS其入口函数在 \LiteOS-master\targets\STM32F103RB_NUCLEO\GCC\los_startup_gcc.s 中的 Reset_Handler


转自: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);

}






【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。