环境
系统版本: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,相关文档,不断使用,熟悉任务创建、初始化等基本的操作
熟悉一个操作系统或内核,需要持续不断的使用、学习、总结。