|
楼主 |
发表于 2017-10-21 13:52:03
|
显示全部楼层
9.3.5 RL-TCPnet应用实例
为了验证移植的RL-TCPnet是否可以使用,需要添加测试代码。下面是编写的测试代码,配套的测试例子完整版是:V5-1002_RL-TCPnet实验_工程移植模板(uCOS-III)。
u uCOS-III操作系统创建的任务
经过上面的移植和配置之后,在 main.c 文件中添加如下代码,代码中创建了5个用户任务:
App Task Start任务 :启动任务,实现RL-TCPnet的时间基准更新。
App Task TCPnet任务 :RL-TCPnet测试任务。
App Task MspPro任务:消息处理,这里用作按键检测。
App Task UserIF任务 :按键消息处理。
App Task COM任务 :LED闪烁。
具体代码如下:
- #include "includes.h"
-
-
-
- /*
- *********************************************************************************************************
- * 静态全局变量
- *********************************************************************************************************
- */
- static OS_TCB AppTaskStartTCB;
- static CPU_STK AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];
-
- static OS_TCB AppTaskTCPnetTCB;
- static CPU_STK AppTaskTCPnetStk[APP_CFG_TASK_TCPnet_STK_SIZE];
-
- static OS_TCB AppTaskMsgProTCB;
- static CPU_STK AppTaskMsgProStk[APP_CFG_TASK_MsgPro_STK_SIZE];
-
- static OS_TCB AppTaskCOMTCB;
- static CPU_STK AppTaskCOMStk[APP_CFG_TASK_COM_STK_SIZE];
-
- static OS_TCB AppTaskUserIFTCB;
- static CPU_STK AppTaskUserIFStk[APP_CFG_TASK_USER_IF_STK_SIZE];
-
-
- /*
- *********************************************************************************************************
- * 函数声明
- *********************************************************************************************************
- */
- static void AppTaskStart (void *p_arg);
- static void AppTaskTCPnet (void *p_arg);
- static void AppTaskMsgPro (void *p_arg);
- static void AppTaskUserIF (void *p_arg);
- static void AppTaskCOM (void *p_arg);
- static void AppTaskCreate (void);
- static void DispTaskInfo (void);
- static void AppObjCreate (void);
- static void App_Printf (CPU_CHAR *format, ...);
-
-
- /*
- *******************************************************************************************************
- * 变量
- *******************************************************************************************************
- */
- static OS_SEM AppPrintfSemp; /* 用于printf互斥 */
- OS_FLAG_GRP FLAG_TCPnet;
-
-
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main(void)
- {
- OS_ERR err;
-
- /* 初始化uC/OS-III 内核 */
- OSInit(&err);
-
- /* 创建一个启动任务(也就是主任务)。启动任务会创建所有的应用程序任务 */
- OSTaskCreate((OS_TCB *)&AppTaskStartTCB, /* 任务控制块地址 */
- (CPU_CHAR *)"App Task Start", /* 任务名 */
- (OS_TASK_PTR )AppTaskStart, /* 启动任务函数地址 */
- (void *)0, /* 传递给任务的参数 */
- (OS_PRIO )APP_CFG_TASK_START_PRIO, /* 任务优先级 */
- (CPU_STK *)&AppTaskStartStk[0], /* 堆栈基地址 */
- (CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE / 10, /* 堆栈监测区,这里表示后10%作为监测区 */
- (CPU_STK_SIZE )APP_CFG_TASK_START_STK_SIZE, /* 堆栈空间大小 */
- (OS_MSG_QTY )0, /* 本任务支持接受的最大消息数 */
- (OS_TICK )0, /* 设置时间片 */
- (void *)0, /* 堆栈空间大小 */
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
-
- /* 定义如下:
- OS_OPT_TASK_STK_CHK 使能检测任务栈,统计任务栈已用的和未用的
- OS_OPT_TASK_STK_CLR 在创建任务时,清零任务栈
- OS_OPT_TASK_SAVE_FP 如果CPU有浮点寄存器,则在任务切换时保存浮点寄存器的内容
- */
- (OS_ERR *)&err);
-
- /* 启动多任务系统,控制权交给uC/OS-III */
- OSStart(&err);
-
- (void)&err;
-
- return (0);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskStart
- * 功能说明: 这是一个启动任务,在多任务系统启动后,必须初始化滴答计数器。本任务主要实现RL-TCPnet的时间
- * 基准更新。
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级: 2
- *********************************************************************************************************
- */
- static void AppTaskStart (void *p_arg)
- {
- OS_ERR err;
-
- (void)p_arg;
-
- CPU_Init(); /* 此函数要优先调用,因为外设驱动中使用的us和ms延迟是基于此函数的 */
- bsp_Init();
- init_TcpNet ();/* 初始化RL-TCPnet */
-
- BSP_Tick_Init();
-
- #if OS_CFG_STAT_TASK_EN > 0u
- OSStatTaskCPUUsageInit(&err);
- #endif
-
- #ifdef CPU_CFG_INT_DIS_MEAS_EN
- CPU_IntDisMeasMaxCurReset();
- #endif
-
- /* 创建任务 */
- AppTaskCreate();
-
- /* 创建任务间通信机制 */
- AppObjCreate();
-
- while (1)
- {
- /* RL-TCPnet时间基准更新函数 */
- timer_tick ();
- OSTimeDly(100, OS_OPT_TIME_PERIODIC, &err);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskTCPnet
- * 功能说明: RL-TCPnet测试任务
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级: 3
- *********************************************************************************************************
- */
- static void AppTaskTCPnet(void *p_arg)
- {
- (void)p_arg;
-
- while(1)
- {
- TCPnetTest();
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskMsgPro
- * 功能说明: 消息处理,这里用按键检测
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级: 3
- *********************************************************************************************************
- */
- static void AppTaskMsgPro(void *p_arg)
- {
- OS_ERR err;
-
- (void)p_arg;
-
- while(1)
- {
- bsp_KeyScan();
- OSTimeDly(10, OS_OPT_TIME_DLY, &err);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskUserIF
- * 功能说明: 按键消息处理
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级: 4
- *********************************************************************************************************
- */
- static void AppTaskUserIF(void *p_arg)
- {
- OS_ERR err;
- uint8_t ucKeyCode; /* 按键代码 */
-
- (void)p_arg;
-
- while(1)
- {
- ucKeyCode = bsp_GetKey();
-
- if (ucKeyCode != KEY_NONE)
- {
- switch (ucKeyCode)
- {
- /* K1键按下,直接发送事件标志给任务AppTaskTCPMain,设置bit0 */
- case KEY_DOWN_K1:
- App_Printf("K1键按下,直接发送事件标志给任务AppTaskTCPMain,bit0被设置\\r\\n");
- OSFlagPost ((OS_FLAG_GRP *)&FLAG_TCPnet,
- (OS_FLAGS )KEY1_BIT0, /* 设置bit0 */
- (OS_OPT )OS_OPT_POST_FLAG_SET,
- (OS_ERR *)&err);
- break;
-
- /* K2键按下,直接发送事件标志给任务AppTaskTCPMain,设置bit1 */
- case KEY_DOWN_K2:
- App_Printf("K2键按下,直接发送事件标志给任务AppTaskTCPMain,bit1被设置\\r\\n");
- OSFlagPost ((OS_FLAG_GRP *)&FLAG_TCPnet,
- (OS_FLAGS )KEY2_BIT1, /* 设置bit1 */
- (OS_OPT )OS_OPT_POST_FLAG_SET,
- (OS_ERR *)&err);
- break;
-
- /* K3键按下,直接发送事件标志给任务AppTaskTCPMain,设置bit2 */
- case KEY_DOWN_K3:
- App_Printf("K3键按下,直接发送事件标志给任务AppTaskTCPMain,bit2被设置\\r\\n");
- OSFlagPost ((OS_FLAG_GRP *)&FLAG_TCPnet,
- (OS_FLAGS )KEY3_BIT2, /* 设置bit20 */
- (OS_OPT )OS_OPT_POST_FLAG_SET,
- (OS_ERR *)&err);
- break;
-
- /* 摇杆的OK键按下 打印任务执行情况 */
- case JOY_DOWN_OK:
- DispTaskInfo();
- break;
-
- default: /* 其他的键值不处理 */
- break;
- }
- }
-
- OSTimeDly(20, OS_OPT_TIME_DLY, &err);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskCom
- * 功能说明: LED闪烁
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- 优 先 级: 5
- *********************************************************************************************************
- */
- static void AppTaskCOM(void *p_arg)
- {
- OS_ERR err;
-
- (void)p_arg;
-
- while(1)
- {
- bsp_LedToggle(2);
- OSTimeDly(500, OS_OPT_TIME_DLY, &err);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskCreate
- * 功能说明: 创建应用任务
- * 形 参:p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void AppTaskCreate (void)
- {
- OS_ERR err;
-
- /**************创建MsgPro任务*********************/
- OSTaskCreate((OS_TCB *)&AppTaskTCPnetTCB,
- (CPU_CHAR *)"App Task TCPnet",
- (OS_TASK_PTR )AppTaskTCPnet,
- (void *)0,
- (OS_PRIO )APP_CFG_TASK_TCPnet_PRIO,
- (CPU_STK *)&AppTaskTCPnetStk[0],
- (CPU_STK_SIZE )APP_CFG_TASK_TCPnet_STK_SIZE / 10,
- (CPU_STK_SIZE )APP_CFG_TASK_TCPnet_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- /**************创建MsgPro任务*********************/
- OSTaskCreate((OS_TCB *)&AppTaskMsgProTCB,
- (CPU_CHAR *)"App Task MspPro",
- (OS_TASK_PTR )AppTaskMsgPro,
- (void *)0,
- (OS_PRIO )APP_CFG_TASK_MsgPro_PRIO,
- (CPU_STK *)&AppTaskMsgProStk[0],
- (CPU_STK_SIZE )APP_CFG_TASK_MsgPro_STK_SIZE / 10,
- (CPU_STK_SIZE )APP_CFG_TASK_MsgPro_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- /**************创建USER IF任务*********************/
- OSTaskCreate((OS_TCB *)&AppTaskUserIFTCB,
- (CPU_CHAR *)"App Task UserIF",
- (OS_TASK_PTR )AppTaskUserIF,
- (void *)0,
- (OS_PRIO )APP_CFG_TASK_USER_IF_PRIO,
- (CPU_STK *)&AppTaskUserIFStk[0],
- (CPU_STK_SIZE )APP_CFG_TASK_USER_IF_STK_SIZE / 10,
- (CPU_STK_SIZE )APP_CFG_TASK_USER_IF_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
-
- /**************创建COM任务*********************/
- OSTaskCreate((OS_TCB *)&AppTaskCOMTCB,
- (CPU_CHAR *)"App Task COM",
- (OS_TASK_PTR )AppTaskCOM,
- (void *)0,
- (OS_PRIO )APP_CFG_TASK_COM_PRIO,
- (CPU_STK *)&AppTaskCOMStk[0],
- (CPU_STK_SIZE )APP_CFG_TASK_COM_STK_SIZE / 10,
- (CPU_STK_SIZE )APP_CFG_TASK_COM_STK_SIZE,
- (OS_MSG_QTY )0,
- (OS_TICK )0,
- (void *)0,
- (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
- (OS_ERR *)&err);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppObjCreate
- * 功能说明: 创建任务通讯
- * 形 参: p_arg 是在创建该任务时传递的形参
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void AppObjCreate (void)
- {
- OS_ERR err;
-
- /*
- 创建信号量数值为1的时候可以实现互斥功能,也就是只有一个资源可以使用
- 本例程是将串口1的打印函数作为保护的资源。防止串口打印的时候被其它任务抢占
- 造成串口打印错乱。
- */
- OSSemCreate((OS_SEM *)&AppPrintfSemp,
- (CPU_CHAR *)"AppPrintfSemp",
- (OS_SEM_CTR )1,
- (OS_ERR *)&err);
-
- /* 创建事件标志组 */
- OSFlagCreate ((OS_FLAG_GRP *)&FLAG_TCPnet,
- (CPU_CHAR *)"FLAG TCPnet",
- (OS_FLAGS )0,
- (OS_ERR *)&err);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: App_Printf
- * 功能说明: 线程安全的printf方式
- * 形 参: 同printf的参数。
- * 在C中,当无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void App_Printf(CPU_CHAR *format, ...)
- {
- CPU_CHAR buf_str[80 + 1];
- va_list v_args;
- OS_ERR os_err;
-
-
- va_start(v_args, format);
- (void)vsnprintf((char *)&buf_str[0],
- (size_t ) sizeof(buf_str),
- (char const *) format,
- v_args);
- va_end(v_args);
-
- /* 互斥操作 */
- OSSemPend((OS_SEM *)&AppPrintfSemp,
- (OS_TICK )0u,
- (OS_OPT )OS_OPT_PEND_BLOCKING,
- (CPU_TS *)0,
- (OS_ERR *)&os_err);
-
- printf("%s", buf_str);
-
- (void)OSSemPost((OS_SEM *)&AppPrintfSemp,
- (OS_OPT )OS_OPT_POST_1,
- (OS_ERR *)&os_err);
-
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: DispTaskInfo
- * 功能说明: 将uCOS-III任务信息通过串口打印出来
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void DispTaskInfo(void)
- {
- OS_TCB *p_tcb; /* 定义一个任务控制块指针, TCB = TASK CONTROL BLOCK */
- float CPU = 0.0f;
- CPU_SR_ALLOC();
-
- CPU_CRITICAL_ENTER();
- p_tcb = OSTaskDbgListPtr;
- CPU_CRITICAL_EXIT();
-
- /* 打印标题 */
- App_Printf("===============================================================\\r\\n");
- App_Printf(" 优先级 使用栈 剩余栈 百分比 利用率 任务名\\r\\n");
- App_Printf(" Prio Used Free Per CPU Taskname\\r\\n");
-
- /* 遍历任务控制块列表(TCB list),打印所有的任务的优先级和名称 */
- while (p_tcb != (OS_TCB *)0)
- {
- CPU = (float)p_tcb->CPUUsage / 100;
- App_Printf(" %2d %5d %5d %02d%% %5.2f%% %s\\r\\n",
- p_tcb->Prio,
- p_tcb->StkUsed,
- p_tcb->StkFree,
- (p_tcb->StkUsed * 100) / (p_tcb->StkUsed + p_tcb->StkFree),
- CPU,
- p_tcb->NamePtr);
-
- CPU_CRITICAL_ENTER();
- p_tcb = p_tcb->DbgNextPtr;
- CPU_CRITICAL_EXIT();
- }
- }
复制代码 u 硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现:
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_Init
- * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_Init(void)
- {
- /*
- 由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
- 启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
-
- 系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
- */
- /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
-
- SystemCoreClockUpdate(); /* 根据PLL配置更新系统时钟频率变量 SystemCoreClock */
-
- bsp_InitUart(); /* 初始化串口 */
- bsp_InitKey(); /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
-
- bsp_InitExtIO(); /* FMC总线上扩展了32位输出IO, 操作LED等外设必须初始化 */
- bsp_InitLed(); /* 初始LED指示灯端口 */
- }
复制代码 u RL-TCPnet功能测试
这里专门创建了一个app_tcpnet_lib.c文件用于RL-TCPnet功能的测试,主要功能是创建了一个TCP Server。
- #include "includes.h"
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #define PORT_NUM 1001 /* TCP服务器监听端口号 */
-
-
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- uint8_t socket_tcp;
-
-
- /*
- *********************************************************************************************************
- * 函 数 名: tcp_callback
- * 功能说明: TCP Socket的回调函数
- * 形 参: soc TCP Socket类型
- * evt 事件类型
- * ptr 事件类型是TCP_EVT_DATA,ptr指向的缓冲区记录着接收到的TCP数据,其余事件记录IP地址
- * par 事件类型是TCP_EVT_DATA,记录接收到的数据个数,其余事件记录端口号
- * 返 回 值:
- *********************************************************************************************************
- */
- U16 tcp_callback (U8 soc, U8 evt, U8 *ptr, U16 par)
- {
- char buf[50];
- uint16_t i;
-
- /* 确保是socket_tcp的回调 */
- if (soc != socket_tcp)
- {
- return (0);
- }
-
- switch (evt)
- {
- /*
- 远程客户端连接消息
- 1、数组ptr存储远程设备的IP地址,par中存储端口号。
- 2、返回数值1允许连接,返回数值0禁止连接。
- */
- case TCP_EVT_CONREQ:
- sprintf(buf, "远程客户端请求连接IP: %d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);
- printf_debug("IP:%s port:%d\\r\\n", buf, par);
- return (1);
-
- /* 连接终止 */
- case TCP_EVT_ABORT:
- break;
-
- /* Socket远程连接已经建立 */
- case TCP_EVT_CONNECT:
- printf_debug("Socket is connected to remote peer\\r\\n");
- break;
-
- /* 连接断开 */
- case TCP_EVT_CLOSE:
- printf_debug("Connection has been closed\\r\\n");
- break;
-
- /* 发送的数据收到远程设备应答 */
- case TCP_EVT_ACK:
- break;
-
- /* 接收到TCP数据帧,ptr指向数据地址,par记录数据长度,单位字节 */
- case TCP_EVT_DATA:
- printf_debug("Data length = %d\\r\\n", par);
- for(i = 0; i < par; i++)
- {
- printf_debug("ptr[%d] = %d\\r\\n", i, ptr[i]);
- }
- break;
- }
-
- return (0);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TCP_StatusCheck
- * 功能说明: 检测TCP的连接状态,主要用于网线插拔的判断
- * 形 参: 无
- * 返 回 值: __TRUE 连接
- * __FALSE 断开
- *********************************************************************************************************
- */
- uint8_t TCP_StatusCheck(void)
- {
- uint8_t res;
-
- switch (tcp_get_state(socket_tcp))
- {
- case TCP_STATE_FREE:
- case TCP_STATE_CLOSED:
- res = tcp_listen (socket_tcp, PORT_NUM);
- printf_debug("tcp listen res = %d\\r\\n", res);
- break;
-
- case TCP_STATE_LISTEN:
- break;
-
- case TCP_STATE_CONNECT:
- return (__TRUE);
-
- default:
- break;
- }
-
- return (__FALSE);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TCPnetTest(void)
- {
- int32_t iCount;
- uint8_t *sendbuf;
- uint8_t tcp_status;
- uint16_t maxlen;
- uint8_t res;
- OS_ERR err;
- CPU_TS ts;
- OS_FLAGS xResult;
- const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
-
- /*
- 创建TCP Socket并创建监听,客户端连接服务器后,10秒内无数据通信将断开连接。
- 但是由于这里使能了TCP_TYPE_KEEP_ALIVE,会一直保持连接,不受10秒的时间限制。
- */
- socket_tcp = tcp_get_socket (TCP_TYPE_SERVER|TCP_TYPE_KEEP_ALIVE, 0, 10, tcp_callback);
- if(socket_tcp != 0)
- {
- res = tcp_listen (socket_tcp, PORT_NUM);
- printf_debug("tcp listen res = %d\\r\\n", res);
- }
-
- while (1)
- {
- /* RL-TCPnet处理函数 */
- main_TcpNet();
-
- /* 用于网线插拔的处理 */
- tcp_status = TCP_StatusCheck();
-
- xResult = OSFlagPend ((OS_FLAG_GRP *)&FLAG_TCPnet,
- (OS_FLAGS )0xFFFF,
- (OS_TICK )usMaxBlockTime,
- (OS_OPT )OS_OPT_PEND_FLAG_SET_ANY + OS_OPT_PEND_FLAG_CONSUME,
- (CPU_TS *)&ts,
- (OS_ERR *)&err);
-
- if((err == OS_ERR_NONE)&&(tcp_status == __TRUE))
- {
- switch (xResult)
- {
- /* 接收到K1键按下,给远程TCP客户端发送8字节数据 */
- case KEY1_BIT0:
- printf_debug("tcp_get_state(socket_tcp) = %d\\r\\n", tcp_get_state(socket_tcp));
- iCount = 8;
- do
- {
- main_TcpNet();
- if (tcp_check_send (socket_tcp) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = '1';
- sendbuf[1] = '2';
- sendbuf[2] = '3';
- sendbuf[3] = '4';
- sendbuf[4] = '5';
- sendbuf[5] = '6';
- sendbuf[6] = '7';
- sendbuf[7] = '8';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- break;
-
- /* 接收到K2键按下,给远程TCP客户端发送1024字节的数据 */
- case KEY2_BIT1:
- printf_debug("tcp_get_state(socket_tcp) = %d\\r\\n", tcp_get_state(socket_tcp));
- iCount = 1024;
- do
- {
- main_TcpNet();
- if (tcp_check_send (socket_tcp) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- /* 这里仅初始化了每次所发送数据包的前8个字节 */
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = 'a';
- sendbuf[1] = 'b';
- sendbuf[2] = 'c';
- sendbuf[3] = 'd';
- sendbuf[4] = 'e';
- sendbuf[5] = 'f';
- sendbuf[6] = 'g';
- sendbuf[7] = 'h';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- break;
-
- /* 接收到K3键按下,给远程TCP客户端发送5MB数据 */
- case KEY3_BIT2:
- printf_debug("tcp_get_state(socket_tcp) = %d\\r\\n", tcp_get_state(socket_tcp));
- iCount = 5*1024*1024;
- do
- {
- main_TcpNet();
- if (tcp_check_send (socket_tcp) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- /* 这里仅初始化了每次所发送数据包的前8个字节 */
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = 'a';
- sendbuf[1] = 'b';
- sendbuf[2] = 'c';
- sendbuf[3] = 'd';
- sendbuf[4] = 'e';
- sendbuf[5] = 'f';
- sendbuf[6] = 'g';
- sendbuf[7] = 'h';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- break;
-
- /* 其他的键值不处理 */
- default:
- break;
- }
- }
- }
- }
复制代码 至此,uCOS-III方式移植的RL-TCPnet就可以运行了。 |
|