主题中讨论的其他器件:OMAPL138、
工具/软件:TI-RTOS
尊敬的 TI 成员:
在过去的几天里,我一直在努力在不使用 xconfig 配置设置工具的情况下运行 TI-NDK,我想使用文件 spru524j 中提到的 TI-NDK 的 C 代码初始化方法来设置配置, 但我至今无法做到这一点。
我要做的是:
首先、我从 TI 资源浏览器创建了一个空项目、然后我对其进行了后续更改、以便使用 c 代码初始化 TI-NDK。
首先、我从 NSP 包中的"NDK_OMAMPL138_ARM9_examples"示例代码中获得了帮助。
因此、导入工程后、我还具有一个包含最少 xconfig 设置的*。cfg 文件。
我向配置文件中添加了以下代码行、如下所示:
//添加了 Heap 的内存配置。 它是必需的、因为如果没有它、系统会产生错误。
var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
//创建 HeapMem 堆实例"systemHeapParams"*/
var systemHeapParams = new HeapMem.Params;
systemHeapParams.size = 0x00002000;
//systemHeapParams.size = 0x000var;
systemHeap = HeapMem.create (systemHeapParams.size = 0x00002000;//系统
堆= 0x00020000;
堆= HeapParams.create);//将默认应用程序设置为"systemHeapParams.Memory.defaultHeapInstance
/*I 在配置文件的最后一个位置添加了以下代码段之后*/
var Global = xdc.useModule('ti.ndk.config.Global');
Global. enableCodeGeneration = false;
//创建 NDK 堆栈任务线程*
/ var Task = xdc.useModule('ti.sysbios.knl.Task');
var ndkParams = new Task.Params ();
ndkTaskParams.priority = 5;
ndkTaskParams.stackSIZE = 8192
;TaskParakTaskParams.TaskTask&TaskParz'
现在、在 main.c 文件中、我添加了以下代码、除了在任务中闪烁 LED 的已存在的最小代码外。
/*包含以下文件*/
#include
#include
#include <_stack.h>
#include
/*在其中添加了以下一行代码*///../../---------------
//标题字符串
//
char * VerStr =“\nTCP/IP 堆栈'Hello World!” 应用程序\n";//
我们的 NETCTRL 回调函数
static void NetworkOpen();
static void NetworkClose();
static void NetworkIPAddr ( IPN ipaddr,uint IfIdx,uint fADD );
//有趣的报告函数
static void ServiceReport( uint Item,uint Status,uint Report,句柄 hCfertry );---
//配置
//
char *主机名="tidsp";
char * LocalIPAddr ="0.0.0.0"; //对于 DHCP
char,设置为"0.0.0.0"*LocalIPMask ="255.255.254.0";//使用 DHCP
char 时不使用*GatewayIP ="0.0.0.0"; //使用 DHCP
char 时不使用*DomainName =“demo.net";” //使用 DHCP
char 时不使用*DNSserver ="0.0.0.0"; //设置为零时使用
//在
//评估周期超时前5分钟,评估堆栈调用此回调函数。
void evalCallBack()
{
printf ("堆栈将在5分钟内关闭\n");
}
handle hCfg;
//
//主线程
//
int StackTest ()
{
内部 RC;
//
//这必须是应用程序中做的第一件事!!
//
RC = NC_SystemOpen (NC_Priority_LOW、NC_OPMODE_INTERRUPT);
if (RC)
{
printf ("NC_SystemOpen 失败(%d)\n"、RC);
for (;;);
}
//打印我们的横幅
printf (VerStr);
//
//从头开始创建和构建系统配置。
//
//创建新配置
hCfg = CfgNew();
if (!hCfg)
{
printf ("无法创建配置\n");
转至 MAIN_EXIT
;}
// TCP/IP 堆栈的评估版本限制堆栈的使用
//最长为24小时。 如果应用程序需要5分钟的通知
//在超时之前,它可以使用注册回调函数
//下面的配置代码部分。
/*{
void (*pFxn)()= evalCallBack;
CfgAddEntry (hCfg、CFGTAG _SYSINFO、CFGITEM_SYSINFO_EVALCALLBACK、0、
sizeof (void (*)())、(uint8*)&pFxn,0);
}*/
//我们更好地验证提供的名称的长度
if (strlen( DomainName )>= CFG_DOMAIN_MAX ||
strlen( hostname )>= CFG_HOSTNAME_MAX )
{
printf ("名称太长\n");
转至 MAIN_EXIT
;}
//将我们的全局主机名添加到 hCfg (在所有已连接的域中声明)
CfgAddEntry (hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_HOSTNAME、0、
strlen(主机名)、(UINT8 *)主机名,0 );
//如果指定了 IP 地址,请手动配置 IP 和网关
if (inet_addr (LocalIPAddr))
{
CI_IPNet NA;
CI_route RT;
IPN IPTmp;
//设置手动 IP 地址
bzero (&nA,sizeof (nA));
na.ipaddr = inet_addr (LocalIPAddr);
na.ipMask = inet_addr (LocalIPMask);
strcpy( na.Domain,DomainName );
NA.NetType = 0;
//将地址添加到接口1
CfgAddEntry (hCfg、CFGTAG _IPNet、1、0、
sizeof (CI_IPNet)、(uint8 *)&nA、0);
//添加默认网关。 因为它是默认值、所以
//目标地址和掩码都为零(我们继续操作
//和显示分配以使其清晰)。
bzero (&RT,sizeof (RT));
rt.IPDestAddr = 0;
rt.IPDestMask = 0;
rt.IPGateAddr = inet_addr (GatewayIP);
//添加路由
CfgAddEntry (hCfg、CFGTAG _route、0、0、
sizeof (cI_route)、(uint8 *)&RT、0);
//指定后手动添加 DNS 服务器
IPTmp = inet_addr (DNSserver);
if (IPTmp)
CfgAddEntry (hCfg、CFGTAG _SYSINFO、CFGITEM_DHCP_DOMAINNAMESERVER、
0、sizeof (IPTmp)、(uint8 *)&IPTmp、0);
}
//否则我们指定 DHCP
其他
{
//
}
//
//配置 IPStack/OS 选项
//
//我们不希望看到少于警告的调试消息
RC = DBG_WARN;
CfgAddEntry (hCfg、CFGTAG _OS、CFGITEM_OS_DBGPRINTLEVEL、
CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&RC、0);
//
//此代码设置 TCP 和 UDP 缓冲区大小
//(注8192实际上是默认值。 此代码位于此处
//说明如何配置缓冲区和限制大小。)
//
// UDP 接收限制
RC = 8192;
CfgAddEntry (hCfg、CFGTAG _IP、CFGITEM_IP_SOCKUDPRXLIMIT、
CFG_ADDMODE_UNIQUE、sizeof (uint)、(uint8 *)&RC、0);
//
//使用此配置启动系统
//
//我们继续引导,直到函数返回0。 这是允许的
//我们有一个“reboot”命令。
//
操作
{
RC = NC_NetStart( hCfg、NetworkOpen、NetworkClose、NetworkIPAddr );
} while (rc >0);
//删除配置
CfgFree( hCfg );
//关闭 OS
MAIN_EXIT:
NC_SystemClose ();
return (0);
}
void DHCPestTask (void)
{
处理 dhcpService;
CI_SERVICE_DHCPc dhcpc;
TaskSleep (3000);
//在 IF-1上指定 DHCP 服务
bzero (&dhcpc,sizeof (dhcpc));
dhcpc.cisargs.Mode = CIS_FLG_IFIDXVALID;
dhcpc.cisargs.IfIdx = 1;
dhcpc.cisargs.pCbSrv =&ServiceReport;
printf ("添加 DCHP 之前");
//_mmCheck (MMCHECK_MAP、&printf);
CfgAddEntry (hCfg、CFGTAG 服务、CFGITEM_SERVICE_DHCPCLIENT、0、sizeof (dhcpc)、 (uint8*)&dhcpc,0);
printf ("添加 DCHP"之后);
//_mmCheck (MMCHECK_MAP、&printf);
TaskSleep (3000);
如果(CfgGetEntry (hCfg、CFGTAG 服务、CFGITEM_SERVICE_DHCPLIENT、1、&dhcpService)>0)
{
CfgRemoveEntry (hCfg、dhcpService);
}
printf ("删除 DCHP"后");
//_mmCheck (MMCHECK_MAP、&printf);
}
//
// NetworkOpen
//
//配置启动后调用此函数
//
静态空 NetworkOpen ()
{
TaskCreate( DHCPestTask、"DHCPTest"、OS_TASKPRINORM、0x1400、0、 0、0);
}
//
// NetworkClose
//
//此函数在网络关闭时调用,
//或不再为其分配任何 IP 地址时调用。
//
static void NetworkClose()
{//
DemonFree( hHello );
}//
NetworkIPAddr
//
//每当
系统中添加或删除 IP 地址绑定时,都会调用此函数。
//
static void NetworkIPAddr ( ipn ipaddr,uint IfIdx,uint fAdd )
{
IPN IPTmp;
if (fADD)
printf ("网络已添加:");
其他
printf ("网络已删除:");
//打印消息
iptmp =ntohl( ipaddr );
printf ("如果-%d:%d.%d.%d.%d\n"、IfIdx、
(uint8)(IPTmp>>24)&0xFF、(uint8)(IPTmp>16)&0xFF、
(uint8)(IPTmp>>8)&0xFF、(uint8) IPTmp&0xFF);
}
//
//服务状态报告
//
//此处是使用服务状态更新的快速示例
//
静态 char *taskr[]={"telnet"、"http"、"ips"、"DHCPs"、"DHCP"、"ReportStr"
、"、"dus"、"degr"、"dusch"、"degr"、"dusch"、"degr"、"ds"、"dusch"、"dus"、"dusch"、"dus"、"dus"、"degr"、"dus"、"dusch"、"dusch"、"dusch"
static void ServiceReport( uint item、uint Status、uint Report、handle h )
{
printf ("服务状态:%-9s:%-9s:%-9s:%-9s:%03d\n"、
TASKNAME[item-1]、StatusStr[Status]、
ReportStr[Report/256],Report&0xFF );
//
//添加到 DHCP 配置空间的示例
//
//使用 DHCP 客户端时,客户端可以完全控制访问
//到 CFGTAG _SYSINFO 空间中的前256个条目。
//
//请注意,DHCP 客户机将擦除除除除除以外的所有 CFGTAG _SYSINFO 标签
// CFGITEM_DHCP_HOSTNAME。 应用需要保持手动
// DHCP 标签范围中的条目,则维护它们的代码应该
//放置在此处。
//
//在这里,我们要手动将 DNS 服务器添加到配置中,但是
//我们只能在 DHCP 完成编程后执行它。
//
if (item =CFGITEM_SERVICE_DHCPCLIENT &&
状态=CI_SRV_STATUS_ENABLED &&
(报告=(nettools_STAT_Running|DHCPCODE_IPADD)||
报告=(nettools_STAT_Running|DHCPCODE_IPRENEW)))
{
IPN IPTmp;
//指定后手动添加 DNS 服务器
IPTmp = inet_addr (DNSserver);
if (IPTmp)
CfgAddEntry (0、CFGTAG _SYSINFO、CFGITEM_DHCP_DOMAINNAMESERVER、
0、sizeof (IPTmp)、(uint8 *)&IPTmp、0);
}
}
添加此代码后、我遇到了与 _mmCheck 函数相关的编译器错误、我现在在整个代码中对其进行注释以抑制该错误。
现在我的代码正在成功编译、但问题始于链接阶段、其中显示:
"./EK_TM4C1294XL.cmd"、第54行:错误#10099-D:程序将无法装入可用内存。 对齐方式对".bss"大小为0x5eb50的段运行定位失败。 可用存储器范围: SRAM 大小:0x40000 未使用:0x3e080 最大孔洞:0x3e080 错误#10010:链接期间遇到错误;未构建"NetworkCfgTest.out"
我想知道、我是否无法通过 Tiva 板上的 c 代码方法配置 NDK 堆栈、我认为这不是一种情况。
请指导我如何继续、以便成功构建静态 IP 地址并在运行时获取静态 IP 地址。
此致
