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

📄 test.c

📁 基于三星44B0芯片的移植操作系统
💻 C
字号:
/**************************************************************************
*                                                                         *
*   PROJECT     : ARM port for UCOS-II                                    *
*                                                                         *
*   MODULE      : EX1.c                                                   *
*                                                                         *
*   AUTHOR      : Michael Anburaj                                         *
*                 URL  : http://geocities.com/michaelanburaj/             *
*                 EMAIL: michaelanburaj@hotmail.com                       *
*                                                                         *
*   PROCESSOR   : Any processor                                           *
*                                                                         *
*   IDE         : Any IDE                                                 *
*                                                                         *
*   DESCRIPTION :                                                         *
*   This is a sample code to test UCOS-II.                                *
*                                                                         *
**************************************************************************/


#include "includes.h"
#include "Rtl8019.h"
#include "skbuff.h"

/* ********************************************************************* */
/* Global definitions */

/* ********************************************************************* */
/* File local definitions */
extern int FRMWRK_vStartTicker(U32);
extern struct sk_buff* sk_buff_alloc(void);
extern int buff_mem_alloc(struct sk_buff* sk_buff_used);
extern void sk_buff_put(struct sk_buff* sk_buff_new);
extern void sk_buff_free(struct sk_buff* sk_buff_unused);
extern struct sk_buff* sk_buff_get(void);
extern void net_handle(struct sk_buff* sk_buff_handle);
extern void demo_printf(void);
extern void tftp_main(unsigned long ip, unsigned long addr, int method);
extern void tftp_init(unsigned long ip, unsigned long addr, int method);

extern void SetRegPage(U8 PageIdx);
extern void skb_headerinit(struct sk_buff *skb);
extern int s3c44b0_eth_rcv(unsigned char *data, unsigned int *len);

extern void	sk_buff_freelist_scan(void);
extern void	sk_buff_bufflist_scan(void);

#define  TASK_STK_SIZE 4096                      /* Size of each task's stacks (# of WORDs) */
#define  NO_TASKS           10                  /* Number of identical tasks */
#define	DFT_DOWNLOAD_ADDR	0xc058000
unsigned long IP_ADDRESS = 0xc0a80064;//0xc0a80064 0xac128664

OS_STK   TaskStk[NO_TASKS][TASK_STK_SIZE];      /* Tasks stacks */
OS_STK   TaskStartStk[TASK_STK_SIZE];
char     TaskData[NO_TASKS];                    /* Parameters to pass to each task */
//extern int total_packet;
extern struct sk_buff skbuff[BUFF_LEN];
extern U8 bnry;
extern U8 curr;
extern struct sk_buff* sk_buff_freelist;//sk_buff空闲队列
extern struct sk_buff* header,* tail;//sk_buff接收队列
//extern int read_p,write_p,begin,end;
//extern unsigned char* packet_buff[20000];
U8 bnry_temp;
unsigned long k;

/* ********************************************************************* */

void tick_hook(void)
{
	rI_ISPC = (unsigned int)1 << 13;
}

void rtl_hook(void)
{
	int result;
	unsigned long time,time_new;
	unsigned char T_BNRY,T_CURR,T_BUFF;
	struct sk_buff* sk_buff_new;
	struct sk_buff* sk_buff_handle;
	
	Uart_Printf("rtl_hook is running\n!");
	rI_ISPC = (unsigned int)1 << 24;
	if(*((volatile U8 *)(ISR))&1){	//接收中断触发
		time = (unsigned long)OSTime;
		//Uart_Printf("time->%x",time);
		//SetRegPage(0);
		//Uart_Printf("rtl_hook中BNRY----%x\n", *((volatile unsigned char *)(BNRY)));
		//SetRegPage(1);
		//Uart_Printf("rtl_hook中CURR----%x\n", *((volatile unsigned char *)(CURR)));
		SetRegPage(0);		
		//清8019IMR接收中断位,屏蔽8019中断
		*((volatile U8 *)(IMR)) = (U8)(0x00);
		Receive_Again:
		*((volatile U8 *)(ISR)) = (U8)(0xff);	//清除中断标志
		//关中断
		//--OS_ENTER_CRITICAL();		
		leave:
		sk_buff_new = (struct sk_buff*)sk_buff_alloc();
		if(!sk_buff_new)
		{
			Uart_Printf("sk_buff空闲链表为空!\n");
			goto Send_Packet;
		}
		Uart_Printf("sk_buff_alloc OK!\n");
		/*if(!buff_mem_alloc(sk_buff_new))
		{
			Uart_Printf("数据包存储内存空间不够!\n");
			sk_buff_free(sk_buff_new);
			goto Send_Packet;
		}
		Uart_Printf("buff_mem_alloc OK!\n");*/
		skb_headerinit(sk_buff_new);
		result = s3c44b0_eth_rcv(sk_buff_new->data,&(sk_buff_new->len));
		Uart_Printf("result->%x\n",result);
		Uart_Printf("s3c44b0_eth_rcv OK!\n");
		if(!result)
		{
			sk_buff_put(sk_buff_new);
			/*write_p = write_p + sk_buff_new->len + 20;
			Uart_Printf("write_p->%x\n",write_p);
			write_p = write_p>=20000?write_p-20000:write_p;*/
		}
		else
		{
			sk_buff_free(sk_buff_new);
			//可能需要重启NIC
		}
		Uart_Printf("bnry2->%x\n",bnry);
		Uart_Printf("curr2->%x\n",curr);
		bnry_temp = bnry+1;
		if(bnry_temp==0x80)
			bnry_temp=0x4c;
		if(bnry_temp!=curr)
			goto leave;
		//Uart_Printf("ISR->%x\n",*((volatile U8 *)(ISR)));
		//SetRegPage(2);
		//Uart_Printf("IMR->%x\n",*((volatile U8 *)(IMR)));
		//SetRegPage(0);
		//开中断
		Send_Packet:
		//--OS_EXIT_CRITICAL();
		//底半处理,从接收队列中取出数据包处理
		//数据包全部处理完或一个时间片用完退出中断
		time_new = (unsigned long)OSTime;
		//Uart_Printf("time_new->%x",time_new);
		Uart_Printf("底半处理 OK!\n");
		sk_buff_freelist_scan();
		sk_buff_bufflist_scan();
		while(tail!=(struct sk_buff*)0&&time_new<time+100)
		{
			Uart_Printf("while sk_buff_handle OK!\n");
			sk_buff_handle = sk_buff_get();
			Uart_Printf("sk_buff_get OK!\n");
			if(sk_buff_handle)
			{
				net_handle(sk_buff_handle);
				Uart_Printf("net_handle OK!\n");
				sk_buff_free(sk_buff_handle);
				//read_p = 更新read_p
			}
		}
		Uart_Printf("while sk_buff_handle is out!\n");
		//复位8019IMR接收中断位
		*((volatile U8 *)(IMR)) = (U8)(0x01);
		//关中断
		OS_ENTER_CRITICAL();
	}
	else
	{
		SetRegPage(0);//缺少该行,page1,0xff赋予CURR,:(
		*((volatile U8 *)(ISR)) = (U8)(0xff);	//清除中断标志
	}
}

void sk_buff_put(struct sk_buff* sk_buff_new)
{
	if(header==(struct sk_buff*)0&&tail==(struct sk_buff*)0)
	{
		header=tail=sk_buff_new;
	}
	else
	{
		sk_buff_new->next=header;
		header->prev=sk_buff_new;
		header=sk_buff_new;
	}
}

struct sk_buff* sk_buff_get(void)
{
	struct sk_buff* sk_buff_get;
	if(header!=tail)
	{
		Uart_Printf("if(header!=tail)\n");
		sk_buff_get=tail;
		tail=tail->prev;
		return sk_buff_get;
	}
	else
	{
		if(tail!=(struct sk_buff*)0)
		{	
			Uart_Printf("if(tail!=(struct sk_buff*)0)\n");
			sk_buff_get=tail;
			header=tail=(struct sk_buff*)0;
			return sk_buff_get;
		}		
	}
	Uart_Printf("return (struct sk_buff*)0;\n");
	return (struct sk_buff*)0;
}

struct sk_buff* sk_buff_alloc(void)
{
	struct sk_buff* sk_buff_new;
	if(sk_buff_freelist)
	{
		sk_buff_new = sk_buff_freelist;
		sk_buff_freelist = sk_buff_freelist->next;
		return (struct sk_buff*)sk_buff_new;
	}
	return (struct sk_buff*)0;
}

void sk_buff_free(struct sk_buff* sk_buff_unused)
{
	if(sk_buff_unused)
	{
		sk_buff_unused->next = sk_buff_freelist;
		sk_buff_freelist = sk_buff_unused;
	}
}

/*int buff_mem_alloc(struct sk_buff* sk_buff_used)
{
	if(read_p - write_p <= 0)
	{
		if(end - write_p >= 1520)
		{
			sk_buff_used->buff = (unsigned char*)&packet_buff[write_p];
			return 1;
		}
		else
		{
			if(read_p - begin >= 1520)
			{
				sk_buff_used->buff = (unsigned char*)&packet_buff[begin];
				return 1;
			}
			return 0;
		}		
	}
	else
	{
		if(read_p - write_p >= 1520)
		{
			sk_buff_used->buff = (unsigned char*)&packet_buff[write_p];
			return 1;
		}
		return 0;
	}
}*/

void demo_printf(void)
{
  int x;
  char buf[20];

  for (x=1; x<=5; x++)
  {
    sprintf(buf, "Hello Again %d\n", x);
    printf("%s", buf);
  }
}


void Task (void *data)
{
        while(1)
        {
                //OSSemPend(RandomSem, 0, &err);  /* Acquire semaphore to perform random numbers */
                //OSSemPost(RandomSem);           /* Release semaphore */
                Uart_SendByte(*(char *)data); /* Display the task number on the screen */
                demo_printf();
                OSTimeDlyHMSM(0, 0, 2, 0);
        }
}

void TaskStart (void *data)
{		
        data = data;                            /* Prevent compiler warning */
				
        Uart_Printf("uC/OS-II, The Real-Time Kernel ARM Ported version\n");
        Uart_Printf("Jean J. Labrosse/ (Ported by) Michael Anburaj\n");
        Uart_Printf("Determining  CPU's capacity ...\n");
        
        sk_buff_freelist_init();
        tftp_init(IP_ADDRESS,DFT_DOWNLOAD_ADDR,1);
        
        FRMWRK_vStartTicker(OS_TICKS_PER_SEC);  /* The Tick timer is started much earlier */
        
        //OSStatInit();                           /* Initialize uC/OS-II's statistics */
		//for (i = 0; i < NO_TASKS; i++)
        //{                                       /* Create NO_TASKS identical tasks */
        //        TaskData[i] = '0' + i;          /* Each task will display its own letter */
        //        Uart_Printf("#%d",i);
        //        OSTaskCreate(Task, (void *)&TaskData[i], (void *)&TaskStk[i][TASK_STK_SIZE - 1], i + 1);
        //}

        //Uart_Printf("\n# Parameter1: No. Tasks\n");
        //Uart_Printf("# Parameter2: CPU Usage in %%\n");
        //Uart_Printf("# Parameter3: No. Task switches/sec\n");
        //Uart_Printf("<-PRESS 'ESC' TO QUIT->\n");
        while(1)
        {
        		k++;
        		//Uart_Printf("UCOS任务执行中,数据包在中断中处理完毕,^_^!\n");
               	OSTimeDly(5);
                //OSTimeDlyHMSM(0, 0, 5, 0);      /* Wait one second */
        }
}

/* ********************************************************************* */
/* Global functions */

void APP_vMain (void)
{
        OSInit();                               /* Initialize uC/OS-II                               */
        OSTaskCreate(TaskStart, (void *)0, (void *)&TaskStartStk[TASK_STK_SIZE - 1], 0);
        OSStart();		                        /* Start multitasking                                       */
}


/* ********************************************************************* */

void C_IRQHandler(void)
{
        U32 temp,i;
        temp=rI_ISPR;
        if(temp==0) return;
        for(i=0;i<26;i++){
        	if(temp&0x1==1){
        		break;
        	}
        	else{
        		temp=temp>>1;
        	}
        }
		if(i==26){
        	return;
        }
        temp=i<<2;
        ((void(*)(void))(*((U32 *)(_ISR_STARTADDRESS+0x20+temp))))();
}

⌨️ 快捷键说明

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