在这之前先声明一下,我是使用cubeMx工具生成工程代码(搭建工程可以查阅教程链接),根据LiteOS官网移植教程,工程代码移植成功后,接着学习LiteOS中的"任务"知识点,好了,进入正题,学习编程重在练习。
还有一个要声明的就是开发板使用的是淘宝上某家板子,开发板链接。
1、在工程目录下新建一个Ex_task.c文件
#include "stm32l4xx_hal.h"
#include "gpio.h"
#include "los_demo_debug.h"
#include "los_inspect_entry.h"
#include "los_typedef.h"
#include "los_queue.h"
#include "los_task.h"
static UINT32 g_uwTskHiID;
static UINT32 g_uwTskLoID;
#define TSK_PRIOR_HI 4
#define TSK_PRIOR_LO 5
static UINT32 Example_TaskHi_1(VOID)
{
UINT32 uwRet = LOS_OK;
dprintf("Enter TaskHi Handler.\r\n");
/*延时5个Tick,延时后该任务会挂起,执行剩余任务中高优先级的任务(g_uwTskLoID任务)*/
uwRet = LOS_TaskDelay(5);
if (uwRet != LOS_OK)
{
dprintf("Delay Task Failed.\r\n");
return LOS_NOK;
}
/*2个tick时间到了后,该任务恢复,继续执行*/
dprintf("Enter TaskHi LOS_TaskDelay Done.\r\n");
/*挂起自身任务*/
uwRet = LOS_TaskSuspend(g_uwTskHiID);
if (uwRet != LOS_OK)
{
dprintf("Suspend TaskHi Failed.\r\n");
uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_TASK,LOS_INSPECT_STU_ERROR);
if (LOS_OK != uwRet)
{
dprintf("Set Inspect Status Err\n");
}
return LOS_NOK;
}
dprintf("TaskHi LOS_TaskResume Success.\r\n");
uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_TASK,LOS_INSPECT_STU_SUCCESS);
if (LOS_OK != uwRet)
{
dprintf("Set Inspect Status Err\n");
}
/*删除任务*/
if(LOS_OK != LOS_TaskDelete(g_uwTskHiID))
{
dprintf("TaskHi delete failed .\n");
return LOS_NOK;
}
return LOS_OK;
}
/*低优先级任务入口函数*/
static UINT32 Example_TaskLo_1(VOID)
{
UINT32 uwRet;
dprintf("Enter TaskLo Handler.\r\n");
/*延时10个Tick,延时后该任务会挂起,执行剩余任务中就高优先级的任务(背景任务)*/
uwRet = LOS_TaskDelay(10);
if (uwRet != LOS_OK)
{
dprintf("Delay TaskLo Failed.\r\n");
return LOS_NOK;
}
dprintf("TaskHi LOS_TaskSuspend Success.\r\n");
/*恢复被挂起的任务g_uwTskHiID*/
uwRet = LOS_TaskResume(g_uwTskHiID);
if (uwRet != LOS_OK)
{
dprintf("Resume TaskHi Failed.\r\n");
uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_TASK,LOS_INSPECT_STU_ERROR);
if (LOS_OK != uwRet)
{
dprintf("Set Inspect Status Err\n");
}
return LOS_NOK;
}
/*删除任务*/
if(LOS_OK != LOS_TaskDelete(g_uwTskLoID))
{
dprintf("TaskLo delete failed .\n");
return LOS_NOK;
}
return LOS_OK;
}
UINT32 Example_Entry(VOID)
{
UINT32 uwRet = LOS_OK;
TSK_INIT_PARAM_S stInitParam = {0};
dprintf("LOS_TaskLock() Success!\r\n");
stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskHi_1;
stInitParam.usTaskPrio = TSK_PRIOR_HI;
stInitParam.pcName = "Task1";
stInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
uwRet = LOS_TaskCreate(&g_uwTskHiID, &stInitParam);
if (uwRet != LOS_OK) {
printf("Example_Task1 create Failed!\r\n");
return LOS_NOK;
}
dprintf("Example_TaskHi create Success!\r\n");
stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskLo_1;
stInitParam.usTaskPrio = TSK_PRIOR_LO;
stInitParam.pcName = "Task2";
stInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
uwRet = LOS_TaskCreate(&g_uwTskLoID, &stInitParam);
if (uwRet != LOS_OK) {
printf("Example_Task2 create Failed!\r\n");
return LOS_NOK;
}
dprintf("Example_TaskLo create Success!\r\n");
return uwRet;
}
2、在项目中找到main.c文件,添加以下代码
.
.
.
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
UINT32 Example_Entry(VOID);
/* USER CODE END PFP */
.
.
.
.
/* USER CODE BEGIN 2 */
if(LOS_OK != LOS_KernelInit())
{
return LOS_NOK;
}
Example_Entry();
LOS_Start();
/* USER CODE END 2 */
3、保存修改好的代码,编译并运行,结果如下所示:
在此也非常期待华为的IDE面世。链接