【LiteOS】小白进阶之 LiteOS 队列、任务、定时器综合实验

本文介绍了如何在 LiteOS 中使用队列、任务和定时器进行综合实验。通过创建一个打印队列及三个任务,其中两个任务负责写入数据,另一个任务负责读取并打印。同时,定时器每隔200次触发时,会在队列首部写入数据。详细代码讲解包括队列、定时器和任务的创建,以及数据发送与接收流程。
摘要由CSDN通过智能技术生成

1、功能说明

创建一个打印队列和 3 个任务,其中两个 Task 负责写入数据 1/2,另外一个用于输出字符串。

同时还在 Tick 任务每触发 200 次,向打印队列(首部)写入数据 3。

2、代码讲解

1)创建队列、定时器、任务

UINT32 Example15_Entry(VOID) {
    UINT32 uwRet = LOS_OK;
    TSK_INIT_PARAM_S stInitParam = {0};
    
    puts("Example15_Entry\r\n");

    // 创建队列
    uwRet = LOS_QueueCreate(
                "queue",                // 队列名称
                3,                      // 队列大小
                &s_uwQueueID,           // 队列ID
                0,                      // 不使用
                sizeof(UINT32)          // 队列消息大小
                );
    if (uwRet != LOS_OK) {
        printf("create queue failure!,error:%x\n", uwRet);
        return LOS_NOK;
    }

    // 创建定时器
    uwRet = LOS_SwtmrCreate(
                PERIODIC_TIMER_VALUE, 
                LOS_SWTMR_MODE_PERIOD,
                Timer_Callback,
                &s_usSwTmrID,
                (UINT32)s_pStringsToPrint[2]
                #if (LOSCFG_BASE_CORE_SWTMR_ALIGN == YES)
                , OS_SWTMR_ROUSES_ALLOW,
                OS_SWTMR_ALIGN_SENSITIVE 
                #endif
                );
    if(LOS_OK != uwRet)
    {
        printf("create Timer failed.\r\n");
        return LOS_NOK;
    }

    // 创建发送任务
    stInitParam.pfnTaskEntry = Example_TaskSend;
    stInitParam.usTaskPrio = TASK_PRIO_SEND;
    stInitParam.pcName = "TaskSend1";
    stInitParam.uwStackSize = TASK_STK_SIZE;
    stInitParam.uwArg = (UINT32)s_pStringsToPrint[0];
    uwRet = LOS_TaskCreate(&s_uwTskLoID, &stInitParam);
    if (uwRet != LOS_OK) {
        printf("Example_TaskSend create Failed!\r\n");
        return LOS_NOK;
    }
    
    stInitParam.pcName = "TaskSend2";
    stInitParam.uwArg = (UINT32)s_pStringsToPrint[1];
    uwRet = LOS_TaskCreate(&s_uwTskLoID, &stInitParam);
    if (uwRet != LOS_OK) {
        printf("Example_TaskSend create Failed!\r\n");
        return LOS_NOK;
    }

    // 创建接收任务
    stInitParam.pfnTaskEntry = Example_TaskRecv;
    stInitParam.usTaskPrio = TASK_PRIO_RECV;
    stInitParam.pcName = "TaskRecv";
    stInitParam.uwStackSize = TASK_STK_SIZE;
    uwRet = LOS_TaskCreate(&s_uwTskHiID, &stInitParam);
    if (uwRet != LOS_OK) {
        printf("Example_TaskRecv create Failed!\r\n");
        return LOS_NOK;
    }

    // 启动定时器
    uwRet = LOS_SwtmrStart(s_usSwTmrID);
    if(LOS_OK != uwRet)
    {
        printf("Start Timer failed.\r\n");
        return LOS_NOK;
    }

    return uwRet;
}

2)发送任务将 Task1、Task2 字符串发送到队列,接收任务从队列中读取数据

static VOID *Example_TaskRecv(UINT32 uwArg) {
    UINT32 uwRet = LOS_OK;
    UINT32 uwReadbuf = NULL;
    UINT32 uwBufferSize = sizeof(UINT32*);
       
    for (;;) {        
        uwRet = LOS_QueueRead(s_uwQueueID, (VOID*)&uwReadbuf, uwBufferSize, LOS_WAIT_FOREVER);
        if (LOS_OK != uwRet) {
            printf("recv value failure,error:%x\r\n", uwRet);
        } else {
            if (uwBufferSize == sizeof(UINT32)) {
                puts((const CHAR*)uwReadbuf);
            }
        }
    }
}

static VOID * Example_TaskSend(UINT32 uwArg) {
    UINT32 uwRet = LOS_OK;
    
    for (;;) {
        uwRet = LOS_QueueWrite(s_uwQueueID, (VOID*)uwArg, sizeof(UINT32*), 0);
        if (LOS_OK != uwRet) {
            printf("send value failure,error:%x\r\n", uwRet);
        }

        LOS_TaskDelay(2000);
    }
}

3)周期定时器回调任务将数据写入到队列头部

static void Timer_Callback(UINT32 uwArg)
{
    UINT32 uwRet = LOS_OK;
    
    uwRet = LOS_QueueWriteHead(s_uwQueueID, (VOID*)uwArg, sizeof(UINT32*), 0);
    if (LOS_OK != uwRet) {
        printf("send value failure,error:%x\r\n", uwRet);
    }

}

4)效果演示

 

 

refer:

https://liteos.github.io/tutorials/kernel/example15.html#代码讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值