⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 ucos2.85在vs2005上模拟环境
💻 C
字号:
#include "includes.h"
#include "ringbuffer.h"

char *filename = "D:\\workspace\\mpeg2dec-0.4.1\\vc++\\zdf.ts";
char *outfile = "D:\\workspace\\audio.ts";
#define RINGBUFFER_SIZE		(1024*1024)
RingBuffer_s	sys_rb;
FILE *fp;


typedef void (*task)(void *p_arg);

#define  TASK_STK_SIZE		5120 

#define  TASK_START_PRIO	10	
#define  Recv_PRIO			11	
#define  Send_PRIO			12	

#define  Demux_PRIO			13	

OS_STK	TaskStartStk[TASK_STK_SIZE];	
OS_STK	RecvStk[TASK_STK_SIZE];	
OS_STK	SendStk[TASK_STK_SIZE];	
OS_STK	DemuxStk[TASK_STK_SIZE];	

RTOS_Mailbox  mail;

struct message
{
	int c;
};

struct message		sys;

static int send_flag = 0;

void  TaskStart (void *pdata)
{   
	int  i;
    char   s[100];

	INT16S key;
    pdata = pdata;	

//    OSStatInit();	

    while (1)
    {

        if (PC_GetKey(&key) == TRUE) {   
            if (key == 0x1B) 
			{                             
                exit(0);  	          
            }
			if(key == 's') send_flag = 1;
			else send_flag = 0;

			printf("get key : %c\n", key);
			
			sys.c = key;

			RTOS_MailboxSend(mail, &sys);
        }

        OSTimeDly(1); 
    }
}

void  send_task (void *pdata)
{   
	int  i;
    
	INT16S key;
    pdata = pdata;	
	printf("send task ...\n");
    while (1)
    {

        sys.c = 'a';

		if(send_flag) RTOS_MailboxSend(mail, &sys);

        OSTimeDly(1); 
    }
}

void  recv_task (void *pdata)
{   
	int  i;
    char   s[100];

	struct message *pmsg = NULL;

	INT16S key;
    pdata = pdata;	

//    OSStatInit();	

    while (1)
    {
		//printf("recv...\n");

        pmsg = (struct message*)RTOS_MailboxWait(mail, true);
		if(pmsg)
		{
			printf("recive a key = %c \n", pmsg->c);
		}
		else printf("no recive message\n");

        OSTimeDly(1); 
    }
}

void ringbuffer_init(RingBuffer_s *rb, int size)
{
	u8 *buf;
	
	buf = (u8*)malloc(size);
    if(!buf) return ;
    	
    printf("ts buffer addr 0x%x\n", buf);
	
	fp = fopen(filename, "rb");
	if(!fp) return;
	
	printf("open file ok..\n");

	//填充缓冲
	if(fread(buf, size, 1, fp))
	{
		rb_fill_init(rb, buf, size);
		rb->fp = fp;
	}
	else 
		rb_init(rb, buf, size);
}

void  demux_task (void *pdata)
{
	int res;
	u8 buff[204];
	int tick;

	ringbuffer_init(&sys_rb, RINGBUFFER_SIZE);

	while(1)
	{
		res = rb_filter(&sys_rb, buff, 204);
		if(res < 0) sys.c = '0';
		else
		//printf("res = %d \n", res);
			sys.c = '1';

		RTOS_MailboxSend(mail, &sys);
		//OSTimeDly(1); 
	}
}

RTOS_Thread create_thread(u8 *thread_name, task func, void *arg, u8 prio, void *stack, u32 size)
{
	u8 err;

	if(OSTaskCreateExt(func, arg, (OS_STK *)((int)stack + size - 1),
//	if(OSTaskCreateExt(func, arg, (OS_STK *)&(((int*)stack)[size-1]),
							prio, prio, 
							(OS_STK *)stack, size,
							(void *)0, 
							OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR) == OS_NO_ERR)
	{
		if(thread_name)
			OSTaskNameSet(prio, thread_name, &err);
		else OSTaskNameSet(prio, "thread ?", &err);

		return (RTOS_Thread) (OSTCBPrioTbl[prio]);
	}
	
	return 0;
}

int init_mail()
{
	mail = RTOS_MailboxCreate(NULL);
}

int main(int argc, char *argv[])
{
    
	OSInit();	
	printf("ucos 2.85 env\n");

	init_mail();
    
	create_thread("main thread", TaskStart, (void *)0, TASK_START_PRIO, TaskStartStk, TASK_STK_SIZE);
	create_thread("recv thread", recv_task, (void *)0, Recv_PRIO, RecvStk, TASK_STK_SIZE);
	create_thread("send thread", send_task, (void *)0, Send_PRIO, SendStk, TASK_STK_SIZE);
	create_thread("demux thread", demux_task, (void *)0, Demux_PRIO, DemuxStk, TASK_STK_SIZE);

    OSStart();		


    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -