|

楼主 |
发表于 2022-6-1 16:58:22
|
显示全部楼层
本帖最后由 hpdell 于 2022-6-1 17:00 编辑
/*
******************************************************************************************
******************************************************************************************
*/
void _nx_driver_stm32h7xx_InitEx(void)
{
UINT status;
UINT old_priority;
NX_Debug("NX_USER_MODE == NX_USER_SERVER\r\n");
NX_Debug("开发板设置为 服务器端\r\n");
if(netx_init_flag) return;
netx_init_flag = 0xff;
status = NETX_Memory(0);
if(status == 0)
{
NX_Debug("nx 内存申请失败 ... ?\r\n");
return;
}
/* Initialize the NetX system. */
nx_system_initialize();
/* Create the server packet pool. */
status = nx_packet_pool_create(&nx_packet_pool, /* 内存池控制块 */
"NetX Main Packet Pool", /* 内存池名 */
1536, /* 内存池每个数据包大小,单位字节
此值必须至少为 40 个字节,并且还必须可以被 4 整除 */
// (ULONG*)(((int)packet_pool_area + 15) & ~15) , /* 内存池地址,此地址必须ULONG对齐 */
(ULONG*)packet_pool_area , //内存申请方法 ok
NX_PACKET_POOL_SIZE);
if (status) /* 检测创建是否失败 */
{
NX_Debug("nx_packet_pool_create error ...\r\n");
return;
}
/* Create an IP instance. */
status = nx_ip_create(&nx_ip,
"NetX ip creat thread",
#ifdef NX_ENABLE_DHCP
IP_ADDRESS(0,0,0,0),
IP_ADDRESS(0,0,0,0),
#else
IP_ADDRESS(192, 168, 1, 139),
0xFFFFFF00UL,
#endif
&nx_packet_pool,
_nx_driver_stm32h7xx,
(UCHAR*)ip_thread_stack,
IP_TASK_STACK_SIZE,
DEFAULT_PRIORITY);
if (status)
{
NX_Debug("nx_ip_create error = %d...\r\n", status);
return;
}
/* 使能ARP,并提供ARP缓存 for DHCP Server IP.
此函数用于使能 ARP 地址解析
*/
status = nx_arp_enable(&nx_ip, (void *)arp_space_area, ARP_SPACE_STACK_SIZE);
if (status)
{
NX_Debug("nx_arp_enable error ...\r\n");
return;
}
status = nx_icmp_enable(&nx_ip);
if (status)
{
NX_Debug("nx_icmp_enable error ...\r\n");
return;
}
/* 使能fragment
nx_ip_fragment_enable 此函数用于启用 IPv4 和 IPv6 数据包分段和
重组功能。创建 IP 任务时,此服务会自动禁用
*/
status = nx_ip_fragment_enable(&nx_ip);
if (status)
{
NX_Debug("nx_ip_fragment_enable error ...\r\n");
return;
}
/* Enable TCP traffic. */
status = nx_tcp_enable(&nx_ip);
if (status)
{
NX_Debug("nx_tcp_enable error ...\r\n");
return;
}
/* Enable UDP traffic. */
status = nx_udp_enable(&nx_ip);
if (status)
{
NX_Debug("nx_udp_enable error ...\r\n");
return;
}
// if(eth_link_thread.tx_thread_id == 0) // 这个任务要一直运行,所以只需创建一次即可
{
static char _init=0;
if(!_init) { // 只初始化一次即可
_init = 1;
tx_thread_create(ð_link_thread,
"eth_link_thread",
ethernetif_set_link,
0,
eth_link_thread_stack,
APP_TASK_ETH_LINK_STK_SIZE,
APP_TASK_ETH_LINK_PRIO,
APP_TASK_ETH_LINK_PRIO,
TX_NO_TIME_SLICE,
TX_AUTO_START); // 立即启动
}
}
/* NETX初始化完毕后,重新设置优先级 */
tx_thread_priority_change(netx_thread_ptr, APP_CFG_TASK_NETX_PRIO_1, &old_priority);
tx_thread_priority_change(&AppTaskNetXTCB, APP_CFG_TASK_NetXPro_PRIO_1, &old_priority);
tx_thread_create(&tcp_thread,
"tcp_thread",
tcp_thread_entry,
0,
server_thread_stack,
APP_TASK_TCP_STK_SIZE,
APP_TASK_TCP_PRIO,
APP_TASK_TCP_PRIO,
TX_NO_TIME_SLICE,
TX_DONT_START); // 不立即启动
DHCP_Init();
}
/*
************************************************************************************************
获取到 ip 地址后恢复 tcp 任务,在 dhcp 任务里面调用
************************************************************************************************
*/
void tcp_thread_creat_user(void)
{
_nx_driver_stm32h7xx_InitEx();
}
|
|