|
楼主 |
发表于 2009-8-31 10:33:01
|
显示全部楼层
#define Test1_GLOBALS
#include "D:\d\kaifabu\iccavr\ucos2_application\INCLUDES.H"
#include <iom128v.h>
#include <macros.h>
//******************************************************************************
// Constants
#define TaskStartPrio 10
// Task-Prioritaeten
#define UART_SENDENABLE() { UCSR0B&=~(1<<RXEN0);UCSR0B&=~(1<<RXCIE0); UCSR0B|=(1<<TXEN0); UCSR0B|=(1<<TXCIE0); UCSR0B|=(1<<UDRIE0);PORTE|=(1<<2); }
#define UART_RECEIVERENABLE() { UCSR0B&=~(1<<TXEN0);UCSR0B|=(1<<RXEN0);UCSR0B|=(1<<RXCIE0); PORTE&=~(1<<2); }
OS_EVENT *Pevent_SerialSend; //The serial send semp
unsigned static char UartSend_ToHGTemp [9];
unsigned static char UartSend_ToHG1 [9];
//unsigned volatile static char *Uart_send_ptr_2 = UartSend_ToHG1 ;
unsigned static char UART_i=0x00;
INT8U Perr;
INT8U Ptemp;
INT8U err;
#define TXBUFSIZE 54
unsigned static char BUF_Serial_ctr ;
typedef struct
{
unsigned char Ring[TXBUFSIZE];
unsigned char tail; // index to last read entry
unsigned char head; // index to first valid entry
} TxBufType;
static volatile TxBufType TxBuf={{0}};
//.................................................................
//----------------------------------------------------------
// returns 0 if characters are present in ringbuffer
// returns 1 if buffer is empty
// ---------------------------------------------------------
unsigned char TxBufEmpty(void)
{
unsigned char retval;
// ES = 0;
OS_ENTER_CRITICAL();
retval = (TxBuf.head == TxBuf.tail) ? 1 : 0;
// ES = 1;
OS_EXIT_CRITICAL() ;
return(retval);
}
//.............................................................
//----------------------------------------------------------
// adds next character to send ringbuffer
// if buffer is full, the character is lost
//----------------------------------------------------------
static void TxBufAddChar(unsigned char c)
{
unsigned char pos = TxBuf.head;
TxBuf.head++;
if (TxBuf.head >= TXBUFSIZE) TxBuf.head = 0;
if (TxBuf.head == TxBuf.tail) // full?
{
TxBuf.head = pos;
}
else
{
TxBuf.Ring[TxBuf.head]=c;
}
}
// ----------------------------------------------------------------
// returns next character from Send Ringbuffer
// if buffer is empty, the last send character is returned
// ----------------------------------------------------------------
unsigned char TxBufGetChar(void)
{
unsigned volatile char c;
//ES = 0;
OS_ENTER_CRITICAL();
c = 0x55;
if(TxBuf.head == TxBuf.tail) return c; // empty --> don't change indices, just return last character
TxBuf.tail++;
if (TxBuf.tail >= TXBUFSIZE) TxBuf.tail = 0;
c = TxBuf.Ring[TxBuf.tail];
// ES = 1;
OS_EXIT_CRITICAL() ;
return c;
}
//.................................................................
//UART0 Init process
//....................................................................
void uart0_init(void)
{
OS_ENTER_CRITICAL();
UCSR0B = 0x00; //disable while setting baud rate
UBRR0H=0;
UBRR0L=51; //设置波特率为9600b
UCSR0C=0x06;
//设置桢格式,8个数据位,一个停止位
// UCSR0B|=(1<<UCSZ02); //9 bit data frame
/* 接收器使能,接收结束中断使能,*/
UCSR0B|=(1<<RXEN0);
OS_EXIT_CRITICAL() ;
}
//*****************************************************************************
// Variablen
OS_STK Task1Stack[OS_TASK_DEF_STK_SIZE]; // startup task stack
OS_STK Task2Stack[OS_TASK_DEF_STK_SIZE];
//*****************************************************************************
// Prototypes
void Task1(void *data);
void uart0_init(void);
void uart_collect (void)
{
unsigned volatile char *UartToHG_ptr_1=0x00;
unsigned volatile char *UartToHG_ptr_k=UartSend_ToHG1;
OS_ENTER_CRITICAL();
UartToHG_ptr_1=UartToHG_ptr_k;
*UartToHG_ptr_k=0x23;
UartToHG_ptr_k++;
*UartToHG_ptr_k=0x01;
UartToHG_ptr_k++;
*UartToHG_ptr_k=0x03 ;
UartToHG_ptr_k++;
*UartToHG_ptr_k=0x00 ;
UartToHG_ptr_k++;
*UartToHG_ptr_k=0x01 ;
UartToHG_ptr_k++;
*UartToHG_ptr_k=0x00 ;
UartToHG_ptr_k++;
*UartToHG_ptr_k=0x03 ;
UartToHG_ptr_k++;
OS_EXIT_CRITICAL() ;
}
void main(void)
{
unsigned char i;
OSInit(); // OS init
OSTaskCreate(Task1,
(void *)(0),
&Task1Stack[OS_TASK_DEF_STK_SIZE-1],
TaskStartPrio);
Pevent_SerialSend= OSSemCreate (1);
uart0_init();
TC2_Init();
uart_collect ();
OSStart(); // start multitasking
}
//*****************************************************************************
void Task1(void *data)
{
// char c = (int)data;
unsigned char i;
// unsigned char temp;
// Timer/Counter#2 Overflow and Comp init
unsigned char *Uart_send_ptr = UartSend_ToHG1 ;
for (;;)
{
data= data;
//OS_ENTER_CRITICAL();
OSSemPend(Pevent_SerialSend,0,&err);
for (i=0x07;i>0;i--)
{
TxBufAddChar( *Uart_send_ptr);
Uart_send_ptr++;
}
if ( Uart_send_ptr>=UartSend_ToHG1+0x06)
{Uart_send_ptr=UartSend_ToHG1;}
UDR0 =TxBufGetChar();
UCSR0B|=(1<<TXEN0);
PORTE|=(1<<2);
OSTimeDly (15);
}
// OS_EXIT_CRITICAL() ;
}
现在我编了一个信号量和缓冲区的,为什么我的程序会不停的发,Pevent_SerialSend= OSSemCreate (1); 我建立的信号量的初值是
1,当调用OSSemPend(Pevent_SerialSend,0,&err); 时,信号量减一,下次进行任务调度时应该任务挂起呀?也就是发一次就停呀,可现在会不停的发,当我把Pevent_SerialSend= OSSemCreate (0); 初始化为0时正确,一次也不发。恳求高手指点,谢谢。 |
|