📄 main.c
字号:
/****************************************************************************
【文 件 名 称】main.c
【功 能 描 述】三星S3C44B0X板 uC/OS-II 程序代码
【程 序 版 本】1.0
【创建人及创建日期】蓝海微芯//2003-12-19 10:57
【修改人及修改日期】蓝海微芯//2004-6-6 23:27
****************************************************************************/
#include "def.h"
#include "option.h"
#include "44blib.h"
#include "44b.h"
#include "rtc.h"
#include "os_cpu.h"
#include "ucos_ii.h" /* uC/OS interface */
#include "target.h"
//***************************************************************************
/* allocate memory for tasks' stacks */
#ifdef SEMIHOSTED
#define STACKSIZE (SEMIHOSTED_STACK_NEEDS+64)
#else
//#define TASK_STACK_SIZE ( 256+64 )
#define TASK_STACK_SIZE ( 512+64 )
//#define TASK_STACK_SIZE ( 8192+64 )
#endif
//***************************************************************************
OS_STK Main_Task_Stack[TASK_STACK_SIZE];
void Main_Task( void *Id ) ;
#define Main_Task_PRIO 4
OS_STK Task_Beep_Stack[TASK_STACK_SIZE];
void Task_Beep( void *Id ) ;
#define Task_Beep_PRIO 5
OS_STK Task_LED_Stack[TASK_STACK_SIZE];
void Task_LED( void *Id ) ;
#define Task_LED_PRIO 6
OS_STK Task_KeyScan_Stack[TASK_STACK_SIZE];
void Task_KeyScan( void *Id ) ;
#define Task_KeyScan_PRIO 7
OS_STK Task_Rtc_Disp_Stack[TASK_STACK_SIZE*2];
void Task_Rtc_Disp( void *Id ) ;
#define Task_Rtc_Disp_PRIO 9
OS_STK Task_User1_Stack[TASK_STACK_SIZE*2];
void Task_User1( void *Id ) ;
#define Task_User1_PRIO 10
OS_EVENT *UART0_SEM ; //UART 0信号量
OS_EVENT *Key_Mbox ; //按键消息邮箱
OS_EVENT *OK_Mbox; //按键消息邮箱
//user define
#define SET_LED_OUT rPCONE=0x5569
#define SET_D1_ON rPDATE&=0xFFFFFFFE
#define SET_D1_OFF rPDATE|=0x00000001
#define SET_D4_ON rPDATE&=0xFFFFFFF7
#define SET_D4_OFF rPDATE|=0x00000008
#define SET_D5_ON rPDATE&=0xFFFFFFEF
#define SET_D5_OFF rPDATE|=0x00000010
#define SET_D6_ON rPDATE&=0xFFFFFFDF
#define SET_D6_OFF rPDATE|=0x00000020
#define SET_D7_ON rPDATE&=0xFFFFFFBF
#define SET_D7_OFF rPDATE|=0x00000040
#define SET_D8_ON rPDATE&=0xFFFFFF7F
#define SET_D8_OFF rPDATE|=0x00000080
//user define
/******************************************************************************
【功能说明】主任务,在本任务中启动系统定时器并创建其他任务
******************************************************************************/
void Main_Task( void *Id )
{
U8 err ;
ARMStartTimer();
OSStatInit();
// OSTaskCreate( Task_Beep, (void *)0, (OS_STK *)&Task_Beep_Stack[TASK_STACK_SIZE-1], Task_Beep_PRIO ) ;
OSTaskCreate( Task_KeyScan, (void *)0, (OS_STK *)&Task_KeyScan_Stack[TASK_STACK_SIZE-1], Task_KeyScan_PRIO ) ;
// OSTaskCreate( Task_LED, (void *)0, (OS_STK *)&Task_LED_Stack[TASK_STACK_SIZE-1], Task_LED_PRIO ) ;
OSTaskCreate( Task_Rtc_Disp, (void *)0, (OS_STK *)&Task_Rtc_Disp_Stack[TASK_STACK_SIZE*2-1], Task_Rtc_Disp_PRIO ) ;
OSTaskCreate( Task_User1, (void *)0, (OS_STK *)&Task_User1_Stack[TASK_STACK_SIZE*2-1], Task_User1_PRIO) ;
for( ; ; )
{
OSTimeDly(10000);
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
// Uart_Printf( "++++++++++++++++++++++++++++++++++++++" ) ;
Uart_Printf( "OSCPUUsage = %d%% \n", OSCPUUsage ) ;
OSSemPost(UART0_SEM) ; //置起指定的信号量
}
}
/******************************************************************************
【功能说明】用户自定义任务,实验用
******************************************************************************/
void Task_User1( void *Id )
{
U8 err ;
U8 i;
i=0;
rPCONE=0x5569;
rPDATE=0x0000;
SET_D1_OFF;
SET_D4_OFF;
SET_D5_OFF;
SET_D6_OFF;
SET_D7_OFF;
SET_D8_OFF;
for(;;)
{
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
// Uart_Printf( "i=%d,Task_User1_Running!\n",i++ ) ;
OSSemPost(UART0_SEM) ; //置起指定的信号量
SET_D8_ON;
OSTimeDly( OS_TICKS_PER_SEC/2); //将任务延时若干时钟节拍
SET_D8_OFF;
OSTimeDly( OS_TICKS_PER_SEC/2 );
}
}
/******************************************************************************
【功能说明】本任务使LED来回闪烁
******************************************************************************/
void Task_LED( void *Id )
{
for(;;)
{
Led_Set( 0x08 ) ; //
OSTimeDly( 100 ); //将任务延时若干时钟节拍
Led_Set( 0x04 ) ; //
OSTimeDly( 100 ); //将任务延时若干时钟节拍
Led_Set( 0x02 ) ; //
OSTimeDly( 100 ); //将任务延时若干时钟节拍
Led_Set( 0x01 ) ; //
OSTimeDly( 100 ); //将任务延时若干时钟节拍
Led_Set( 0x00 ) ; //
OSTimeDly( 30 ); //将任务延时若干时钟节拍
}
}
/******************************************************************************
【功能说明】蜂鸣器定时发生任务
******************************************************************************/
void Task_Beep( void *Id )
{
U8 err ;
U16 m ;
for( ; ; )
{
for( m = 0; m < 200; m++ )
{
Beep( ON ) ;
OSTimeDly(1); //将任务延时若干时钟节拍
Beep( OFF ) ;
OSTimeDly(1); //将任务延时若干时钟节拍
}
OSTimeDly(1500); //将任务延时若干时钟节拍
//OSSchedLock() ; //停止任务调度
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
Uart_Printf( "Task Beep is running!\n" ) ;
OSSemPost(UART0_SEM) ; //置起指定的信号量
//OSSchedUnlock() ; //恢复任务调度
}
}
/******************************************************************************
【功能说明】按键扫描的任务,因启用了中断,本任务弃置不用
******************************************************************************/
void Task_KeyScan( void *Id )
{
U8 key ;
U8 err ;
Uart_Printf("Task_KeyScan Running!...\n");
// rPCONG = rPCONG &0xf0f0 ; //PG0156 is input
//test
rPCONG = rPCONG &0xFFFFC3F0; //
rPUPG = rPUPG &0xff ;
for( ; ; )
{
if( (rPDATG&0x63)!= 0x63 ) //有键按下
{
OSTimeDly(15); //将任务延时若干时钟节拍
if( (rPDATG&0x63)!= 0x63 ) //键仍然按下
{
switch (rPDATG&0x63)
{
case 0x23 :
key = 4 ;
break;
case 0x43 :
key = 3 ;
break;
case 0x61 :
key = 2 ;
break;
case 0x62 :
key = 1 ;
break;
default :
key = 0 ;
break;
// case 0x0e : OSMboxPost(Key_Mbox, (void *)4); break ;
// case 0x0d : OSMboxPost( OK_Mbox, (void *)6); break ;
// case 0xdf : OSMboxPost(Key_Mbox, (void *)7); break ;
// default : key = 0 ;
}
}
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
//if( key == 0 )
//{
Uart_Printf( "\tkey is pressed , " ) ;
Uart_Printf( "\tKey=%d\n",key );
// Uart_Printf( "rPDATG = 0x%02x\n", (rPDATG&0xe0) ) ;
//}
OSSemPost(UART0_SEM) ; //置起指定的信号量
while( (rPDATG&0x63)!= 0x63 ) //键仍然按下
OSTimeDly(20); //将任务延时若干时钟节拍
}
OSTimeDly(20); //将任务延时若干时钟节拍
}
}
/******************************************************************************
【功能说明】本任务显示系统当前时间
*****************************************************************************/
void Task_Rtc_Disp( void *Id )
{
INT8U err ;
INT8U nop;
INT8U m ;
STRU_SYS_TIME c_SysTime ;
STRU_SYS_TIME Get_SysTime;
//test for RTC init
nop=nop;
nop=nop;
// rRTCCON |= (1<<3); //RTC clock count reset
nop=nop;
nop=nop;
rRTCCON=0x1;
Get_SysTime.ucYear = rBCDYEAR;
Get_SysTime.ucMonth = rBCDMON;
Get_SysTime.ucDay = rBCDDAY;
Get_SysTime.ucHour = rBCDHOUR;
Get_SysTime.ucMinute= rBCDMIN;
Get_SysTime.ucSecond= rBCDSEC;
rBCDSEC = 0x11;
rBCDMIN = 0x25;
rBCDHOUR= 0x23;
rBCDDAY = 0x04;
rBCDMON = 0x04;
rBCDYEAR= 0x07;
rRTCCON=0x0;
nop=nop;
nop=nop;
//end of test for RTC init
for( ; ; )
{
OSTimeDly(500); //将任务延时若干时钟节拍
//test
//end of test
OSSchedLock() ; //停止任务调度
c_SysTime = Get_Time() ;
OSSchedUnlock() ; //恢复任务调度
// if ( m != c_SysTime.ucSecond )
{
OSSemPend(UART0_SEM, 0, &err) ; //挂起当前任务直至其他任务或中断置起信号量
Uart_Printf( "The Time is %2x", c_SysTime.ucHour ) ;
Uart_Printf( ":%02x", c_SysTime.ucMinute ) ;
Uart_Printf( ":%02x", c_SysTime.ucSecond ) ;
Uart_Printf( "--%02x", c_SysTime.ucDay ) ;
Uart_Printf( "/%02x", c_SysTime.ucMonth ) ;
Uart_Printf( "/%4x\n", (0x2000 + c_SysTime.ucYear) ) ;
OSSemPost(UART0_SEM) ; //置起指定的信号量
m = c_SysTime.ucSecond ;
}
}
}
/******************************************************************************
【功能说明】系统主函数
******************************************************************************/
void Main(void)
{
U16 ver ;
ARMTargetInit(); //目标板初始化
Uart_Printf("\n\nTarget Reset\n");
Uart_Printf("Target Initing\n");
Uart_Printf("\n\n注意由于本程序使用了中断,所以必须将本项目的目标代码烧写入Flash的0地址\n");
Uart_Printf("这样Flash中才有中断向量,不过只需要烧入一次就行了,以后JTAG调试或网口下载运行本程序就没有问题了\n");
Uart_Printf("可以使用netload或者是comload下载本目标代码到SDRAM,然后用Prog 0烧写代码到Flash(不覆盖0地址跳转指令)\n\n");
OSInit(); //uCOS-II初始化
Uart_Printf("OS Initing\n");
OSTimeSet(0);
Uart_Printf("OS Time setting\n");
ver = OSVersion();
Uart_Printf("OS Version: %d\n",ver);
//创建信号量
UART0_SEM = OSSemCreate( 1 ) ; //UART 0 信号量
//创建消息邮箱
Key_Mbox = OSMboxCreate( (void *)0 );
//创建信号量
OK_Mbox = OSMboxCreate((void *)0);
//创建主任务
OSTaskCreate( Main_Task, (void *)0, (OS_STK *)&Main_Task_Stack[TASK_STACK_SIZE-1], Main_Task_PRIO ) ;
ARMTargetStart(); //start the ARM target running
Uart_Printf("OS Starting\n\n");
OSStart(); //Start uCOS-II
/* never reached */
}
//*****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -