?? main.c
字號(hào):
#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_EVENT *UART0_SEM ; //UART 0信號(hào)量
OS_EVENT *Key_Mbox ; //按鍵消息郵箱
OS_EVENT *OK_Mbox; //按鍵消息郵箱
/******************************************************************************
【功能說(shuō)明】主任務(wù),在本任務(wù)中啟動(dòng)系統(tǒng)定時(shí)器并創(chuàng)建其他任務(wù)
******************************************************************************/
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 ) ;
for( ; ; )
{
OSTimeDly(2000);
OSSemPend(UART0_SEM, 0, &err) ; //掛起當(dāng)前任務(wù)直至其他任務(wù)或中斷置起信號(hào)量
Uart_Printf( "++++++++++++++++++++++++++++++++++++++" ) ;
Uart_Printf( "OSCPUUsage = %d%% \n", OSCPUUsage ) ;
OSSemPost(UART0_SEM) ; //置起指定的信號(hào)量
}
}
/******************************************************************************
【功能說(shuō)明】本任務(wù)使LED來(lái)回閃爍
******************************************************************************/
void Task_LED( void *Id )
{
for(;;)
{
Led_Set( 0x08 ) ; //
OSTimeDly( 100 ); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
Led_Set( 0x04 ) ; //
OSTimeDly( 100 ); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
Led_Set( 0x02 ) ; //
OSTimeDly( 100 ); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
Led_Set( 0x01 ) ; //
OSTimeDly( 100 ); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
Led_Set( 0x00 ) ; //
OSTimeDly( 30 ); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
}
}
/******************************************************************************
【功能說(shuō)明】蜂鳴器定時(shí)發(fā)生任務(wù)
******************************************************************************/
void Task_Beep( void *Id )
{
U8 err ;
U16 m ;
for( ; ; )
{
for( m = 0; m < 200; m++ )
{
Beep( ON ) ;
OSTimeDly(1); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
Beep( OFF ) ;
OSTimeDly(1); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
}
OSTimeDly(1500); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
//OSSchedLock() ; //停止任務(wù)調(diào)度
OSSemPend(UART0_SEM, 0, &err) ; //掛起當(dāng)前任務(wù)直至其他任務(wù)或中斷置起信號(hào)量
Uart_Printf( "Task Beep is running!\n" ) ;
OSSemPost(UART0_SEM) ; //置起指定的信號(hào)量
//OSSchedUnlock() ; //恢復(fù)任務(wù)調(diào)度
}
}
/******************************************************************************
【功能說(shuō)明】按鍵掃描的任務(wù),因啟用了中斷,本任務(wù)棄置不用
******************************************************************************/
void Task_KeyScan( void *Id )
{
U8 key ;
U8 err ;
rPCONG = rPCONG &0x00ff ; //PG4567 is input
for( ; ; )
{
if( (rPDATG&0xe0)!= 0xe0 ) //有鍵按下
{
OSTimeDly(15); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
if( (rPDATG&0xe0)!= 0xe0 ) //鍵仍然按下
{
switch (rPDATG&0xe0)
{
case 0xc0 : OSMboxPost(Key_Mbox, (void *)4); break ;
case 0xa0 : OSMboxPost( OK_Mbox, (void *)6); break ;
case 0x60 : OSMboxPost(Key_Mbox, (void *)7); break ;
default : key = 0 ;
}
}
OSSemPend(UART0_SEM, 0, &err) ; //掛起當(dāng)前任務(wù)直至其他任務(wù)或中斷置起信號(hào)量
//if( key == 0 )
//{
Uart_Printf( "\tkey is pressed , " ) ;
Uart_Printf( "rPDATG = 0x%02x\n", (rPDATG&0xe0) ) ;
//}
OSSemPost(UART0_SEM) ; //置起指定的信號(hào)量
while( (rPDATG&0xe0)!= 0xe0 ) //鍵仍然按下
OSTimeDly(20); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
}
OSTimeDly(20); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
}
}
/******************************************************************************
【功能說(shuō)明】本任務(wù)顯示系統(tǒng)當(dāng)前時(shí)間
*****************************************************************************/
void Task_Rtc_Disp( void *Id )
{
INT8U err ;
INT8U m ;
STRU_SYS_TIME c_SysTime ;
for( ; ; )
{
OSTimeDly(500); //將任務(wù)延時(shí)若干時(shí)鐘節(jié)拍
OSSchedLock() ; //停止任務(wù)調(diào)度
c_SysTime = Get_Time() ;
OSSchedUnlock() ; //恢復(fù)任務(wù)調(diào)度
if ( m != c_SysTime.ucSecond )
{
OSSemPend(UART0_SEM, 0, &err) ; //掛起當(dāng)前任務(wù)直至其他任務(wù)或中斷置起信號(hào)量
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) ; //置起指定的信號(hào)量
m = c_SysTime.ucSecond ;
}
}
}
/******************************************************************************
【功能說(shuō)明】系統(tǒng)主函數(shù)
******************************************************************************/
void Main(void)
{
U16 ver ;
ARMTargetInit(); //目標(biāo)板初始化
Uart_Printf("\n\nTarget Initing\n");
Uart_Printf("\n\n注意由于本程序使用了中斷,所以必須將本項(xiàng)目的目標(biāo)代碼燒寫入Flash的0地址\n");
Uart_Printf("這樣Flash中才有中斷向量,不過(guò)只需要燒入一次就行了,以后JTAG調(diào)試或網(wǎng)口下載運(yùn)行本程序就沒有問(wèn)題了\n");
Uart_Printf("可以使用netload或者是comload下載本目標(biāo)代碼到SDRAM,然后用Prog 0燒寫代碼到Flash(不覆蓋0地址跳轉(zhuǎn)指令)\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);
//創(chuàng)建信號(hào)量
UART0_SEM = OSSemCreate( 1 ) ; //UART 0 信號(hào)量
//創(chuàng)建消息郵箱
Key_Mbox = OSMboxCreate( (void *)0 );
//創(chuàng)建信號(hào)量
OK_Mbox = OSMboxCreate((void *)0);
//創(chuàng)建主任務(wù)
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 */
}
//*****************************************************************************
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -