📄 main.c
字号:
/*******************************************************************************
* Module : main.c
*
* Purpose : First bit of 'C' code that executes after startup (see boot.asm).
; Starts up the operating system, uC/OS.
*
* Language : 'c'
*
* Written : Kirby W. Cartwright, The Vanner Power Group, 06/29/98
*
* Modified :
*
* Project : Vanner Power Group Modular Controller Project PX-02.
*
* Copyright : (C) copyright 1998 by Vanner, Inc. All Rights Reserved.
*
* Notes :
*
* Unit Tested:
*
*******************************************************************************/
#include <ioports.h>
#include <time.h>
#include "C2407_REG_C.h"
#include "PLL_orin.h"
#include "C240x_ISR.h"
#include "includes.h"
#include "LCD.h"
#include "key.h"
#include "SCI.H"
#define LCDDisplayTask_Prio 5
#define CommTask_Prio 7
#define TestStatTask_Prio 9
#define UserGetKeyTask_Prio 8
#define LEDBlinkTask_Prio 4
#define AddtionalTask_Prio 3
typedef struct SysTime_tag{
INT16U sec;
INT16U min;
INT16U hou;
//INT16U day;
}SysTime;
static SysTime uptime;
unsigned int uWork,nCount;
static void Delay(INT16U counts);
static INT8U ixtoa(INT8U Ix);
//static INT16U inputmode;
//static OS_EVENT *InputSem;
OS_STK DisplayTaskStk[256];
OS_STK LEDBlinkTaskStk[64];
OS_STK AddtionalTaskStk[64];
OS_STK TestStatStk[128];
OS_STK UserGetKeyTaskStk[64];
OS_STK CommTaskStk[64];
static void LCDDisplayTask(void *);
static void LEDBlinkTask(void *);
static void AddtionalTask(void *);
static void UserGetKeyTask(void *);
static void TestStatTask(void *);
static void CommTask(void *pdata);
char UserKeyMapTbl[]={
'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'
};
volatile INT16U *wdcr = WDCR;
volatile INT16U *wdkey = WDKEY;
volatile INT16U *mcrb = MCRB;
volatile INT16U *imr = IMR;
volatile INT16U *ifr = IFR;
volatile INT16U *scictl1= SCICTL1;
volatile INT16U *scitxbuf= SCITXBUF;
char cString[]={ "Hello PC!\n\rFrom TMS320LF2407A\n\r" };
/*******************************************************************************
*
* Routine : main
*
* Purpose : Initialize further hardware, start multitasking.
*
* Inputs : None (void).
*
* Globals : None.
*
* Outputs (Returns):
* None (void).
*
* Note(s) :
*
*******************************************************************************/
void main(void)
{
int i;
// LCDprintf(0,0,"Initializing uC/OS-II...");
asm(" setc INTM");
*wdcr=0x6f;
*wdkey=0x5555;
*wdkey=0xaaaa; /* 关闭看门狗中断 */
setSysClkFreq(40);
moduleClkEnable(ALL);
(*mcrb)=0;
OSInit();
KeyInit();
OSTaskCreate(AddtionalTask,(void *)&i,(void *)&AddtionalTaskStk[0], AddtionalTask_Prio);
// OSTaskCreate(CommTask,(void *)&i,(void *)&CommTaskStk[0], CommTask_Prio);
gp_init(); /* 设置定时器 */
*imr=0x12; /* 使能定时器中断(INT2) */
*ifr=0xffff; /* 清除中断标志 */
OSStart(); /* Start multitasking */
}
/*******************************************************************************
*
* Task : void TimeOfDayTask(void *j);
*
* Purpose : Time of day task.
*
* Inputs : Pointer to context? Pointer to time/date structure.
*
* Globals : None.
*
* Outputs (Returns):
* None (void). Should never return.
*
* Note(s) : Should add code to go update global time and date structures.
* Y2K compliant.
* Should add code to initialize from hardware RTC on power-up.
* The actual interrupt rate is 15625/256=61.03515625 Hz.
*
*******************************************************************************/
void LCDDisplayTask(void *j)
{
j=j;
uptime.sec=0;uptime.min=0;uptime.hou=0;
// nCount=0;
DispInit();
LCDprintf(0,0,"uC/OS-II is running!");
LCDprintf(8,0,"Uptime:");
LCDprintf(16,0,"Tasks:");
LCDprintf(24,0,"Task Switches/s:");
LCDprintf(32,0,"CPU Usage:");
LCDprintf(32,75,"%");
LCDprintf(40,0,"Please input:");
for (;;)
{
{
SysTime OSTimetmp;
OS_ENTER_CRITICAL();
uptime.sec++;
if(uptime.sec>=60) {uptime.sec=0;uptime.min++;}
if(uptime.min>=60) {uptime.min=0;uptime.hou++;}
OSTimetmp.sec=uptime.sec;
OSTimetmp.min=uptime.min;
OSTimetmp.hou=uptime.hou;
OS_EXIT_CRITICAL();
LCDprintfArg(8,35,"%3dh",OSTimetmp.hou);
LCDprintfArg(8,55,"%3dm",OSTimetmp.min);
LCDprintfArg(8,75,"%3ds",OSTimetmp.sec);
}
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************
*
* Task : void TimeOfDayTask(void *j);
*
* Purpose : Time of day task.
*
* Inputs : Pointer to context? Pointer to time/date structure.
*
* Globals : None.
*
* Outputs (Returns):
* None (void). Should never return.
*
* Note(s) : Should add code to go update global time and date structures.
* Y2K compliant.
* Should add code to initialize from hardware RTC on power-up.
* The actual interrupt rate is 15625/256=61.03515625 Hz.
*
*******************************************************************************/
void LEDBlinkTask(void *j)
{
while (1)
{
uWork=(*PEDATDIR);
uWork|=0x4000;
uWork^=0x0040;
(*PEDATDIR)=uWork;
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************
*
* Task : void TimeOfDayTask(void *j);
*
* Purpose : Time of day task.
*
* Inputs : Pointer to context? Pointer to time/date structure.
*
* Globals : None.
*
* Outputs (Returns):
* None (void). Should never return.
*
* Note(s) : Should add code to go update global time and date structures.
* Y2K compliant.
* Should add code to initialize from hardware RTC on power-up.
* The actual interrupt rate is 15625/256=61.03515625 Hz.
*
*******************************************************************************/
void AddtionalTask(void *j)
{
INT32U i;
INT8U err;
OSStatInit();
//OSTimeDly(2*OS_TICKS_PER_SEC);
OSTaskCreate(LCDDisplayTask,(void *)&j,(void *)&DisplayTaskStk[0], LCDDisplayTask_Prio);
OSTaskCreate(LEDBlinkTask,(void *)&j,(void *)&LEDBlinkTaskStk[0], LEDBlinkTask_Prio);
OSTaskCreate(TestStatTask,(void *)&j,(void *)&TestStatStk[0], TestStatTask_Prio);
OSTaskCreate(UserGetKeyTask,(void *)&j,(void *)&UserGetKeyTaskStk[0], UserGetKeyTask_Prio);
// OSTaskCreate(CommTask,(void *)&i,(void *)&CommTaskStk[0], CommTask_Prio);
asm(" clrc INTM");
while (1)
{
OSTimeDly(4*OS_TICKS_PER_SEC);
}
}
void UserGetKeyTask(void *j)
{
INT8U keyCodeIx;
INT8U keyCode;
static INT8U i=0;
//InputSem = OSSemCreate(0);
//inputmode=0;
while (1)
{
keyCodeIx=KeyGetKey(0);
if(keyCodeIx!=0xFF)
{
keyCode=ixtoa(keyCodeIx);
LCDprintfArg(48,i,"%c",keyCode);
i+=5;
if(i>=125)
{
{INT8U j;
for(j=0;j<=125;j+=5)
{LCDprintf(48,j," ");
OSTimeDly(OS_TICKS_PER_SEC/10);}
}
i=0;
}
//if(keyCode=='E'&& inputmode==0) OSSemPost(InputSem);
//if(inputmode=1)
}
//OSTimeDly(OS_TICKS_PER_SEC/2);
}
}
void TestStatTask(void *pdata)
{
pdata=pdata;
for(;;)
{
LCDprintfArg(16,35,"%3d",OSTaskCtr);
LCDprintfArg(24,85,"%5d",(INT16U)OSCtxSwCtr);
LCDprintfArg(32,55,"%3d",OSCPUUsage);
OSCtxSwCtr=0;
OSTimeDly(OS_TICKS_PER_SEC);
}
}
void CommTask(void *pdata)
{
static INT16U i;
pdata=pdata;
CommInit();
CommCfgPort ( 9600, 8, COMM_PARITY_NONE, 1,LOW_PRIORITY,LOW_PRIORITY);
CommRxIntEn();
*scictl1=0x23;
//*scitxbuf= 'c';
CommPutChar('c',0);
/*
for ( i=0;i<32;i++ )
{
CommPutChar((INT8U)cString[i],0);
Delay(100);
}
*/
for(;;)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
static void Delay(INT16U counts)
{
int i;
for(i=0;i<counts;i++);
}
static INT8U ixtoa(INT8U Ix)
{
return UserKeyMapTbl[Ix];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -