⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 在Visual C++环境下实现uC/OS-II的移植
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
description:	一共有4个线程,主线程TaskStart初始化消息队列,开启定时器,Tast1只是简单的运行
				Task2给Task3发消息,收到回执后继续发,从A发到Z,task3则收取消息并回执

author:		文佳 Email:ganganwen@163.com
*********************************************************************************************************
*/

#include "includes.h"

/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define  TASK_STK_SIZE                 1024       /* Size of each task's stacks (# of WORDs)            */
#define  N_TASKS                        10       /* Number of identical tasks                          */

#define TaskStart_Prio	1
#define Task1_Prio		2
#define Task2_Prio		8
#define Task3_Prio		3

#define TaskStart_ID	0
#define Task1_ID		1
#define Task2_ID		2
#define Task3_ID		3
/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/

OS_STK  TaskStk[N_TASKS][TASK_STK_SIZE];    // Tasks stacks

OS_EVENT *AckMbox;
OS_EVENT *TxMbox;

BOOLEAN FlagEn = 1;		//增加一个全局变量,做为是否时钟调度的标志


/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void TaskStart(void * pParam) ;
void Task1(void * pParam) ;                            /* Function prototypes of tasks                  */
void Task2(void * pParam) ;                      /* Function prototypes of Startup task           */
void Task3(void * pParam) ;
void VCInit(void);						//初始化相关变量

/*$PAGE*/
/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/

int main(int argc, char **argv)
{
	VCInit();	//初始化一些变量
	
	OSInit();
	OSTaskCreateExt(TaskStart, 0, &TaskStk[0][TASK_STK_SIZE-1], TaskStart_Prio, TaskStart_ID, &TaskStk[0][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
	OSTaskCreateExt(Task1, 0, &TaskStk[1][TASK_STK_SIZE-1], Task1_Prio, Task1_ID, &TaskStk[1][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
	OSTaskCreateExt(Task2, 0, &TaskStk[2][TASK_STK_SIZE-1], Task2_Prio, Task1_ID, &TaskStk[2][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
	OSTaskCreateExt(Task3, 0, &TaskStk[3][TASK_STK_SIZE-1], Task3_Prio, Task1_ID, &TaskStk[3][0], TASK_STK_SIZE, 0, OS_TASK_OPT_STK_CHK );
	OSStart();	//start never return
	
	return 0;
}

void VCInit(void)
{
	HANDLE cp,ct;
	Context.ContextFlags = CONTEXT_CONTROL;
	cp = GetCurrentProcess();	//得到当前进程句柄
	ct = GetCurrentThread();	//得到当前线程伪句柄
	DuplicateHandle(cp, ct, cp, &mainhandle, 0, TRUE, 2);	//伪句柄转换,得到线程真句柄
		
}

void TaskStart(void * pParam) 
{	
	AckMbox = OSMboxCreate(0);
	TxMbox = OSMboxCreate(0);
	OS_ENTER_CRITICAL();	//调用printf函数最后关中断
	printf( "main Start running\n");
	OS_EXIT_CRITICAL();
	timeSetEvent(1000/OS_TICKS_PER_SEC, 0, OSTickISR, 0, TIME_PERIODIC);	//开启一个定时器线程,感觉10 ticks/s比较好
	while(1)
	{
		
		OSCtxSwCtr = 0;
		OSTimeDly(OS_TICKS_PER_SEC);
	}
}

void Task1(void * pParam)
{
	
	
	while(1)	
	{
		OS_ENTER_CRITICAL();	
		printf( "task1 running\n");
		OS_EXIT_CRITICAL();

		OSTimeDly(2);
	}
	
}

void Task2(void * pParam)
{	//往接收消息队列发送从A到Z
	char txmsg;
	INT8U err;

	txmsg = 'A';

	while(1)	
	{
		
		OS_ENTER_CRITICAL();	
		printf( "task2 send char %c\n", txmsg);
		OS_EXIT_CRITICAL();
		OSMboxPost(TxMbox, &txmsg);
		OSMboxPend(AckMbox, 0, &err);
		txmsg++;
		if(txmsg == 'Z')
			txmsg = 'A';
		
		OSTimeDly(2);
	}
}

void Task3(void * pParam)
{
	char *rxmsg;
	INT8U err;

	while(1)	
	{
		rxmsg = OSMboxPend(TxMbox,  0, &err);

		OS_ENTER_CRITICAL();	
		printf( "task3 receive char %c\n", *rxmsg);
		OS_EXIT_CRITICAL();

		OSTimeDly(2);
		OSMboxPost(AckMbox, (void*)1);
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -