TA的每日心情 | 衰 2016-12-7 16:21 |
---|
签到天数: 2 天 连续签到: 1 天 [LV.1]初来乍到
|
板子运行demo跑起来后继续对代码进行探索。代码基于LiteOS进行编写。那先捋一捋LiteOS使用时个什么流程。
基于NB-IOT-Park 例程进行分析。首先定位到main函数:
int main(void){ UINT32 uwRet; nvic_priority_group_set(NVIC_PRIGROUP_PRE3_SUB1); uwRet = LOS_KernelInit(); if (uwRet != LOS_OK) { return LOS_NOK; } /* Enable LiteOS system tick interrupt */ LOS_EnableTick(); /* Notice: add your code here here you can create task for your function do some hw init that need after systemtick init */ LOS_EvbSetup();//init the device on the dev baord LOS_InitTask_Entry(); /* Kernel start to run */ LOS_Start(); for (;;);} 上面的代码大概做了这么几件事: 1、GD32的中断向量组的设置
2、初始化 LiteOS
3、配置滴答定时器作为LiteOS的心跳
4、配置板载的外设UART、LED、KEY
5、创建一个初始任务,在初始任务中新建其他任务。
6、启动LiteOS
这几个流程和一般的实时操作系统都比较类似,那么接下来看看是如何创建任务的:
void LOS_InitTask_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_Init_Tsk; stTaskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE; stTaskInitParam.pcName = "InspectTsk"; stTaskInitParam.usTaskPrio = 9; uwRet = LOS_TaskCreate(&g_uwInitTaskID, &stTaskInitParam); if (uwRet != LOS_OK) { return; } return;} 上面这个函数是创建一个任务,然后在这个任务里面去创建其他任务。有几点需要注意: 1、创建任务需要什么?
LOS_TaskCreate(UINT32 *puwTaskID, TSK_INIT_PARAM_S *pstInitParam)
这个是创建任务的函数原型,入口参数为TaskID以及用于任务初始化的参数Param。
2、TASKID和INIT_PARAM需要怎么设置?
回到上面的代码,LOS_TaskCreate(&g_uwInitTaskID, &stTaskInitParam); 其中的g_uwInitTaskID是一个全局变量。重点在于stTaskInitParam的配置。配置了如下内容:
1) 任务的执行函数
2) 分配给任务的栈空间
3) 设置了任务的名称
4) 配置任务的优先级
创建任务试用LiteOS 创建任务循环打印“GD32407Z-NB-IOT”
1、创建任务
void LOS_DIY_Task_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_DIY_Test_Tsk; stTaskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE; stTaskInitParam.pcName = "diyTsk"; stTaskInitParam.usTaskPrio = 8; uwRet = LOS_TaskCreate(&g_uwDIYTaskID, &stTaskInitParam); if (uwRet != LOS_OK) { return; } return;} 2、编写执行函数:
void LOS_DIY_Test_Tsk(void){ while(1) { LOS_EvbUart1Printf("GD32407Z-NB-IOT\n\r"); LOS_TaskDelay(1000); }} 3、添加到初始任务:
void LOS_Init_Tsk(void){ gd_eval_led_init(LED1); gd_eval_led_init(LED2); gd_eval_led_off(LED1); gd_eval_led_off(LED2); // LOS_EvbKeyInit(); LOS_MPU6050Task_Entry(); LOS_TamperTask_Entry(); LOS_IrDA_Task_Entry(); //LOS_NBIOT_Task_Entry(); LOS_DIY_Task_Entry(); LOS_TaskDelete(g_uwInitTaskID);} 编译下载效果如下:
看时间戳,1S一次。
接下来的试用就开始琢磨NB-IOT了.... |
|