LiteOS+STM32F1实现多任务通信和同步实验
-
关于LiteOS操作系统
LiteOS是2015年华为网络大会上华为发布的敏捷网络3.0中的一个轻量级的物联网操作系统。
LiteOS操作系统配置文件
- 实现任务
- 创建 2 个软件定时器,配置为周期模式,Timer1 每 1000ms 向队列中写入控灯 1 命 令字 100,Timer2 每 500ms 向队列中写入控灯 2 命令字 200。 消息队列接收任务,从队列中读取命令字,检查是否为期望的数据并输出相关信息( 控制灯进行闪烁);如果没有数据,该任务会阻塞。
- 涉及到的内容
- (1)LiteOS软件定时器
- (2)消息队列
- 相应功能模块程序
static UINT32 g_QueueID;//消息队列ID
static UINT16 g_TimerID1;//定时器1ID
static UINT16 g_TimerID2;//定时器2ID
void InitTask(void)
{
UINT32 uwRet; //记录返回值
TSK_INIT_PARAM_S Task_Init_Param; //任务参数变量
UINT32 TaskID; //创建任务后的任务ID
/*创建消息队列*/
uwRet = LOS_QueueCreate(
"MsgQueue", /* 队列的名称 */
10, /* 队列的长度 */
&g_QueueID, /* 队列的 ID(句柄) */
0, /* 队列模式,官方暂时未使用 */
sizeof(UINT32) /* 节点大小,单位为字节 */
);
if(uwRet != LOS_OK)
{
Debug_Printf("create the Queue failure!error: %X\r\n",uwRet);
}
//创建消息处理任务
Task_Init_Param.usTaskPrio = 2; //任务优先级
Task_Init_Param.pcName = "MsgHandler"; //任务名
Task_Init_Param.pfnTaskEntry = (TSK_ENTRY_FUNC)MsgHandler; //任务函数
Task_Init_Param.uwStackSize = 0x1000; //任务栈大小
uwRet = LOS_TaskCreate(&TaskID,&Task_Init_Param); //开始创建任务
if(uwRet != LOS_OK)
{
Debug_Printf("create the Task failure!\r\n");
}
Debug_Printf("create the Task success!\r\n");
/*定时器1*/
uwRet = LOS_SwtmrCreate(
1000, /* 1000ms */
LOS_SWTMR_MODE_PERIOD, /* 周期模式 */
TimerCallback, /* 定时器回调函数 */
&g_TimerID1, /* 定时器ID */
0x10 /*定时器传入参数*/
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == YES) /**/
,OS_SWTMR_ROUSES_ALLOW, /**/
OS_SWTMR_ALIGN_SENSITIVE /**/
#endif
);
if(LOS_OK == uwRet)
{
uwRet = LOS_SwtmrStart(g_TimerID1); //启动时间定时器1
Debug_Printf("start the software timer 1\n");
if(uwRet != LOS_OK)
{
Debug_Printf("start the software timer fail!error: %X\r\n",uwRet);
}
}
/*定时器2*/
uwRet = LOS_SwtmrCreate(
500, /* 500ms */
LOS_SWTMR_MODE_PERIOD, /* 周期模式 */
TimerCallback, /* 定时器回调函数 */
&g_TimerID2, /* 定时器ID */
0x20
#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == YES) /**/
,OS_SWTMR_ROUSES_ALLOW, /**/
OS_SWTMR_ALIGN_SENSITIVE /**/
#endif
);
if(LOS_OK == uwRet)
{
uwRet = LOS_SwtmrStart(g_TimerID2); //启动时间定时器2
Debug_Printf("start the software timer 2\n");
if(uwRet != LOS_OK)
{
Debug_Printf("start the software timer fail!error: %X\r\n",uwRet);
}
}
}
/*消息处理*/
UINT32 MsgHandler(UINT32 ulArg)
{
UINT32 uwRecvMsg = 0;
UINT32 uwRet=LOS_OK;
UINT32 uwLength = 0;
Debug_Printf("start MsgHandler\n");
while(1)
{
uwLength = sizeof(uwRecvMsg);
uwRet = LOS_QueueReadCopy(g_QueueID,&uwRecvMsg,&uwLength,LOS_WAIT_FOREVER); //从消息队列中读消息
if(LOS_OK == uwRet)
{
uwRet = LOS_SwtmrStart(g_TimerID1); //启动时间定时器1
uwRet = LOS_SwtmrStart(g_TimerID2); //启动时间定时器2
LOS_TaskDelay(1000);
if(LOS_OK == uwRet)
{
switch (uwRecvMsg) //对消息进行判断
{
case 0x10:
LED1_TOGGLE;
Debug_Printf("100\n");
break;
case 0x20:
LED2_TOGGLE;
Debug_Printf("200\n");
break;
default:
break;
}
uwRecvMsg = 0; //清空标志位
}
}
}
}
/*定时器回调函数*/
void TimerCallback(UINT32 ulArg)
{
LOS_QueueWriteCopy( //将定时器的ulArg写入消息队列
g_QueueID,
&ulArg,
sizeof(UINT32),
0
);
/* 50ms 扫描一次 */
LOS_TaskDelay(50);
ulArg=0;
}
- 结果测试(基于正点原子STM32F103 ATK-NANO开发板)
Timer1 每 1000ms 向队列中写入控灯 1 命 令字 100,
Timer2 每 500ms 向队列中写入控灯 2 命令字 200。
测试演示视频:https://live.csdn.net/v/165895