?? test.c
字號(hào):
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
description: 一共有4個(gè)線程,主線程TaskStart初始化消息隊(duì)列,開(kāi)啟定時(shí)器,Tast1只是簡(jiǎn)單的運(yùn)行
Task2給Task3發(fā)消息,收到回執(zhí)后繼續(xù)發(fā),從A發(fā)到Z,task3則收取消息并回執(zhí)
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; //增加一個(gè)全局變量,做為是否時(shí)鐘調(diào)度的標(biāo)志
/*
*********************************************************************************************************
* 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); //初始化相關(guān)變量
/*$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(); //得到當(dāng)前進(jìn)程句柄
ct = GetCurrentThread(); //得到當(dāng)前線程偽句柄
DuplicateHandle(cp, ct, cp, &mainhandle, 0, TRUE, 2); //偽句柄轉(zhuǎn)換,得到線程真句柄
}
void TaskStart(void * pParam)
{
AckMbox = OSMboxCreate(0);
TxMbox = OSMboxCreate(0);
OS_ENTER_CRITICAL(); //調(diào)用printf函數(shù)最后關(guān)中斷
printf( "main Start running\n");
OS_EXIT_CRITICAL();
timeSetEvent(1000/OS_TICKS_PER_SEC, 0, OSTickISR, 0, TIME_PERIODIC); //開(kāi)啟一個(gè)定時(shí)器線程,感覺(jué)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)
{ //往接收消息隊(duì)列發(fā)送從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);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -