其他分享
首页 > 其他分享> > LiteOS多任务通信和同步(基于STM32F1)

LiteOS多任务通信和同步(基于STM32F1)

作者:互联网

LiteOS+STM32F1实现多任务通信和同步实验

        LiteOS操作系统配置文件

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;											
}

Timer1 每 1000ms 向队列中写入控灯 1 命 令字 100,

Timer2 每 500ms 向队列中写入控灯 2 命令字 200。

测试演示视频:https://live.csdn.net/v/165895

标签:uwRet,UINT32,定时器,LiteOS,队列,多任务,LOS,Debug,STM32F1
来源: https://blog.csdn.net/qq_44974177/article/details/118027003