LiteOS 入门学习笔记 - 用户任务task的创建

环境

系统版本: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,相关文档,不断使用,熟悉任务创建、初始化等基本的操作

熟悉一个操作系统或内核,需要持续不断的使用、学习、总结。

 

 

 

 

上一篇:GNU是什么?


下一篇:【DB笔试面试786】在Oracle中,什么是坏块?坏块可以分为哪几类?