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.

[参考译文] CC2650:添加 SPI 驱动程序时出现 ZNP 编译错误

Guru**** 2949170 points

Other Parts Discussed in Thread: SYSBIOS, TIMAC, CC2650

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/681560/cc2650-znp-compilation-error-when-adding-spi-driver

器件型号:CC2650
主题中讨论的其他器件:SYSBIOS、 TIMAC、

您好!

 当我在 ZStack_home_1_02_02a_44539中添加 SPI 驱动程序支持并编译 ZNP 堆栈时、它将抛出以下错误。 如果我注释 SPIhandle = SPI_open (Board_SPI、&params)、则其正常。 以下错误的原因可能是什么。 我们非常感谢您的快速响应。

ZDUP.c ZDConfig.c ZDNwkMgr.c ZDObject.c ZDProfile.c ZDSecMgr.c   
zmac.c   
zmac_b.c   
znpapp_task.c   
链接  
ERROR[Lp011]:段放置失败  
         无法在<[0x200000c8-0x2000042f]中为段/块分配总估算最小大小为0x46bc 字节(最大对齐0x8)的空间、   
[0x20000450-0x200004ff]、[0x20000520-0x20004a13]>(总未提交空间0x4608)。  
         未提交:  
           [0x200000c8-0x2000042f]: 0x368  
           [0x20000200-0x2000042f]: 0x22c  
           [0x20000450-0x200004ff]:  0xb0  
           [0x20000520-0x20004a13]:0x42f4  
ERROR[Lp011]:段放置失败  
         无法在<[0x000000000000-0x0001cfff]>(总计)中为总估算最小大小为0x4c6c 字节(最大对齐0x4)的段/块分配空间   
未指定用途的空间0x4bf8)。  
         未提交:  
           [0x00000000-0x000000ff]:   0x8  
           [0x00000510-0x00000513]:   0x2  
           [0x0000058c-0x0000058f]:   0x3  
           [0x000005e8-0x0001cfff]:0x4bf0  
ERROR[Lp017]:计算段的压缩初始化程序时需要"ti_SysBIOS_KNL_Task_Module_State_0_readyQ__a"的地址   
data_ti_sysbios_KNL_Task_Module_state__V (app_prm3.orm3 #606)、但该地址尚未设置、因为压缩初始化程序的大小是   
以进行设置  
ERROR[Lp017]:计算的压缩初始化程序时需要"ti_sysbios_family_arm_m3/Hwi_Module_State_0_exACTIVE_A"的地址   
部分.data_ti_sysbios_family_arm_m3/Hwi_Module_state_V (app_prm3.orm3 #207)、但该地址尚未设置、因为大小为   
需要压缩初始化程序来进行设置  
ERROR[Lp017]:计算段的压缩初始化程序时需要"ti_SysBIOS_family_ARM_cc26xx_Timer_Object_Table__V_V"的地址   
data_ti_sysbios_KNL_Clock_Module_state__V (app_prm3.orm3 #397)、但该地址尚未设置、因为压缩初始化程序的大小是   
以进行设置  
ERROR[Lp017]:计算段的压缩初始化程序时需要"ti_SysBIOS_gates_GateMutex_Object__table___V"的地址   
data_ti_sysbios_module_state__V (app_prm3.orm3 #67)、但该地址尚未设置、因为压缩初始化程序的大小是   
以进行设置  
ERROR[Lp017]:计算段的压缩初始化程序时需要"ti_SysBIOS_KNL_Swi_Module_State_0_readyQ__a"的地址   
data_ti_sysbios_KNL_Swi_Module_state__V (app_prm3.orm3 #571)、但该地址尚未设置、因为压缩初始化程序的大小是   
以进行设置  
ERROR[Lp017]:计算段的压缩初始化程序时需要"ti_SysBIOS_family_ARM_cc26xx_Timer_Object_Table__V_V"的地址   
data_ti_sysbios_family_arm_cc26xx_Timer_Module_state__V (app_prm3.orm3 #154)、但自的大小以来、该地址尚未设置   
需要压缩初始化程序来进行设置  
运行链接器时出错  
 
错误总数:8.  
警告总数:0

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

    您似乎耗尽了闪存大小。 您是否向 ZNP 添加了许多自定义代码?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,黄晨
    感谢您的快速回复。 我没有添加任何其他自定义代码。 我已经为 SPI0添加了"ti/drivers/spi.h"并添加了 SPI_open、那么我本身就会收到错误。 如何进行优化以找到适合这种情况的空间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尝试在 znp.cfg 中注释掉以下 MT_SAPI 接口以重新构建。

    -dm_SAPI_FUNC
    -dm_SAPI_CB_FUNC

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,黄晨
    这没什么帮助。 是否有任何其他方法来优化它。 或者、我们能否通过直接配置寄存器而不是使用 RTOS 中的繁重型 SPI 驱动程序、在代码本身中实现 SPI 驱动程序。 您对此有什么参考吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您在 ZNP.cfg 中注释以下定义、它是否起作用?

    /* MT_ZDO 接口*/
    -dm_ZDO_CB_FUNC
    -dm_ZDO_FUNC
    -dmt_ZDO_Mgmt
    -dm_ZDO_extensions
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,黄晨
    这也不奏效。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    什么是电流误差?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,黄晨
    错误降至1。 但仍然是其放置失败。 请参阅以下错误消息


    zmac.c
    zmac_b.c
    znpapp_task.c
    链接
    ERROR[Lp015]:段放置失败:[0x20000520-0x20004a13]中的内容提交过度
    运行链接器时出错

    错误总数:1.
    警告总数:0
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您构建原始 ZNP 项目、它是否起作用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、原始 ZNP 项目工作正常。 即使在我的自定义项目中、我只注释掉 SPI_open、它也能正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可以附加修改后的源文件以便我可以在我的桌面上进行检查?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请参阅随附的 bellow main.c 只需用这个替换 main.c 即可

    //
    //! \file          main.c
    //! 简要         介绍 ZNP 应用程序的主条目
    //
    //  修订       的$Date:2015-01-27 17:10:29-0800 (2015年1月27日星期二)$
    //  修订版:     $Revision:42069美元
    //
    // 版权所有2015 Texas Instruments Incorporated。 保留所有权利。
    //
    //重要:您对本软件的使用仅限于这些特定权限
    //根据用户之间的软件许可协议条款授予
    //下载该软件的人员,其雇主(必须是您的雇主)
    //和德州仪器(TI)公司(以下简称"许可")。  您不能使用它
    //软件,除非您同意遵守许可条款。 许可证
    //限制您的使用,并且您确认软件可能未被修改,
    //复制或分发,除非与一起单独使用
    //德州仪器集成的射频器件
    //您的产品。  除上述目的外、您不得使用、
    //复制、复制、准备衍生作品、修改、分发、执行、
    //出于任何目的显示或销售本软件和/或其文档。
    //
    // 您进一步确认并同意软件和文档是
    // 按“原样”提供,不提供任何形式的明示或默示保证,l
    // 包括但不限于对适销性、所有权、
    // 不侵权和适合特定用途。 任何情况下均不得
    // 德州仪器或其许可人应根据合同承担责任或义务,
    // 疏忽、严格责任、贡献、违反保修或其他
    // 法律公平理论任何直接或间接的损害或费用
    // 包括但不限于任何偶然的、特殊的、间接的、惩罚性的
    // 或相应的损害、利润损失或数据损失、采购成本
    / 替代产品、技术、服务或第三方的任何索赔
    // (包括但不限于其任何抗辩)或其他类似费用。
    //
    // 如果您对您使用本软件的权利有任何疑问,
    // 请通过 www.ti.com 联系德州仪器公司。
    //
     
    秘书长的报告
    //包括
    秘书长的报告
    #include
    #include
    #include
    #include
     
    #include
    #include
    #include
     
    #include
     
    #include "iCall.h"
    #include "Board.h"
    #include "TIMAC 板.h"
    #include "CryptoBoard.h"
    #include
    #include
     
    /*临时空闲任务函数所需的头文件*/
    #include
    #include
    #include
    #include
     
    /*启用指令提取缓存所需的头文件*/
    #include
    #include
     
    #include "cpu.h"
    #include "znpapp_task.h"
    #include "inc/npi_task.h"
    #include "pwrmon.h"
     
    #include
    SPI_Handle     SPIhandle;
    SPI_Transaction spiTransaction;
    SPI_Params     参数;
    #define Board_SPI               0
    #define SPI_FREQUENCY           160000        // 160KHz
     
    秘书长的报告
    //定义
    秘书长的报告
     
    #define my_task_stack_size 600
     
    #define RFC_MODE_BLE                PRCM_RFCMODESEL_CURR_MODE1
    #define RFC_MODE_IEEE               PRCM_RFCMODESEL_CURR_MODE2
    #define RFC_MODE_ANT                PRCM_RFCMODESEL_CURR_MODE4
    #define RFC_MODE_万物_But ANT PRCM_RFCMODESEL_CURR_MODE5
    #define RFC_MODE_MONTH PRCM_RFCMODESEL_CURR_MODE6          
     
    #define SET_RFC_MODE (MODE) HWREG (PRCM_BASE + PRCM_O_RFCMODESEL)=(MODE)
     
    //需要运行最小电压电平
    #if!defined (min_VDD_run)
    #define MIN_VDD_RUN        MIN_VDD_POLL
    #endif
     
    秘书长的报告
    // typedef
    秘书长的报告
     
    秘书长的报告
    //全局变量
    秘书长的报告
     
    静态 Task_StructmyTask;
    静态特性 myTaskStack[my_task_stack_size];
     
     
    //
    //函数原型
    //
     
    //----------------------------------
    //! \brief     进入功能传递给 TIRTOS
    //!
    //! \param[in] a0    
    //! \param[in] A1    
    //!
    //! 返回    空
    //----------------------------------
    void taskFxn (UARg a0、UARg A1)
    {
        
      SPI_PARAMS_INIT (params);
       
      params.bitrate      = SPI_FREQUENCY;
      params.transferMode = SPI_MODE_BLOCKING;
      params.frameFormat  = SPI_POL1_PHA1;
      params.dataSize     = 8;
       
      SPIhandle = SPI_open (Board_SPI、params);
       
       /*禁止在空闲状态期间关闭 JTAG、VIMS、SYSBUS
       *因为 TIMAC 在空闲期间需要 SYSBUS。 *
       POWER_setConstraint (Power_IDLE_PD_Disallow);
        
       /*初始化电源监视器*/
       PWRMON_INIT();
        
       //确保电压电平足够高以运行
       while (PWRMON_CHECK (min_VDD_run)== false)
       {
         //在此处添加您自己的代码以执行某些操作、闪烁 LED、睡眠、某些操作
         //目前,我们将循环并等待电源到达
         // min_VDD_run 电平。
       }
     
       /*初始化 iCall 模块*/
       iCall_init();
        
       {
           CryptoCC26XX_Params CryptoCC26XXParams;
           extern CryptoCC26XX_Handle CryptoCC26XHandle;
            
           CryptoCC26XX_init();
           CryptoCC26XX_Params_init (加密 CC26XXParams);
           CryptoCC26XHandle = CryptoCC26XX_open (Board_crypto、false、CryptoCC26XXParams);
           if (!CryptoCC26XHxHandle)(如果!CryptoCC26XHxH
           {
               Task_exit();
           }
           crypto_init();
       }
        
        
       /*触发 ZNP 线程*/
       ZNPAppTask_task();
        
    }
     
    //----------------------------------
    //! \brief     TIRTOS 异常处理程序
    //!
    //! 返回    空
    //----------------------------------
    void exceptionHandler()
    {
       while (1){}
    }
     
    //----------------------------------
    //! 简要介绍     主函数
    //!
    //! 返回    空
    //----------------------------------
    void main()
    {
       Task_Params taskParams;
        
       memset (myTaskStack、0xDD、sizeof (myTaskStack));
        
       //设置 RFC 模式以支持 IEEE802.15.4
       //注意:这必须在 RF 内核从复位中释放之前完成!
       SET_RFC_MODE (RFC_MODE_IEEE);
        
       //启用 ICache 预取
       VIMSConfigure (VIMS_BASE、TRUE、TRUE);
        
       //启用缓存
       VIMSModeSet (VIMS_BASE、VIMS_MODE_ENABLED);
        
       针对诸如 LED 等与电路板相关的东西的/*初始化
       *遵循 TI-RTOS 惯例*/
       PIN_init (BoardGpioInitTable);
        
       //配置任务。
       Task_Params_init (&taskParams);
       taskParams.stack = myTaskStack;
       taskParams.STACKSIZE = my_task_stack_size;
       taskParams.priority = 1;
       Task_construction (&myTask、taskFxn、_taskParams、NULL);
        
       BIOS_start();  //启用中断并启动 SYS/BIOS */
    }
     
     
    //----------------------------------
    //! \brief     要连接到 TI-RTOS 的错误处理程序
    //!
    //! \param[in] EB  Error_Block
    //!
    //! 返回    空
    //----------------------------------
    空 smallErrorHook (Error_Block *EB)
    {
       while (1){}
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否将 main.c 附加到 E2E 论坛而不是将其粘贴到该论坛上?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../1526.main.cPlease参见随附的

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

    您好、Bibin、

    要了解 CC2650 ZNP、您需要了解的是、您对闪存和 RAM 空间的限制非常有限。  从 ICF 文件中可以看到、0x1D000/118784的闪存可用于只读存储器(保留0x1000、SVN 保留0x2000)、并且允许0x4A13/18963 RAM 用于读写存储器。  然后查看默认映射文件、您可以看到117k 和18.5k 分别已被闪存/RAM 占用。 因此、您必须对网状网络的大小和配置做出一些牺牲。 以下是一些可更改的变量:

    nwk_globals.h 中的 NWK_MAX_DEVICE_LIST 和 znp_f8wConfig.cfg 中的 MAX_RTG_ENTRINTRUTERINTRE 会影响 RAM
    C/C++编译器中的 TC_LINKKEY_JOIN 和 DSECMGR_TC_DEVICE_MAX ->预处理器会影响闪存

    例如、通过更改为 Pro Secure Build (无链路密钥)或将保留页数减至零、我消除了闪存错误、并将我的 NWK_MAX_DEVICE_LIST 减至16、将 MAX_RTG_ENTRINTRUES 减至30、我能够在没有 RAM 问题的情况下构建项目。  您的 SPI 实施目前增加了2.5k 闪存和408字节 RAM、这两个都只会随着功能的增加而增加。

    此致、
    Ryan