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