Chinaunix首页 | 论坛 | 博客
  • 博客访问: 594538
  • 博文数量: 119
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1583
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 09:18
文章分类

全部博文(119)

文章存档

2011年(3)

2010年(21)

2009年(44)

2008年(51)

我的朋友

分类:

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();
}
阅读(3581) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~