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

📄 test.c

📁 基于ARM的uCOS-II完整源码,在VC++ WINDOWN下的编程. 利用VC++直接编译显示图形.便于源码的调试.首先下载uC/OS-II - WIN32 Port for 32bit Wind
💻 C
字号:
/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*
*					WIN32 PORT & LINUX PORT
*                          (c) Copyright 2004, Werner.Zimmermann@fht-esslingen.de
*                                           All Rights Reserved
*
*                                               EXAMPLE #0
*             Used to study the scheduling behaviour of the WIN32 and LINUX port during development
*********************************************************************************************************
*/

#include "includes.h"
#include <windows.h>
/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

TMQ	 *task1_tmq;			// 任务1的任务消息队列(指针),
HWND hwnd  ;   //定义一个句柄
HDC  hdc;
                       // GetMessage()等待消息时使用 
extern TemiStatus         TStatus;                        //终端状态全局变量
extern uint8              WinId;                          //当前窗体状态
extern uint8              debug;                           //调试开关
                       
void *task1_tmq_buf[30];	// 任务1的任务消息队列存储区,
#define TASK_STK_SIZE   4069                                    // Stack size, in bytes

//#define SUSPEND_RESUME                                        // Task 1 and 2 use suspend and resume for scheduling
                                                                // (if not defined: use time delays)

/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/
OS_STK  TestTaskStk1[TASK_STK_SIZE];                            // Task stacks
OS_STK  TestTaskStk2[TASK_STK_SIZE];
OS_STK  TestTaskStk3[TASK_STK_SIZE];
OS_STK  TestTaskStk4[TASK_STK_SIZE];
OS_STK  TestTaskStk6[TASK_STK_SIZE];
/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void TestTask1(void *pdata);                                    // The 3 tasks
void TestTask2(void *pdata);
void TestTask3(void *pdata);
void TestTask4(void *pdata);
void TestTask6(void *pdata);
void OurIsr1(void);                                             // The interrupt service routine for IRQ 1

void validate()
{
   WinId = 0;
   debug = 0;
   TStatus = 0;
}


//SetRect(&rc,x-4,y-4,x+72,y+24); 
uint8 checkpoint(uint32 sx,uint32 sy)
{
   if(((sx <= 472) && (sx >=396))
	   &&((sy >= 156) && (sy <= 184))) //left
   return 0;
   if(((sx <= 672) && (sx >=596))
	   &&((sy >= 159) && (sy <= 184))) //right
   return 1;
   if(((sx <= 572) && (sx >=496))
	   &&((sy >= 36) && (sy <= 64))) //measure
   return 3;
   if(((sx <= 572) && (sx >=496))
	   &&((sy >= 116) && (sy <= 144))) //up
   return 4;
   if(((sx <= 572) && (sx >=496))
	   &&((sy >= 156) && (sy <= 184))) //ok
   return 5;
   if(((sx <= 572) && (sx >=496))
	   &&((sy >= 196) && (sy <= 224))) //left
     return 6;
   else 
	   return 9;
}

//窗口进程说明
LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

//主函数
int WINAPI WinMain(
  HINSTANCE hInstance,  // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,      // pointer to command line
  int nCmdShow          // show state of window
)
{
 WNDCLASS wndcls;  //定义一个WNDCLASS类的对象
 MSG msg;   //定义消息
 wndcls.cbClsExtra=0;  //类的附加参数
 wndcls.cbWndExtra=0;  //窗口的附加参数
 wndcls.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);  //窗口背景
 wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);  //鼠标类型
 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);   //光标类型
 wndcls.hInstance=hInstance;     //应用程序
 wndcls.lpfnWndProc=WinSunProc;   //窗口进程
 wndcls.lpszClassName="LvSong";   //类的名字
 wndcls.lpszMenuName=NULL;    //定义窗口菜单
 wndcls.style=CS_HREDRAW | CS_VREDRAW;  //窗口的类型
 RegisterClass(&wndcls);   //注册窗口类

 
 hwnd=CreateWindow(wndcls.lpszClassName,"血压终端演示",WS_OVERLAPPEDWINDOW,
  100,100,670,240+34,
  NULL,NULL,hInstance,NULL);   //创建一个窗口	

 ShowWindow(hwnd,SW_SHOWNORMAL);   //显示窗口
 UpdateWindow(hwnd);      //窗口重绘
 
 while(GetMessage(&msg,NULL,0,0))   //消息循环 保证窗口存在
 {
  TranslateMessage(&msg);    //传输消息
  DispatchMessage(&msg);   
  OSTimeDly(OS_TICKS_PER_SEC/50);   
 }
 //OSTimeDly(OS_TICKS_PER_SEC / 50);      // 延时20毫秒
 return 0;
}

//窗口进程描述
LRESULT CALLBACK WinSunProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
   static int cxClient;//客户区的宽度
   static int cyClient;//客户区的高度
   static  RECT rect ;//被绘制的矩形
	//SetMenutemp();
 char szChar[20];
 MSGtemp	msg_key;
 uint32 key = 0;  
 uint8 val;
 POINT ptOrigin,ptCurrent;
 //HDC hdc;   //定义一个DC的句柄
 PAINTSTRUCT ps;
  msg_key.message = 0;	
 //HDC hDC;
 switch(uMsg)  //判断消息
 {
	case WM_CREATE:
	case WM_WINDOWPOSCHANGED: 
    rect.left=0;
    rect.top=0;
    rect.right=320;
    rect.bottom=240;
    return 0;

  case WM_CHAR:    //按键消息
  //msg->message = wParam;
  //SendMessagetemp(&msg);
  key = wParam ;
  msg_key.message = key;	
  SendMessagetemp(&msg_key);					// 发送消息
  while (key != 0)
  key = 0;
  OSTimeDly(OS_TICKS_PER_SEC / 20); 

  //sprintf(szChar,"char is %d",wParam);  //获得按键并保存在字符串里
  //MessageBox(hwnd,szChar,"检查按键",0);  //弹出消息框 0==MB_OK
  break; 
  case WM_LBUTTONDOWN:   //鼠标左键
  GetCursorPos(&ptOrigin); //得到鼠标按下时的点坐标
  ScreenToClient(hwnd,&ptOrigin);//坐标转换
  val = 9;
  val = checkpoint(ptOrigin.x,ptOrigin.y);
switch(val)
{
	case 0:
		key = TM_KEYLEFT;
        break;
    case 1:
		key = TM_KEYRIGHT;
        break;
	case 2:
		key = TM_KEYLEFT;
        break;
	case 3:
		key = TM_KEYMEASURE;
        break;
	case 4:
		key = TM_KEYUP;
        break;
	case 5:
		key = TM_KEYOK;
        break;
	case 6:
		key = TM_KEYDOWN;
        break;
		default:
			break;
}
if(val != 9)
{
  //sprintf(szChar,"char is %d",key);  //获得按键并保存在字符串里
  //MessageBox(hwnd,szChar,"键值",0);  //弹出消息框 0==MB_OK
  msg_key.message = key;	
  SendMessagetemp(&msg_key);
  while (key != 0)
     key = 0;
  OSTimeDly(OS_TICKS_PER_SEC / 20); 
}
  break;
/*case WM_PAINT:   //窗口背景
  
  
  //hdc =BeginPaint(hwnd,&ps);
  //TextOut(hDC,0,0,"VC++ Lesson1",strlen("VC++ Lesson1"));
  //EndPaint(hwnd,&ps);
  break; */
 case WM_CLOSE:   //关闭窗口
  if(IDYES==MessageBox(hwnd,"是否真的结束?","VC++学习",MB_YESNO))
  {
   DestroyWindow(hwnd);  //销毁窗口 传递一个WM_DESTROY消息
  }
  break;
 case WM_DESTROY:  //销毁消息
  PostQuitMessage(0);
  break;
 default:
	 OSTimeDly(OS_TICKS_PER_SEC / 50);
     return DefWindowProc(hwnd,uMsg,wParam,lParam); 
  //      // 延时20毫秒 
 }
 OSTimeDly(OS_TICKS_PER_SEC / 50);
 return 0;
  //默认窗口进程
}


/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/
//int main(void)
int main(int argc, char* argv[])
{
    // Display a banner.
	    

	char arg[200]={0};
	int len,i;
#ifdef __WIN32__
    printf("##### uCOS-II V%4.2f Port V%4.2f for WIN32 #####\n", ((FP32)OSVersion())/100, ((FP32)OSPortVersion())/100);
#endif
#ifdef __LINUX__
    printf("##### uCOS-II V%4.2f Port V%4.2f for LINUX #####\n", ((FP32)OSVersion())/100, ((FP32)OSPortVersion())/100);
#endif

     // Initialize uCOS-II.
    OSInit();                                                               //Calling sequence -->OSInitHookBegin-->OSTaskStkInit-->OSTCBInitHook-->OSTaskCreateHook-->OSInitHookEnd
    validate();
    // Create the first task
	task1_tmq = TMQ_Create(task1_tmq_buf, 30);
    OSTaskCreate(TestTask1, (void *) 11, &TestTaskStk1[TASK_STK_SIZE], 11); //Calling sequence -->OSTaskStkInit-->OSTCBInitHook-->OSTaskCreateHook
    PC_IntVectSet(1, OurIsr1);                                             //Install an interrupt service routine for IRQ 1
	arg[0]='\"';
    strcpy(arg+1,argv[0]);
    len=strlen(arg);
    arg[len]='\"';
   
    

    // Start multitasking.
    OSStart();                                                              //Calling sequence -->OSTaskSwHook-->OSStartHighRdy

    printf("main(): We should never execute this line\n");

    return 0;  


}


/*
*********************************************************************************************************
*                                                First Task (startup task)
*********************************************************************************************************
*/
void TestTask1(void *pdata)
{   //printf("%4u: ***** Test Task 1 First call *****\n", OSTime);
    int i;
    #if OS_TASK_STAT_EN > 0
    OSStatInit();                                                               //Initialize the statistics task
    #endif
	OSTaskCreate(TestTask2, (void *) 22, &TestTaskStk2[TASK_STK_SIZE], 15);     //Create 3 other tasks
    OSTaskCreate(TestTask3, (void *) 33, &TestTaskStk3[TASK_STK_SIZE], 8);
    OSTaskCreate(TestTask4, (void *) 10, &TestTaskStk4[TASK_STK_SIZE], 10);
    i = WinMain(NULL,NULL,NULL,0); //找到程序运行窗口的句柄 
    //OSTaskCreate(TestTask6, (void *) 8, &TestTaskStk6[TASK_STK_SIZE], 8);
	//
    //SetMenutemp(); 
}

/*
*********************************************************************************************************
*                                                Second Task
*********************************************************************************************************
*/
void TestTask2(void *pdata)
{  
   MSGtemp	msg_key;
   uint32 key = 0;
   msg_key.message = 0;				       	// 设置消息值
   while(1)
   {  OSTimeDly(OS_TICKS_PER_SEC / 20);      	// 延时20毫秒
      PC_GetKey(&key);
      if (key == 0)
      {  continue;
      }
      if (key == 0x1b)
      {  exit(0);   
      }

      msg_key.message = key;	
      SendMessagetemp(&msg_key);					// 发送消息
      while (key != 0)
             key = 0;
	  OSTimeDly(OS_TICKS_PER_SEC / 20);      // 延时20毫秒
   }
}

/*
*********************************************************************************************************
*                                                Third Task
*********************************************************************************************************
*/
void TestTask3(void *pdata)
{  
    uint8 i;
	OSTimeDly(OS_TICKS_PER_SEC);
    hdc=GetDC(hwnd);  //获得句柄 
    SetMenutemp();
	
}

/*
*********************************************************************************************************
*                                                Forth Task
*********************************************************************************************************
*/
void TestTask4(void *pdata)
{   
	
	char s[40],vali[40],temp[60],temp1[60];
	int i;
	//HDC   hdc;
	pdata = pdata;
    OSTimeDly(OS_TICKS_PER_SEC*2);
	strcpy(vali,(char *)"用户帐号 028 000 0061");
    for (;;)
    {  
		PC_GetDateTime(s);
		hdc=GetDC(hwnd);  //获得句柄
		SetTextColor(hdc,RGB(0,0,255));
		SetBkColor(hdc,RGB(128,128,128));  
        TextOut(hdc,100,0,s,strlen(s)-3);  //打印文字
		//TextOut(hdc,160,0,vali,strlen(vali));  //打印文字
		ShowBattery(260,2,30,10,30);

		//DispString (80, 60, (char *)"时间设定", 1);
		//ReleaseDC(hwnd,hdc);  //释放DC
        //PC_DispStr(1, 0, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
		//DispString(0,0,(char *)"帐号 0280000061",0);
        OSTimeDly(OS_TICKS_PER_SEC);
		//SetMenutemp();  
		
    }
}

void TestTask6(void *pdata)
{    
   /* HWND  hWnd;
	HDC   hDC;
	HPEN  hPen, hOldPen;
	int i;
	i = WinMain(NULL,NULL,NULL,0); //找到程序运行窗口的句柄  
   	hWnd = hwnd;
    hDC=GetDC(hWnd);//通过窗口句柄得到该窗口的设备场境句柄
    hPen,hOldPen; //画笔
	i = 0;
    for(;i<500;++i)
            SetPixel(hDC,10+i,10+i,0x0000ff);//用画点的办法画一根线,最后一个参数是颜色(32位)

        hPen=CreatePen(PS_SOLID,2,0x00ff00);//生成绿色画笔
        hOldPen=(HPEN)SelectObject(hDC,hPen);//把画笔引入设备场境


        MoveToEx(hDC,20,50,NULL); //设置画线起点
        LineTo(hDC,100,100);      //画到终点

        //Arc(hDC,100,100,300,300,350,500,350,500);//画圆

        SelectObject(hDC,hOldPen); */
}

/*
*********************************************************************************************************
*                                     Interrupt service routine for IRQ 1
*                                (use "irqGenerator 1" to trigger this interrupt)
*********************************************************************************************************
*/
void OurIsr1(void)
{       OSIntEnter();
        printf("##### Interrupt service routine for IRQ 1 #####\n");
        OSTaskResume(10);                                       //Trigger task 4
        OSIntExit();
}

⌨️ 快捷键说明

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