【LiteOS】小白进阶之 LiteOS 队列、任务、定时器综合实验
【摘要】
1、功能说明
创建一个打印队列和 3 个任务,其中两个 Task 负责写入数据 1/2,另外一个用于输出字符串。
同时还在 Tick 任务每触发 200 次,向打印队列(首部)写入数据 3。
2、代码讲解
1)创建队列、定时器、任务
UINT32 Example15_Entry(VOID) { UIN...
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#代码讲解
文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/liwei16611/article/details/86705215
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)