分类:
2009-03-23 16:35:57
* Includes ------------------------------------------------------------------*/ #include "config.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
//定义 堆栈大小
//#define TASK_STK_SIZE 128
#define TASK_STK_SIZE 128
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
//堆栈定义
INT32U STK_TASK_MAIN[TASK_STK_SIZE]; //主任务
INT32U STK_TASK_LED[TASK_STK_SIZE];
INT32U STK_TASK_LCD[TASK_STK_SIZE];
INT32U STK_TASK_RTC[TASK_STK_SIZE];
INT32U STK_TASK_USART[TASK_STK_SIZE];
INT32U STK_TASK_KEY[TASK_STK_SIZE];
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
//创建一个同步机制
OS_EVENT *sem;
OS_EVENT *KEY;
OS_EVENT *RTC_Read;
OS_EVENT *RTC_Write;
OS_EVENT *Time;
OS_EVENT *Time_write_Lcd;
char display;
INT8U TimeD[]={0x08,0x0C,0x0A,0x03,0x1C,0x00};
void sleep(INT32U cnt)
{
INT32U i = 0;
for(i = 0; i < cnt; i++);
}
/***************************************************************************************
** 函数名称: InitSysTick
** 功能描述: 系统时钟配置函数 ,OS系统运行时钟
** 参 数: None
** 返 回 值: None
** 日 期: 2008年11月27日
****************************************************************************************/
void InitSysTick(void)
{
RCC_ClocksTypeDef rcc_clocks;
INT32U cnts;
//第一种方法产生10ms
/*
//设置重装值为900
SysTick_SetReload(900);
//使能中断
SysTick_ITConfig(ENABLE);
//计数使能
SysTick_CounterCmd(SysTick_Counter_Enable); */
//第二种访法
//得到RCC时钟
RCC_GetClocksFreq(&rcc_clocks);
//设置计数值 72M/100
cnts = (INT32U)rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC;
//将cnts设置成为重装值
SysTick_SetReload(cnts);
//配置系统时钟源为HCLK
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
//计数使能
SysTick_CounterCmd(SysTick_Counter_Enable);
//使能中断
SysTick_ITConfig(ENABLE);
}
void LedTask(void *pd)
{
RTC_Read=OSSemCreate(1); //创建一个信号量
while(1)
{
OSTimeDly(OS_TICKS_PER_SEC);
GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));
OSTimeDly(OS_TICKS_PER_SEC);
OSSemPost(RTC_Read);
}
}
void LCDTask(void *pd)
{
char data[30];
INT8U err;
INT8U *TIME;
u32 TY = 0, TM = 1, TD = 0;
u32 THH = 0, TMM = 0, TSS = 0;
while(1)
{
TIME =(INT8U*)OSMboxPend(Time_write_Lcd,OS_TICKS_PER_SEC*2,&err);
if(err!=OS_TIMEOUT&&err!=OS_ERR_EVENT_TYPE&&err!=OS_ERR_PEND_ISR&&err!=OS_ERR_PEVENT_NULL)
{
lcd_clear ();
TY=TIME[0]+2000;
TM=TIME[1];
TD=TIME[2];
THH=TIME[3];
TMM=TIME[4];
TSS=TIME[5];
sprintf1(data,"Date: %0.4d-%0.2d-%0.2d",TY, TM, TD);
set_cursor(0, 0);
lcd_print (data);
sprintf1(data,"Time: %0.2d:%0.2d:%0.2d",THH, TMM, TSS);
set_cursor(0, 1);
lcd_print (data);
}
OSTimeDly(OS_TICKS_PER_SEC*2);
}
}
void RTC_Task(void *pd)
{
INT8U *data;
INT8U err;
INT8U TTime[6];
Time_write_Lcd=OSMboxCreate(NULL);
while(1)
{
GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));
OSSemPend(RTC_Read,0,&err);
read_RTC(TTime);
OSMboxPost(Time_write_Lcd,TTime);
OSSemPend(RTC_Write,OS_TICKS_PER_SEC,&err);
data =(INT8U*)OSMboxPend(Time,OS_TICKS_PER_SEC,&err);
if(err!=OS_TIMEOUT&&err!=OS_ERR_EVENT_TYPE&&err!=OS_ERR_PEND_ISR&&err!=OS_ERR_PEVENT_NULL)
write_RTC(data);
OSTimeDly(OS_TICKS_PER_SEC*2);
}
}
void usartTask(void *pd)
{
INT8U ch[6]={0x00,},jug=0;
INT8U cn=0;
INT8U err;
INT32U time_cn=0;
OS_CPU_SR cpu_sr;
Time=OSMboxCreate(NULL);
sem=OSSemCreate(1); //创建一个信号量
RTC_Write=OSSemCreate(1); //创建一个信号量
while(1)
{
OS_ENTER_CRITICAL(); // 进入 临界段
time_cn=SystemTime;
UASRT1_Input_Index=0;
OS_EXIT_CRITICAL(); // 退出临界段
OSSemPend(KEY,0,&err);
USART1_PutString("\r\ninput time:");
while((SystemTime-time_cn)<10)
{
if(UASRTI_Process_Output())
{
USART1_PutChar((INT8U*)UASRT1_Input_Buffer,UASRT1_Input_Index);
jug=1;
}
}
USART1_PutString("\r\n");
OSSemPost(sem);
if(jug==1)
{
for(cn=0;cn<6;cn++)
{
ch[cn]=atoh((INT8U*)UASRT1_Input_Buffer+2*cn,2);
}
OSSemPost(RTC_Write);
OSMboxPost(Time,ch);
}
OSTimeDly(OS_TICKS_PER_SEC*2);
}
}
/***************************************************************************************
** 函数名称: KEYTask OS_MBOX_DATA
** 功能描述: 任务3
** 参 数: None
** 返 回 值: None
** 日 期: 2008年11月27日
****************************************************************************************/
void KEYTask(void *pd)
{
INT8U err;
pd=pd;
KEY=OSSemCreate(1);
while(1)
{
OSSemPost(KEY);
OSSemPend(sem,OS_TICKS_PER_SEC,&err);
GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));
OSTimeDly(OS_TICKS_PER_SEC*3);
}
}
/***************************************************************************************
** 函数名称: MainTask
** 功能描述: 主任务
** 参 数: None
** 返 回 值: None
** 日 期: 2008年11月27日
****************************************************************************************/
void MainTask(void *pd)
{
#ifdef DEBUG
debug();
#endif
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
InitSysTick();
TM2_Configuration();
OSStatInit();
lcd_init();
USART1_Initialise();
lcd_clear ();
RTC_init(TimeD);
OSTaskCreate(LedTask, (void *)0,(OS_STK *)&STK_TASK_LED[TASK_STK_SIZE-1], 18);
OSTaskCreate(LCDTask, (void *)0,(OS_STK *)&STK_TASK_LCD[TASK_STK_SIZE-1], 17);
OSTaskCreate(RTC_Task, (void *)0,(OS_STK *)&STK_TASK_RTC[TASK_STK_SIZE-1], 19);
OSTaskCreate(usartTask, (void *)0,(OS_STK *)&STK_TASK_USART[TASK_STK_SIZE-1], 16);
OSTaskCreate(KEYTask, (void *)0,(OS_STK *)&STK_TASK_KEY[TASK_STK_SIZE-1], 15);
while(1)
{
OSTimeDly(100);
OSTaskSuspend(OS_PRIO_SELF); // 启动任务在这里被挂起
//任务可以删除
//OSTaskDel(14);
}
}
/***************************************************************************************
** 函数名称: main
** 功能描述: 主函数
** 参 数: None
** 返 回 值: None
** 日 期: 2008年11月27日
****************************************************************************************/
int main(void)
{
OSInit();
OSTaskCreate(MainTask, (void *)0,(OS_STK *)&STK_TASK_MAIN[TASK_STK_SIZE-1], 14);
OSStart();
} |