本页介绍了 FreeRTOS_IPInit_Multi()
以及发生“网络开启”和“网络关闭”事件时调用的回调函数。
在调用 FreeRTOS_IPInit_Multi() 函数之前,应用程序必须添加网络接口和至少一个
与网络接口对应的端点。网络接口是 EMAC + PHY(或 WiFi 适配器)的驱动程序。端点是一组
网络参数,保护 IP 地址、MAC 地址、网关、DNS 等。可以有多个接口,每个接口都拥有一个
或多个端点。
用于初始化接口的函数是 px${port_name}_FillInterfaceDescriptor
(例如,
pxSAM_FillInterfaceDescriptor
)。用于添加端点的函数是
FreeRTOS_FillEndPoint
或
FreeRTOS_FillEndPoint_IPv6
。
FreeRTOS_IPInit_Multi() 可创建 FreeRTOS-Plus-TCP RTOS 任务。FreeRTOS-Plus-TCP 任务可配置并初始化网络接口。
如果 ipconfigUSE_NETWORK_EVENT_HOOK 在 FreeRTOSIPConfig.h 中设置为 1,则当网络可用时,TCP/IP 堆栈将调用 vApplicationIPNetworkEventHook_Multi()
回调函数。
下文提供了两个示例。第一个示例演示了 FreeRTOS_IPInit_Multi()。第二个演示了
vApplicationIPNetworkEventHook_Multi()。
IPv4 示例:
static uint8_t ucMACAddress[ 6 ] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
static const uint8_t ucIPAddress[ 4 ] = { 10, 10, 10, 200 };
static const uint8_t ucNetMask[ 4 ] = { 255, 0, 0, 0 };
static const uint8_t ucGatewayAddress[ 4 ] = { 10, 10, 10, 1 };
static const uint8_t ucDNSServerAddress[ 4 ] = { 208, 67, 222, 222 };
int main( void )
{
pxWinPcap_FillInterfaceDescriptor( 0, &( xInterfaces[ 0 ] ) );
FreeRTOS_FillEndPoint( &( xInterfaces[ 0 ] ), &( xEndPoints[ 0 ] ), ucIPAddress,
ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress );
#if ( ipconfigUSE_DHCP != 0 )
{
xEndPoints[ 0 ].bits.bWantDHCP = pdTRUE;
}
#endif /* ( ipconfigUSE_DHCP != 0 ) */
FreeRTOS_IPInit_Multi();
vTaskStartScheduler();
for( ;; );
}
FreeRTOS_IPInit_Multi() API 函数的示例用法
void vApplicationIPNetworkEventHook_Multi( eIPCallbackEvent_t eNetworkEvent,
struct xNetworkEndPoint * pxEndPoint )
{
static BaseType_t xTasksAlreadyCreated = pdFALSE;
if( eNetworkEvent == eNetworkUp )
{
if( xTasksAlreadyCreated == pdFALSE )
{
xTasksAlreadyCreated = pdTRUE;
}
}
showEndPoint( pxEndPoint );
}
vApplicationIPNetworkEventHook_Multi()definition 的示例用法
IPv6 示例:
static uint8_t ucMACAddress[ 6 ] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
int main( void )
{
IPv6_Address_t xIPAddress;
IPv6_Address_t xPrefix;
IPv6_Address_t xGateWay;
pxWinPcap_FillInterfaceDescriptor( 0, &( xInterfaces[ 0 ] ) );
FreeRTOS_inet_pton6( "2001:470:ed44::", xPrefix.ucBytes );
FreeRTOS_CreateIPv6Address( &xIPAddress, &xPrefix, 64, pdTRUE );
FreeRTOS_inet_pton6( "fe80::ba27:ebff:fe5a:d751", xGateWay.ucBytes );
#if ( ipconfigUSE_RA != 0 )
{
xEndPoints[ 0 ].bits.bWantRA = pdTRUE;
}
#endif
#if ( ipconfigUSE_DHCPv6 != 0 )
{
xEndPoints[ 0 ].bits.bWantDHCP = pdTRUE;
}
FreeRTOS_FillEndPoint_IPv6( &( xInterfaces[ 0 ] ),
&( xEndPoints[ 0] ),
&( xIPAddress ),
&( xPrefix ),
64uL,
&( xGateWay ),
NULL,
ucMACAddress );
FreeRTOS_inet_pton6( "2001:4860:4860::8888", xEndPoints[ 0 ].ipv6_settings.xDNSServerAddresses[ 0 ].ucBytes );
FreeRTOS_inet_pton6( "fe80::1", xEndPoints[ 0 ].ipv6_settings.xDNSServerAddresses[ 1 ].ucBytes );
FreeRTOS_inet_pton6( "2001:4860:4860::8888", xEndPoints[ 0 ].ipv6_defaults.xDNSServerAddresses[ 0 ].ucBytes );
FreeRTOS_inet_pton6( "fe80::1", xEndPoints[ 0 ].ipv6_defaults.xDNSServerAddresses[ 1 ].ucBytes );
FreeRTOS_inet_pton6( "fe80::", xPrefix.ucBytes );
FreeRTOS_inet_pton6( "fe80::7009", xIPAddress.ucBytes );
#if ( ipconfigUSE_DHCPv6 != 0 )
{
xEndPoints[ 1 ].bits.bWantDHCP = pdTRUE;
}
FreeRTOS_FillEndPoint_IPv6(
&( xInterfaces[ 0 ] ),
&( xEndPoints[ 1 ] ),
&( xIPAddress ),
&( xPrefix ),
10U,
NULL,
NULL,
ucMACAddress );
FreeRTOS_IPInit_Multi();
vTaskStartScheduler();
for( ;; );
}
FreeRTOS_IPInit_Multi() API 函数的示例用法
void vApplicationIPNetworkEventHook_Multi( eIPCallbackEvent_t eNetworkEvent,
struct xNetworkEndPoint * pxEndPoint )
{
static BaseType_t xTasksAlreadyCreated = pdFALSE;
if( eNetworkEvent == eNetworkUp )
{
if( xTasksAlreadyCreated == pdFALSE )
{
xTasksAlreadyCreated = pdTRUE;
}
}
showEndPoint( pxEndPoint );
}
vApplicationIPNetworkEventHook_Multi()definition 的示例用法
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.