【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)