系统版本:LiteOS Kernel Version : 5.1.0
硬件:STM32F103VE开发板
开发IDE:HUAWEI-LiteOS-Studio
我们使用RTOS(实时操作系统),注意的原因,不是为了炫耀代码编程能力,而是为了解决多任务问题,为了简化目标的实现方法。
把一个复杂的产品需求,拆解成一个个小的任务,RTOS可以通过创建多个任务实现
当然,任务之间,会有【通信】与【同步】,并不是完全独立的。
RTOS的主要特点:多任务的实现
【需求】: 创建自己的一个任务【task】
默认LiteOS 系统会创建几个任务,空闲idle,shell cmd 任务,等等,可以通过shell:task命令,查看
使用LiteOS来创建任务,需要指定【任务名称】【任务优先级】【任务栈大小】【任务处理函数】,需要有一个全局的【任务操作句柄】,任务创建了,可以通过【任务句柄】对任务进行挂起与删除等操作。
这里使用shell 命令,创建一个任务:demoTask。
#define DEMO_TASK_PRIORITY 10 /* 优先级 */ #define DEMO_TASK_STACK_SIZE 2048 /* 任务栈大小 */ static UINT32 g_demo_tskHandle; /* 任务的操作句柄 */ STATIC UINT32 DemoTask(VOID) { UINT32 ret = LOS_OK; uint32_t cnt = 0; PRINTK("\n%s:task enter!\n", __func__); while (1) { PRINTK("%s:cnt=%d\n", __func__, cnt); LOS_TaskDelay(3000); cnt++; } return ret; } INT32 DemoTaskCreate(INT32 argc, const CHAR **argv) { uint32_t ret = LOS_OK; TSK_INIT_PARAM_S task_init_param; if (argc == 0) { memset(&task_init_param, 0, sizeof(TSK_INIT_PARAM_S)); task_init_param.usTaskPrio = DEMO_TASK_PRIORITY; task_init_param.pcName = "DemoTask"; task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)DemoTask; task_init_param.uwStackSize = DEMO_TASK_STACK_SIZE; ret = LOS_TaskCreate(&g_demo_tskHandle, &task_init_param); if (ret != LOS_OK) { PRINTK("%s:error! ret=%d\n", __func__, ret); return ret; } PRINTK("%s:OK! ret=%d\n", __func__, ret); return 0; } PRINTK("DemoTaskCreate: invalid option %s\n" "DemoTaskCreate has NO ARGS.\n", argv[0]); return -1; }
增加一个shell cmd:
void UserShellCmdInit(void) { osCmdReg(CMD_TYPE_EX, "reboot", 0,(CMD_CBK_FUNC)sys_reboot); osCmdReg(CMD_TYPE_EX, "demoTaskCreate", 0, (CMD_CBK_FUNC)DemoTaskCreate); }
初始化时,需要初始化并注册Shell,我放在 【targets\STM32F103_FIRE_Arbitrary\Src\user_task.c】 app_init中
VOID app_init(VOID) { printf("Hello, welcome to liteos!\n"); LedTaskCreate(); #ifdef LOSCFG_SHELL (VOID)ShellQueueCreat(); if (OsShellInit(0) != LOS_OK) { PRINT_ERR("Shell init failed.\n"); } #endif UserShellCmdInit(); DemoEntry(); }
因为放在了shell中,默认不会自动创建任务,可以通过Shell 命令:task free,查看任务与内存信息
********Hello Huawei LiteOS******** LiteOS Kernel Version : 5.1.0 build data : Jun 13 2021 11:59:52 ********************************** OsAppInit cpu 0 entering scheduler Hello, welcome to liteos! Huawei LiteOS # Hello, welcome to liteos demo! Huawei LiteOS # task Name TaskEntryAddr TID Priority Status StackSize WaterLine StackPoint TopOfStack SemID EventMask MEMUSE ---- ------------- --- -------- -------- --------- ---------- ---------- ---------- ---------- --------- ------ Swt_Task 0x0800181d 0x0 0 Pend 0x320 0xd8 0x20003d0c 0x20003ac0 0xffffffff 0x0 0 IdleCore000 0x08002ff1 0x1 31 Ready 0x190 0x158 0x20003f74 0x20003e40 0xffffffff 0x0 0 LedTask 0x08007e59 0x3 5 Delay 0x320 0x78 0x200045bc 0x20004310 0xffffffff 0x0 0 SerialShellTask 0x080078f1 0x4 9 Pend 0x1000 0x478 0x200059c4 0x20004a90 0xffffffff 0xfff 0 SerialEntryTask 0x080074f1 0x5 9 Pend 0x600 0xe0 0x20005fc4 0x20005aa0 0xffffffff 0x0 0 SerialShellTask 0x080078f1 0x6 9 Running 0x1000 0x530 0x2000741c 0x200064e8 0xffffffff 0xfff 1492 SerialEntryTask 0x080074f1 0x7 9 Pend 0x600 0x490 0x20007a1c 0x200074f8 0xffffffff 0x0 32 Huawei LiteOS # free total used free Mem: 53420 19804 33616 text data rodata bss Mem: 55756 348 12452 4980 Huawei LiteOS # demoTaskCreate DemoTaskCreate:OK! ret=0 Huawei LiteOS # DemoTask:task enter! DemoTask:cnt=0 DemoTask:cnt=1 task Name TaskEntryAddr TID Priority Status StackSize WaterLine StackPoint TopOfStack SemID EventMask MEMUSE ---- ------------- --- -------- -------- --------- ---------- ---------- ---------- ---------- --------- ------ Swt_Task 0x0800181d 0x0 0 Pend 0x320 0xd8 0x20003d0c 0x20003ac0 0xffffffff 0x0 0 IdleCore000 0x08002ff1 0x1 31 Ready 0x190 0x158 0x20003f74 0x20003e40 0xffffffff 0x0 0 DemoTask 0x08007e25 0x2 10 Delay 0x800 0x468 0x2000828c 0x20007b08 0xffffffff 0x0 0 LedTask 0x08007e59 0x3 5 Delay 0x320 0x78 0x200045bc 0x20004310 0xffffffff 0x0 0 SerialShellTask 0x080078f1 0x4 9 Pend 0x1000 0x478 0x200059c4 0x20004a90 0xffffffff 0xfff 0 SerialEntryTask 0x080074f1 0x5 9 Pend 0x600 0xe0 0x20005fc4 0x20005aa0 0xffffffff 0x0 0 SerialShellTask 0x080078f1 0x6 9 Running 0x1000 0x5d8 0x2000741c 0x200064e8 0xffffffff 0xfff 3556 SerialEntryTask 0x080074f1 0x7 9 Pend 0x600 0x490 0x20007a1c 0x200074f8 0xffffffff 0x0 136 Huawei LiteOS # free total used free Mem: 53420 21972 31448 text data rodata bss Mem: 55756 348 12452 4980 Huawei LiteOS # DemoTask:cnt=2 Huawei LiteOS # DemoTask:cnt=3
发现运行创建自己的任务的shell后,task 中增加了:DemoTask,free查看,内存使用【used】变大了。
自己的任务,创建成功,并运行起来了。
注意:线程栈如果设置过小,可能运行时,会报【栈溢出】的错误,这时需要加大【线程栈】。
调用LiteOS 的API:LOS_TaskCreate,创建一个自己的线程,注意这个创建过程,需要动态内存申请的。
可以通过查看LiteOS提供的API,相关文档,不断使用,熟悉任务创建、初始化等基本的操作
熟悉一个操作系统或内核,需要持续不断的使用、学习、总结。