📄 app.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 + -