📄 ext2.c
字号:
/*
****************************************************************************************
*
* uCOS-II EXAMPLE2 的GBA版本
* PORT by 李强
*
* 注意 要本程序在GBA上稳定运行 OS_TICKS_PER_SEC 必须取值10
* 就我测试来看 过快的任务切换会造成程序崩溃 F2D sigh.... ×_×
* 就是在OS_TICKS_PER_SEC = 10 下 CPU的负荷率也是100% 难道是ABG太慢了? 16.7M ARM7耶!! 郁闷
* 一般 相同的代码OS_TICKS_PER_SEC越大 CPU负荷也越大(也就是单位时间内跑的任务次数更多)
* 比如同样的EXAMPLE1的代码 其他选项一样
* OS_TICKS_PER_SEC = 10 CPU使用率大致15~20%
* OS_TICKS_PER_SEC = 50 CPU使用率大致65~70%
****************************************************************************************
*/
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #2
*********************************************************************************************************
*/
#include "includes.h"
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
#define TASK_START_ID 0 /* Application tasks IDs */
#define TASK_CLK_ID 1
#define TASK_1_ID 2
#define TASK_2_ID 3
#define TASK_3_ID 4
#define TASK_4_ID 5
#define TASK_5_ID 6
#define TASK_START_PRIO 10 /* Application tasks priorities */
#define TASK_CLK_PRIO 11
#define TASK_1_PRIO 12
#define TASK_2_PRIO 13
#define TASK_3_PRIO 14
#define TASK_4_PRIO 15
#define TASK_5_PRIO 16
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStartStk[TASK_STK_SIZE]; /* Startup task stack */
OS_STK TaskClkStk[TASK_STK_SIZE]; /* Clock task stack */
OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 task stack */
OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 task stack */
OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 task stack */
OS_STK Task4Stk[TASK_STK_SIZE]; /* Task #4 task stack */
OS_STK Task5Stk[TASK_STK_SIZE]; /* Task #5 task stack */
OS_EVENT *AckMbox; /* Message mailboxes for Tasks #4 and #5 */
OS_EVENT *TxMbox;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void TaskStart(void *data); /* Function prototypes of tasks */
static void TaskStartCreateTasks(void);
static void TaskStartDispInit(void);
static void TaskStartDisp(void);
void TaskClk(void *data);
void Task1(void *data);
void Task2(void *data);
void Task3(void *data);
void Task4(void *data);
void Task5(void *data);
/***************************************************************************************
*
* 以下为原PC函数在GBA上的实现
*
* 作者: 李强
*
****************************************************************************************/
/*
*********************************************************************************************************
* PC_DispStr Port to GBA screen
*********************************************************************************************************
*/
void PC_DispStr(u16 x,
u16 y,
char* str,
u16 fg_colr,
u16 bg_colr)
{
u16 old_x = wherex,
old_y = wherey,
old_fg = whichFG,
old_bg = whichBG;
setxy(x*ASC_FONT_W,y*ASC_FONT_H);
SetColor(fg_colr,bg_colr);
printLCD(str);
setxy(old_x,old_y);
SetColor(old_fg,old_bg);
}
/*
*********************************************************************************************************
* PC_DispChar Port to GBA screen
*********************************************************************************************************
*/
void PC_DispChar(u16 x,
u16 y,
char ch,
u16 fg_colr,
u16 bg_colr)
{
u16 old_x = wherex,
old_y = wherey,
old_fg = whichFG,
old_bg = whichBG;
setxy(x*ASC_FONT_W,y*ASC_FONT_H);
SetColor(fg_colr,bg_colr);
lcdputc(ch);
setxy(old_x,old_y);
SetColor(old_fg,old_bg);
}
// 启动uCOS TICK 定时器 使用timer3
void InitTickTimer(void) // 初始化tick定时器 因为比较重要不放在初始化AGB中
{
REG_IME = 0;
setb(REG_IE,INT_TIM3);
REG_TM3CNT = 0x00C1;
REG_TM3D = 0x10000 - (GBA_FOSC/64)/OS_TICKS_PER_SEC;
REG_IME = 1;
}
/*******************************************************************************
*
* PC_ElapsedStart()
* PC_ElapsedStop()
* PC_ElapsedInit()
* 使用GBA timer2定时器对程序运行时间计时 以us为单位返回
*
*******************************************************************************/
u16 PC_ElapsedOverhead = 0; // 修正PC_ElapsedStart()和PC_ElapsedStop()运行带来的误差
// 对timer2计数器清0 同时启动timer2 暂时不考虑定时器翻转情况
#define PC_ElapsedStart() REG_TM2D = 0;\
setb(REG_TM2CNT,7)
u16 PC_ElapsedStop(void) // 停止timer2 计时(以us为单位)
{
clrb(REG_TM2CNT,7);
return (u32)(REG_TM2D-PC_ElapsedOverhead)*60/1000;
}
// 使用timer2 测量一段代码运行时间
// timer2 tick is 59.6ns
void PC_ElapsedInit()
{
REG_TM2CNT = 0;
PC_ElapsedOverhead = 0;
PC_ElapsedStart();
PC_ElapsedOverhead = PC_ElapsedStop();
}
/****************************************************************************
*
* 时钟计时
*
*******************************************************************************/
//current time
int ctime[3] = {12, // hour
0, // min.
0 // sec.
};
#define sec ctime[2]
#define minu ctime[1]
#define hour ctime[0]
void PC_GetDateTime(char * des)
{
if (++sec == 60)
{
sec = 0;
if (++minu == 60)
{
minu = 0;
if (++hour == 24)
{
hour = 0;
}
}
}
sprintf(des,"%02d:%02d:%02d",
hour,
minu,
sec);
}
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void main (void)
{
OS_STK *ptos;
OS_STK *pbos;
INT32U size;
lcdinit();
SetColor(COLOR_WHITE,COLOR_BLACK);
OSInit(); /* Initialize uC/OS-II */
PC_ElapsedInit(); /* Initialized elapsed time measurement */
ptos = &TaskStartStk[TASK_STK_SIZE - 1]; /* TaskStart() will use Floating-Point */
pbos = &TaskStartStk[0];
size = TASK_STK_SIZE;
OSTaskCreateExt(TaskStart,
(void *)0,
ptos,
TASK_START_PRIO,
TASK_START_ID,
pbos,
size,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSStart(); /* Start multitasking */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; /* Prevent compiler warning */
InitTickTimer();
TaskStartDispInit(); /* Setup the display */
OS_ENTER_CRITICAL(); /* Install uC/OS-II's clock tick ISR */
OSStatInit(); ;
OS_EXIT_CRITICAL();
OSStatInit(); /* Initialize uC/OS-II's statistics */
AckMbox = OSMboxCreate((void *)0); /* Create 2 message mailboxes */
TxMbox = OSMboxCreate((void *)0);
TaskStartCreateTasks(); /* Create all other tasks */
for (;;) {
TaskStartDisp(); /* Update the display */
OSCtxSwCtr = 0; /* Clear context switch counter */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -