这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » UCOSII,ARM,LPC2000 UCOSII与ARM(LPC2000)

共2条 1/1 1 跳转至

UCOSII,ARM,LPC2000 UCOSII与ARM(LPC2000)

院士
2006-09-17 18:14:16     打赏
UCOSII,ARM,LPC2000 UCOSII与ARM(LPC2000)



关键词: UCOSII     LPC2000    

院士
2006-12-22 22:43:00     打赏
2楼
UCOSII作为一种优秀的操作系统,广泛被应用!!!且他的代码是公开的,可以作为很好的学习研究的对象!!希望大家都能把自己的心得“讲”出来!! 1: 那还不如交流ucGUI的应用呢ucGUI的代码质量不错,而且可以支持任意os,功能比较完善,最新的版本都支持jpeg了,非常适合中,小型资源 2: 呵呵。。。用周工的魔班。。可以很容易用UCOSII 3: 俺的心得是-想说爱你不容易。堆栈太吃内存了,内存小堆栈深任务多就不要用了。 4: 基于UCOS的UART0、UART1通讯!!!#include "config.h"
#include "stdlib.h"

#define    TaskStkLengh    64            //Define the Task0 stack length 定义用户任务0的堆栈长度

OS_STK    TaskStk [TaskStkLengh];        //Define the Task0 stack 定义用户任务0的堆栈

void     Task0(void *pdata);            //Task0 任务0


/* 定义串口0模式设置数据结构 */
typedef  struct  UartModeA
{  uint8 databA;         // 字长度,5/6/7/8
   uint8 stopbA;         // 停止位,1/2
   uint8 parityA;        // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
}  UARTMODEA;

/* 定义串口1模式设置数据结构 */
typedef  struct  UartModeB
{  uint8 databB;         // 字长度,5/6/7/8
   uint8 stopbB;         // 停止位,1/2
   uint8 parityB;        // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
}  UARTMODEB;

uint8  rcv_bufA[8];               // UART0数据接收缓冲区
uint8  rcv_bufB[8];               // UART1数据接收缓冲区
volatile uint8  rcv_newA;         // 接收新数据标志
volatile uint8  rcv_newB;         // 接收新数据标志
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART0(void)
{
uint8  i;
     
   if( 0x04==(U0IIR&0x0F) ) rcv_newA = 1;// 设置接收到新的数据标志
   for(i=0; i<8; i++)
   { rcv_bufA[i] = U0RBR;                  // 读取FIFO的数据,并清除中断标志
   }
   
   VICVectAddr = 0x00;                  // 中断处理结束
}
/****************************************************************************
* 名称:IRQ_UART1()
* 功能:串口UART1接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART1(void)
{  
uint8  i;
     
   if( 0x04==(U1IIR&0x0F) ) rcv_newB = 1;// 设置接收到新的数据标志
   for(i=0; i<8; i++)
   { rcv_bufB[i] = U1RBR;                  // 读取FIFO的数据,并清除中断标志
   }
   
   VICVectAddr = 0x00;                  // 中断处理结束
}               


/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void  SendByteA(uint8 dataA)
{  
U0THR = dataA;                          // 发送数据
}
/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void  SendByteB(uint8 dataB)
{
U1THR = dataB;                          // 发送数据
}


/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  ISendBufA(void)
{  uint8  i;
  
   for(i=0; i<8; i++) SendByteA(rcv_bufA[i]);
   while( (U0LSR&0x20)==0 );             // 等待数据发送
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  ISendBufB(void)
{  uint8  i;
  
   for(i=0; i<8; i++) SendByteB(rcv_bufB[i]);
   while( (U1LSR&0x20)==0 );             // 等待数据发送
}               
                 
        
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART0_Ini(uint32 baudA, UARTMODEA set)
{  uint32  bakA;
   
   /* 参数过滤 */
   if( (0==baudA)||(baudA>115200) ) return(0);
   if( (set.databA<5)||(set.databA>8) ) return(0);
   if( (0==set.stopbA)||(set.stopbA>2) ) return(0);
   if( set.parityA>4 ) return(0);

   /* 设置串口波特率 */
   U0LCR = 0x80;                        // DLAB位置1
   bakA = (Fpclk>>4)/baudA;
   U0DLM = bakA>>8;
   U0DLL = bakA&0xff;
   
   /* 设置串口模式 */
   bakA = set.databA-5;                   // 设置字长度
   if(2==set.stopbA) bakA |= 0x04;        // 判断是否为2位停止位  
   
   if(0!=set.parityA) {set.parityA = set.parityA-1; bakA |= 0x08;}
   bakA |= set.parityA<<4;                  // 设置奇偶校验
      
   U0LCR = bakA;
   
   return(1);
}
/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART1_Ini(uint32 baudB, UARTMODEB set)
{  uint32  bakB;
   
   /* 参数过滤 */
   if( (0==baudB)||(baudB>115200) ) return(0);
   if( (set.databB<5)||(set.databB>8) ) return(0);
   if( (0==set.stopbB)||(set.stopbB>2) ) return(0);
   if( set.parityB>4 ) return(0);

   /* 设置串口波特率 */
   U1LCR = 0x80;                        // DLAB位置1
   bakB = (Fpclk>>4)/baudB;
   U1DLM = bakB>>8;
   U1DLL = bakB&0xff;
   
   /* 设置串口模式 */
   bakB = set.databB-5;                   // 设置字长度
   if(2==set.stopbB) bakB |= 0x04;        // 判断是否为2位停止位  
   
   if(0!=set.parityB) {set.parityB = set.parityB-1; bakB |= 0x08;}
   bakB |= set.parityB<<4;                  // 设置奇偶校验
      
   U1LCR = bakB;
   
   return(1);
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  
//主函数

        int main (void)
{
    OSInit ();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);        
    OSStart ();
    return 0;                                                            
}
/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

        void Task0    (void *pdata)
{
uint8     rcv_counterA;
uint8     rcv_counterB;   
   
   UARTMODEA  uart0_set;
   UARTMODEB  uart1_set;     
   
   PINSEL0 = 0x00050005;                // 设置I/O连接到UART0
   PINSEL1 = 0x00000000;                
   //*******************************************************************
   rcv_newA = 0;
   uart0_set.databA = 8;                 // 8位数据位
   uart0_set.stopbA = 1;                 // 1位停止位
   uart0_set.parityA = 0;                // 无奇偶校验
   UART0_Ini(115200, uart0_set);        // 初始化串口模式
   
   U0FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
  
   U0IER = 0x01;                        // 允许RBR中断,即接收中断
   //*******************************************************************
   rcv_newB = 0;
   uart1_set.databB = 8;                 // 8位数据位
   uart1_set.stopbB = 1;                 // 1位停止位
   uart1_set.parityB = 0;                // 无奇偶校验
   UART1_Ini(115200, uart1_set);        // 初始化串口模式
  
   U1FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
   
   U1IER = 0x01;                        // 允许RBR中断,即接收中断
   //*******************************************************************
   /* 设置中断允许 */
   VICIntSelect = 0x00000000;           // 设置所有通道为IRQ中断
   VICVectCntl0 = 0x26;                 // UART0中断通道分配到IRQ slot 0,即优先级最高
   VICVectAddr0 = (int)IRQ_UART0;       // 设置UART0向量地址
   VICIntEnable = 0x000006C0;           // 使能UART0中断
   //*******************************************************************
   /* 设置中断允许 */
   VICVectCntl1 = 0x27;                 // UART0中断通道分配到IRQ slot 0,即优先级最高
   VICVectAddr1 = (int)IRQ_UART1;       // 设置UART1向量地址
   while(1)                             // 等待中断
   {
    
    //if(1==rcv_newB)
    if(rcv_newB==1)
     {  
     rcv_newB = 0;
        
        ISendBufB();                     // 将接收到的数据发送回主机
     }
    
     //if(1==rcv_newA)
     if(rcv_newA==1)
     {  
     rcv_newA = 0;
        
        ISendBufA();                     // 将接收到的数据发送回主机
     }
   }
//   return(0);
    
}
   
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/
5: 顶自己顶先!!!!!!!!!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]