This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C1294NCPDT:在不使用 xconfig 的情况下设置 NDK 配置

Guru**** 2479265 points
Other Parts Discussed in Thread: TM4C1294NCPDT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/690580/rtos-tm4c1294ncpdt-setting-ndk-configuration-without-xconfig

器件型号:TM4C1294NCPDT
主题中讨论的其他器件: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 地址。

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Piyush、

    对于 MSP432E4器件、我们已从 NDK 的.cfg 配置中移除。 主要原因是 MSP432E3 SDK 在 TI-RTOS 和 FreeRTOS 上提供 NDK 支持。  我在 SimpleLink MSP432E4 SDK 网络示例中附加了用于设置堆栈的 NDK.c 文件。 我强烈建议您查看该 SDK 的示例。 我甚至会安装( )并导入示例以查看所有项目设置。

    我希望大小问题是因为您没有指定 NDK 缓冲区的大小、并且它们默认为大大小。 同样、SimpleLink SDK 示例显示了如何在运行时代码中设置这些代码。 下面讨论了 NDK 中的存储器使用情况:  

    当然、它更侧重  于.cfg 配置、但 gist 和名称足够相似、可以连接点。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Todd:

    实际上、我没有使用任何基于 MSP432的控制器。 我的控制器是 TM4C1294NCPDT、它是基于 ARM cortex M4F 的微控制器。

    因此,请告诉我哪一个将是查找通过 c 编码而不是通过 xconfig 设置 TI-NDK 设置的正确参考。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我想说查看 MSP432E4 SDK 的示例。 我知道这是一个不同的器件(但仍然是 cortex M4F MCU)、但 NDK 部分是相同的。 NDK 用户指南和参考指南也对其进行了介绍。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Todd、

    如果您不介意,请向我提供 SDK 下载链接。
    这将非常有用、我不会感到困惑、因为您知道 TI 提供的大量文档和软件包会使任何人感到困惑。

    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    链接在我的第一个回复中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Piyush、

    您是否仍在使用原始应用程序(您在此主题中的原始帖子中提到的应用程序)?

    如果是、我想我知道它为什么不起作用。

    您能否在该应用程序中添加几个断点、然后重新启动/运行以查看它们按哪个顺序执行?

    断点:

    1. TI_NDK_CONFIG_Global_stackThread ()
    2. StackTest()

    上述2个函数中的哪一个先运行? 由于这些函数的运行顺序、您可能会看到问题。

    其他一些事项:

    一般性评论-我认为您复制的代码所使用的 OMAPL138 NSP 已经过时、应该用于旧版本的 NDK (与您使用的 NDK 版本相比)。 因此、下面的一些评论是由于这种情况、而不是您所做的任何事情。

    [引用用户="Piyush Pandey22"]char*LocalIPAddr = "0.0.0.0";[/quot]
    如果需要静态 IP 地址、则应将其更新为要使用的 IP 地址。

    这可能是您无法使应用程序使用静态 IP 地址的原因。

    但是、您当前已将代码配置为 DHCP 客户端、因此将尝试从 DHCP 服务器...se获取 IP 地址。

    [引用用户="Piyush Pandey22"]
    staticvoidNetworkOpen()
    {
        TaskCreate( DHCPTestTask, "DHCPTest", OS_TASKPRINORM, 0x1400, 0, 0, 0 );
    }
    [/报价] 

    [引用用户="Piyush Pandey22"]
    voidDHCPTestTask(void)
    {
        HANDLEdhcpService;
        CI_SERVICE_DHCPC dhcpc;
        TaskSleep(3000);
        // Specify DHCP Service on IF-1
        bzero( &dhcpc, sizeof(dhcpc) );
        dhcpc.cisargs.Mode   = CIS_FLG_IFIDXVALID;
        dhcpc.cisargs.IfIdx  = 1;
        dhcpc.cisargs.pCbSrv = &ServiceReport;
        printf("Before adding DCHP");
        //_mmCheck(MMCHECK_MAP, &printf);
        CfgAddEntry(hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPCLIENT, 0, sizeof(dhcpc), (UINT8*)&dhcpc, 0);
        printf("After adding DCHP");
        //_mmCheck(MMCHECK_MAP, &printf);
        TaskSleep(3000);
        if(CfgGetEntry(hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPCLIENT, 1, &dhcpService) > 0)
        {
            CfgRemoveEntry(hCfg, dhcpService);
        }
        printf("After removing DCHP");
        //_mmCheck(MMCHECK_MAP, &printf);
    }
    [/报价] 

    如果您的目标是让应用程序使用静态 IP 地址(如您所述)、则此代码不能为您提供帮助。 我认为您应该删除它。


    [引用 USER="Piyush Pandey22"]//评估堆栈在//评估周期超时前5分钟调用此回调函数。 void evalCallBack(){printf("Stack 将在5分钟内关闭\n");}
    [引用用户="Piyush Pandey22"]
        // The evaluation version of TCP/IP Stack restricts usage of stack
        // to maximum of 24 Hours. If application wants to be notified 5 min
        // before the timeout, it can register a callback function by using
        // the following configuration code section.
        /*{
            void (*pFxn)() = &evalCallBack;
            CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_SYSINFO_EVALCALLBACK, 0,
                        sizeof(void(*)()), (UINT8*) &pFxn, 0 );
        }*/
    [/报价] 
    您可以删除此代码。 NDK 堆栈不再有评估版本。 这是旧的封闭源日...

    [引用 user="Piyush Pandey22"] printf ()
    您应该更新复制的 C 代码以使用另一个打印函数。 'printf'会显著降低性能。 NDK 以前具有其自身的'printf()实现方案,该方案具有更好的性能,但后来被删除。

    我建议改用 System_printf()。 请注意、您还需要在*。cfg 文件中配置 SysMin、然后使用 ROV 检查 SysMin 缓冲区的输出。

    您可以按如下方式配置 SysMin (粘贴到* cfg 文件的末尾):

    /*========================= 系统配置=================== *
    VAR 系统= xdc.useModule('xdc.runtime.System');
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    SysMin。bufSize = 4096;
    System.SupportProxy = SysMin;


    您可以在 C 代码中使用 System_printf(),如下所示:

    #include
    #include

    void someFxn()

       system_printf ("hello!\n");


    [引用用户="Piyush Pandey22"]HANDLE           hCfg;[/quot]
    我不会把它变成一个全局变量... 我会将其移动到您的 StackTest()函数中。




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Piyush、

    这是否得到了解决?

    Todd

    [更新6/11:我将此标记为"TI 认为已解决"。 如果您不同意、请发布回复。]