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

📄 ext2.c

📁 ucos 在GAMEBOY上的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
****************************************************************************************
*
*			 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 + -