📄 test.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 + -