本文共 3770 字,大约阅读时间需要 12 分钟。
在开发STM32LiteOS系统应用时,任务编程是核心技能之一。本文将指导读者完成一个简单的任务开发循序渐进地开展工作。
首先,在工程目录下新建一个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 5static 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 (uwRet != LOS_OK) { 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 (uwRet != LOS_OK) { 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 (uwRet != LOS_OK) { 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; }
接下来,返回到项目主文件(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 */
完成代码开发后,保存文件并进行编译和运行,确认系统按预期工作。如果遇到问题,请仔细检查任务创建、延时、任务挂起及恢复等关键操作的实现是否符合LiteOS任务管理规范。
转载地址:http://daexz.baihongyu.com/