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

📄 复件 app.c

📁 将UCOSII移植到AT91SAM7a3上
💻 C
字号:
//-------------------------------------------------------------------------------------------------------
//函数 名: app.c
//功  能: 在UCOS-II内核上建立实际应用
//设  计: 百特电子深圳R&D       张正锋
//时  间: 2006-3-28
//-------------------------------------------------------------------------------------------------------

#include <includes.h>

#include "dbgu.h"
#include "board.h"
#include "lcd12864.h"



#define SPEED 		(MCKKHz/10)
unsigned int LedSpeed = SPEED *50 ;
//const int led_mask[NB_LED]= {LED1, LED2, LED3, LED4};

/*
*********************************************************************************************************
*                                              常量定义
*********************************************************************************************************
*/

#define  TASK_STK_SIZE             128

//OS_CFG.H   最底优先级60(给空闲任务)      最多任务数20
#define  TASK_START_PRIO           0       //最高优先级

#define  TASK_SW4_DBGU_PRIO        10      //创建一个DBGU测试任务--将DBGU连接到超级终端

#define  IRQ2_INTERRUPT_LEVEL      6
#define  FIQ_INTERRUPT_LEVEL       7

/*
*********************************************************************************************************
*                                              变量定义
*********************************************************************************************************
*/

OS_STK          AppStartTaskStk[TASK_STK_SIZE];
OS_STK          SW4_DBGU_TaskStk[TASK_STK_SIZE];
/*
*********************************************************************************************************
*                                              函数申明
*********************************************************************************************************
*/
static  void  AppStartTask(void *p_arg);
static  void  SW4_DBGU_Task(void *p_arg);

/*
*********************************************************************************************************
函数名:main
功能说明:初试化 UCOS-II ,建立第一个新任务
*创 始 人: 张正锋  embed_tech@126,com
*********************************************************************************************************
*/
const char hanzi4[5][32]=           // 数据表
{
//"数",
      {0x10,0x92,0x54,0x30,0xFF,0x50,0x94,0x32,
      0xD8,0x17,0x10,0x10,0xF0,0x18,0x10,0x00,
      0x02,0x82,0x4E,0x33,0x22,0x52,0x8E,0x40,
      0x23,0x14,0x08,0x16,0x61,0xC0,0x40,0x00},

//"据",
     {0x10,0x10,0x10,0xFF,0x90,0x50,0xFE,0x92,
      0x92,0x92,0xF2,0x92,0x92,0xDF,0x82,0x00,
      0x02,0x42,0x81,0x7F,0x40,0x38,0x07,0xFC,
      0x44,0x44,0x47,0x44,0x44,0xFE,0x04,0x00},

//"发",
      {0x00,0x10,0x18,0x16,0x10,0x90,0xF0,0x9F,
      0x90,0x90,0x92,0x94,0x10,0x18,0x10,0x00,
      0x40,0x20,0x90,0x88,0x46,0x41,0x23,0x14,
      0x08,0x14,0x22,0x21,0x40,0xC0,0x40,0x00},

//"送",
     {0x40,0x42,0x44,0xCC,0x80,0x88,0x89,0x8A,
      0x8C,0xF8,0x8C,0x8A,0x89,0xC8,0x80,0x00,
      0x00,0x40,0x20,0x1F,0x20,0x40,0xA0,0x90,
      0x8C,0x83,0x88,0x90,0xB0,0xC0,0x40,0x00},

//"完",
     { 0x10,0x0C,0x04,0x24,0x24,0x24,0x25,0x26,
      0x24,0x24,0x34,0x24,0x84,0x14,0x0C,0x00,
      0x00,0x81,0x81,0x41,0x31,0x0F,0x01,0x01,
      0x3F,0x41,0x41,0x41,0x41,0x41,0x70,0x00}
};

void wait_push( void )
{
    unsigned int wait_pushing_time ;
    for(wait_pushing_time = 0; wait_pushing_time < LedSpeed; wait_pushing_time++) ;
}

void  main (void)
{
   	 INT8U  err;
    	lcd_init();
 	LCD_Clr();
  	
    AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;   //禁止所有中断

    OSInit();                               //初始化 "uC/OS-II, 实时操作系统内核"

    OSTaskCreateExt(AppStartTask,
                    (void *)0,
                    (OS_STK *)&AppStartTaskStk[TASK_STK_SIZE-1],
                    TASK_START_PRIO,
                    TASK_START_PRIO,
                    (OS_STK *)&AppStartTaskStk[0],
                    TASK_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

     //OtherTask();

#if OS_TASK_NAME_SIZE > 11
    OSTaskNameSet(TASK_START_PRIO, "Start Task", &err);
#endif

#if OS_TASK_NAME_SIZE > 14
    OSTaskNameSet(OS_IDLE_PRIO, "uC/OS-II Idle", &err);
#endif

#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0)
    OSTaskNameSet(OS_STAT_PRIO, "uC/OS-II Stat", &err);
#endif

    OSStart();  // 启动多任务,将任务调度权交给UCOS-II
}
/*$PAGE*/


//*----------------------------------------------------------------------------
//* 函数名           : at91_IRQ0_handler
//* 功能             : Irq Handler called by the IRQ0 interrupt with AT91 compatibility
//* 输入参数         : none
//* 返回值           : none
//* 创建人           :张正锋 2006/2/21  embed_tech@126,com
//*----------------------------------------------------------------------------
void at91_IRQ2_handler(void)
{
   AT91C_BASE_AIC->AIC_ICCR =AT91C_ID_IRQ2;//清除中断---直接对寄存器进行操作

   OSTaskSuspend(0);                       //挂起任务优先级为0的任务

   AT91C_BASE_AIC->AIC_EOICR = 0;         // 写任意值到该寄存器以便退出中断--执行低优先级中断
}


//*----------------------------------------------------------------------------
//* 函数名          : FIQ_init_handler
//* 功能            : Irq Handler called by the FIQ interrupt with AT91  compatibility
//* 输入参数         : none
//* 返回值           : none
//* 创建人           :张正锋 2006/2/21  embed_tech@126,com
///*----------------------------------------------------------------------------

void FIQ_init_handler(void)
{
    AT91C_BASE_AIC->AIC_ICCR =AT91C_ID_FIQ;  //清除中断

   OSTaskResume(0);//取消优先级为0的任务的挂取状态

   AT91C_BASE_AIC->AIC_EOICR = 0; // 写任意值到该寄存器以便退出中断--执行低优先级中断

}

/*
*********************************************************************************************************
*                                          STARTUP TASK
*函数  名: void  AppStartTask (void *p_arg)
*功能说名:第一个任务 用于初始化目标板和建立其它的任务
*创 始 人: 张正锋  embed_tech@126,com
*********************************************************************************************************
*/
static  void  AppStartTask (void *p_arg)
{
    INT8U  i;
    (void)p_arg;

    BSP_Init();                   // 初试化 BSP

#if OS_TASK_STAT_EN > 0
    OSStatInit();                //启动统计任务计算CPU处理能力
#endif
    LED_Off(BSP_LED_ALL);        // 关闭所有LED

    //######################################################################################
    //创建一个新任务SW4_DBGU_Task
    //######################################################################################
    OSTaskCreateExt(SW4_DBGU_Task,                                  //指向任务代码指针
                    (void *)0,                                      //指向一个传递产数的数据块
                    (OS_STK *)&SW4_DBGU_TaskStk[TASK_STK_SIZE-1],   //指向堆栈栈顶
                    TASK_SW4_DBGU_PRIO,                             //任务有优先级(唯一)
                    TASK_SW4_DBGU_PRIO,                             //任务标示(攒不用)
                    (OS_STK *)&SW4_DBGU_TaskStk[0],                //指向栈底
                    TASK_STK_SIZE,                                 //堆栈大小
                    (void *)0,                                     //定义数据指针
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);    //进行任务堆栈检查,清空堆栈
/*

   //#######################################################################################
   //1.IRQ2中断测试程序
   //#######################################################################################
    //open external IRQ interrupt
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB ) ;

     AT91F_PIO_CfgOutput( AT91C_BASE_PIOB,AT91C_PIO_PB4 ) ;
     AT91F_PIO_ClearOutput( AT91C_BASE_PIOB,AT91C_PIO_PB4 ) ;


    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOB,AT91C_PIO_PB0,0);

    // open external IRQ0 interrupt
     AT91F_AIC_ConfigureIt (   AT91C_BASE_AIC,
                               AT91C_ID_IRQ2,
                               IRQ2_INTERRUPT_LEVEL,
                               AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE,//外部  负边触发
                               at91_IRQ2_handler);
     //打开IRQ0中断
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ2);

    //#######################################################################################
    //2.FIQ 中断测试程序
    //#######################################################################################
     // open  FIQ interrupt

      AT91F_PIO_CfgPeriph(AT91C_BASE_PIOB,AT91C_PIO_PB8,0);

      AT91F_AIC_ConfigureIt (   AT91C_BASE_AIC,
                                AT91C_ID_FIQ,
                                FIQ_INTERRUPT_LEVEL,
                                AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE, //外部  负边触发
                                FIQ_init_handler);
      AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_FIQ);

*/
    while (TRUE) {  //任务体 进入一个无限循环
      for (i = 1; i <= 4; i++) {
           LED_On(i);
            OSTimeDlyHMSM(0, 0, 0, 50);
            LED_Off(i);
           }
      for (i = 1; i <= 4; i++) {
            LED_On(5 - i);
            OSTimeDlyHMSM(0, 0, 0, 50);
            LED_Off(5 - i);
           }

       }

}

/*
*********************************************************************************************************
*                                          SW4_DBGU_Task
*函数  名: void SW4_DBGU_Task(void *p_arg)
*功能说名: 按键和DBGU测试任务
*创 始 人: 张正锋  embed_tech@126,com
*********************************************************************************************************
*/

static void SW4_DBGU_Task(void *p_arg)
  {
      (void)p_arg;
       AT91F_DBGU_Init();

       AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB ) ;
    //配置SW_MASK为输入PIO
       AT91F_PIO_CfgInput( AT91C_BASE_PIOB, AT91C_PIO_PB1 ) ;
    //使能SW_MASK的上拉电阻
       AT91F_PIO_CfgPullup(AT91C_BASE_PIOB,  AT91C_PIO_PB1 );
    //使能SW_MASK的输入滤波
       AT91F_PIO_IsInputFilterSet(AT91C_BASE_PIOB, AT91C_PIO_PB1 );

    //每个任务都必须是一个无限循环
     while (TRUE) {
     if ((AT91F_PIO_GetInput(AT91C_BASE_PIOB) &AT91C_PIO_PB1  ) == 0 )        //检查是否按键1按下
      {
       OSTimeDlyHMSM(0, 0, 0, 2); //延时去抖
      }	
     if ((AT91F_PIO_GetInput(AT91C_BASE_PIOB) &AT91C_PIO_PB1 ) == 0 )        //检查是否按键1按下
      {
        while((AT91F_PIO_GetInput(AT91C_BASE_PIOB) & AT91C_PIO_PB1  ) == 0 )
        {;} //等待按键1释放

      #if OS_CRITICAL_METHOD == 3     //保护联界资源
        OS_CPU_SR  cpu_sr;
        #endif
        OS_ENTER_CRITICAL();           //关中断  cpu_sr = OS_CPU_SaveSR();
       //打印输出信息

	int i;
	for(i=0;i<3;i++)
	{  	
   		display16x16(1,i,hanzi4[i]);
          wait_push();wait_push();wait_push();wait_push();

	}
      	AT91F_DBGU_Printk("\n\r                   ********************************");
	AT91F_DBGU_Printk("\n\r                  *********************************");
	AT91F_DBGU_Printk("\n\r");
	AT91F_DBGU_Printk("\n\r                *******   *******   *******   ");
	AT91F_DBGU_Printk("\n\r                     *         *    *         ");
	AT91F_DBGU_Printk("\n\r                    *         *     *         ");
	AT91F_DBGU_Printk("\n\r                   *         *      *         ");
	AT91F_DBGU_Printk("\n\r                  *         *       ******    ");
	AT91F_DBGU_Printk("\n\r                 *         *        *         ");
	AT91F_DBGU_Printk("\n\r                *         *         *         ");
        AT91F_DBGU_Printk("\n\r               *******   *******    *         ");
	AT91F_DBGU_Printk("\n\r");
	AT91F_DBGU_Printk("\n\r         **************************************");
	AT91F_DBGU_Printk("\n\r         **************************************");
	AT91F_DBGU_Printk("\n\r");
	AT91F_DBGU_Printk("\n\r                e-mail:embed_tech@126.com ");
	AT91F_DBGU_Printk("\n\r                MSN:zhangzhengfeng2008@hotmail.com");
	AT91F_DBGU_Printk("\n\r                QQ:398426553 ");
	AT91F_DBGU_Printk("\n\r");

       OS_EXIT_CRITICAL();     //开中断

       }
      //延时让系统执行其它的任务
      OSTimeDlyHMSM(0, 0, 0, 100);
     }
 }


⌨️ 快捷键说明

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