转: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);
}
- 点赞
- 收藏
- 关注作者
评论(0)