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

📄 app.c

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

#include <includes.h>
#include "dbgu.h"
#include "board.h"


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

#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
*********************************************************************************************************
*/
void  main (void)
{
    INT8U  err;

    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();
       //打印输出信息
      	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 + -