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.

CC2530: 使用IAR8.10编译ZStack2问题

Part Number: CC2530
Other Parts Discussed in Thread: Z-STACK

我在构建工程时出现如下错误

Error[e27]: Entry "Control" in module AddressMenu ( D:\ZM\BSZigbee\Gateway\Projects\zstack\Samples\SampleApp\CC2530DB\CoordinatorEB-Pro\Obj\AddressMenu.r51 ) redefined in module OSAL_SampleApp ( D:\ZM\BSZigbee\Gateway\Projects\zstack\Samples\SampleApp\CC2530DB\CoordinatorEB-Pro\Obj\OSAL_SampleApp.r51 )
Error while running Linker

但是我在这两份代码文件中都没有找到任何名为Control的定义,请问如何解决?

  • 您好,

    感谢您的对TI产品的关注!为更加有效地解决您的问题,我需要多一些时间查看这个问题,稍后会为您解答。

  • 好的,您需要我的代码文件吗?

  • 您好,

    您可以发过来。我这边还有几个问题:您使用哪个 Z-Stack 版本?您是否使用版本说明中描述的匹配 IAR 版本?

  • 請問你使用的Z-Stack版本?有使用release note裡面提到對應的IAR版本嗎?

  • 使用ZStack2.3.0-1.4.0,IAR版本为8.10

  • ZStack2.3.0-1.4.0應該不是用使用ZStack2.3.0-1.4.0,你要不要看一下ZStack2.3.0-1.4.0安裝目錄下的release note看看IAR該用什麼版本;另外ZStack2.3.0-1.4.0太舊了,建議你換用最新的Z-Stack 3.0.2

  • 原始协议栈内自带的SmapleApp可以编译,但是加入我的代码后不能编译了

  • 您好,

    TI 将无法支持此已弃用的 Z-Stack 软件。 请按照 YiKai 关于 IAR 版本的说明进行操作,然后确认默认项目可以正确构建。 接下来,确定导致问题的特定应用程序代码,并相应地进行修改以避免问题。

  • 定位到了出错代码,但是代码中并没有定义任何名为Control的,可能是编译时生成的导致链接错误

  • 這個應該就是IAR版本的問題,如果沒記錯的話你至少要用7.50的版本

  • 但是我使用的是8.10?

  • 所以你至少要用7.50的版本

  • 这个是8.10下的报错(报错内容如题),8.10应该高于7.5吧?

    /*********************************************************************
     * INCLUDES
     */
    #include "SampleAppHw.h"
    
    #include "OSAL.h"
    #include "OSAL_Nv.h"
    #include "ZGlobals.h"
    #include "AF.h"
    #include "aps_groups.h"
    #include "ZDApp.h"
    
    #include "OnBoard.h"
    
    /* HAL */
    #include "hal_lcd.h"
    #include "hal_led.h"
    #include "hal_key.h"
    
    #ifndef SAMPLEAPP_H
    #define SAMPLEAPP_H
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    /*********************************************************************
     * INCLUDES
     */
    #include "ZComDef.h"
    
    /*********************************************************************
     * CONSTANTS
     */
    
    // These constants are only for example and should be changed to the
    // device's needs
    #define SAMPLEAPP_ENDPOINT           20
    
    #define SAMPLEAPP_PROFID             0x0F08
    #define SAMPLEAPP_DEVICEID           0x0001
    #define SAMPLEAPP_DEVICE_VERSION     0
    #define SAMPLEAPP_FLAGS              0
    
    #define SAMPLEAPP_MAX_CLUSTERS       2
    #define SAMPLEAPP_PERIODIC_CLUSTERID 1
    #define SAMPLEAPP_FLASH_CLUSTERID    2
    #define SAMPLEAPP_COM_CLUSTERID      3
    #define SAMPLEAPP_P2P_CLUSTERID      4
      
    #define DATA_PIN P0_4                  //定义P0.5口为继电器的控制端
    
    #define ZD_NV_START_ADDRESS 0x0402     //定义掉电存储起始条目地址
      
    // Send Message Timeout
    #define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT   1000     // Every 1 seconds
    
    // Application Events (OSAL) - These are bit weighted definitions.
    #define SAMPLEAPP_SEND_PERIODIC_MSG_EVT       0x0001
      
    // Group ID for Flash Command
    #define SAMPLEAPP_FLASH_GROUP                 0x0001
      
    // Flash Command Duration - in milliseconds
    #define SAMPLEAPP_FLASH_DURATION              1000
      
    
    // This list should be filled with Application specific Cluster IDs.
    const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
    {
      SAMPLEAPP_PERIODIC_CLUSTERID,
    };
    
    void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
    
    const SimpleDescriptionFormat_t SampleApp_SimpleDesc =
    {
      SAMPLEAPP_ENDPOINT,              //  int Endpoint;
      SAMPLEAPP_PROFID,                //  uint16 AppProfId[2];
      SAMPLEAPP_DEVICEID,              //  uint16 AppDeviceId[2];
      SAMPLEAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
      SAMPLEAPP_FLAGS,                 //  int   AppFlags:4;
      SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
      (cId_t *)SampleApp_ClusterList,  //  uint8 *pAppInClusterList;
      SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
      (cId_t *)SampleApp_ClusterList   //  uint8 *pAppInClusterList;
    };
    
    // This is the Endpoint/Interface description.  It is defined here, but
    // filled-in in SampleApp_Init().  Another way to go would be to fill
    // in the structure here and make it a "const" (in code space).  The
    // way it's defined in this sample app it is define in RAM.
    endPointDesc_t SampleApp_epDesc;
    
    /*********************************************************************
     * LOCAL VARIABLES
     */
    uint8 SampleApp_TaskID;   // Task ID for internal task/event processing
                              // This variable will be received when
                              // SampleApp_Init() is called.
    devStates_t SampleApp_NwkState;
    
    uint8 SampleApp_TransID;  // This is the unique message ID (counter)
    
    afAddrType_t SampleApp_Periodic_DstAddr;
    afAddrType_t SampleApp_Flash_DstAddr;
    
    aps_Group_t SampleApp_Group;
    
    
    uint8 SampleAppPeriodicCounter = 0;
    uint8 SampleAppFlashCounter = 0;
    
    /*********************************************************************
     * GLOBAL VARIABLES
     */
    uint8 LedState = 0;                  //LED状态
    
    uint8 FunState = 0;                  //风扇状态
    
    uint8 Control = 0;                   //开关控制,0为一起,1为灯,2为风扇
    
    uint16 ZD_NV_OFFSET = 0xFFF;         //掉电存储条目偏移,初始化最大
    
    uint16 Local_Fun_Code = 0xFFFF;      //本机功能代码,初始化最大
    
    uint16 Local_Address = 0xFFF;        //本机地址码,初始化最大
    
    uint16 Gateway_Bus_Address = 0xFFF;  //子网总线地址,初始化最大
      
      
    /*********************************************************************
     * STRUCTS
     */
      
    //本机信息
    struct EquPar
    {
      uint16 FunCode;
      uint16 Address;
    };
    
    //地址功能表信息
    struct AddressInfo
    {
      uint16 BusAddress;
      uint16 OffsetAddress;
    };
    
    //数据包
    struct Packet
    {
      uint16 SourceAddress;
      uint16 TargetAddress;
      uint16 Type;
      uint16 Data;
      uint16 Verify;
    };
    
    struct Parket* ParketTempBuf = NULL;
    
    
    extern void SampleApp_Init( uint8 task_id );
    
    void SampleApp_HandleKeys( uint8 shift, uint8 keys );
    
    /*********************************************************************
     * FUNCTIONS
     */
    
    void SampleApp_SendPeriodicMessage( void );
    
    extern UINT16 SampleApp_ProcessEvent( uint8 task_id, uint16 events );
    
    extern void ReceiveData(struct Packet Data);
    
    extern uint8 ZigbeeSend(uint16 Data, uint16 Address, uint16 Type);
    
    
    extern uint16 Get_BusAddress(void);
    
    extern void AddressTable_Init(void);
    
    extern uint8* ConversionToRF(struct Packet Data);
    
    extern void ConversionToData(uint8* Data);
    
    extern void AddDevice(uint16 Type);
    
    
    /*********************************************************************
    *********************************************************************/
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* SAMPLEAPP_H */
    
    /*********************************************************************
     * INCLUDES
     */
    #include "SampleApp.h"
    #include "SampleAppHw.h"
    
    #include "OSAL.h"
    #include "OSAL_Nv.h"
    #include "ZGlobals.h"
    #include "AF.h"
    #include "aps_groups.h"
    #include "ZDApp.h"
    
    #include "OnBoard.h"
    
    /* HAL */
    #include "hal_lcd.h"
    #include "hal_led.h"
    #include "hal_key.h"
    
    
    /*********************************************************************
     * PUBLIC FUNCTIONS
     */
    
    void SampleApp_Init( uint8 task_id )
    {
      SampleApp_TaskID = task_id;
      SampleApp_NwkState = DEV_INIT;
      SampleApp_TransID = 0;
    
      P0SEL &= ~0x10;               //设置P0.4口为普通IO
      P0DIR |= 0x10;                //设置P0.4口为输出
      AddressTable_Init();          //执行地址功能表初始化
      
      // Device hardware initialization can be added here or in main() (Zmain.c).
      // If the hardware is application specific - add it here.
      // If the hardware is other parts of the device add it in main().
    
     #if defined ( BUILD_ALL_DEVICES )
      // The "Demo" target is setup to have BUILD_ALL_DEVICES and HOLD_AUTO_START
      // We are looking at a jumper (defined in SampleAppHw.c) to be jumpered
      // together - if they are - we will start up a coordinator. Otherwise,
      // the device will start as a router.
      if ( readCoordinatorJumper() )
        zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;
      else
        zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;
    #endif // BUILD_ALL_DEVICES
    
    #if defined ( HOLD_AUTO_START )
      // HOLD_AUTO_START is a compile option that will surpress ZDApp
      //  from starting the device and wait for the application to
      //  start the device.
      ZDOInitDevice(0);
    #endif
    
      // Setup for the periodic message's destination address
      // Broadcast to everyone
      SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
      SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
      SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
    
      // Setup for the flash command's destination address - Group 1
      SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;
      SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
      SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP; //组号1
      
      // Fill out the endpoint description.
      SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;
      SampleApp_epDesc.task_id = &SampleApp_TaskID;
      SampleApp_epDesc.simpleDesc
                = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
      SampleApp_epDesc.latencyReq = noLatencyReqs;
    
      // Register the endpoint description with the AF
      afRegister( &SampleApp_epDesc );
    
      // Register for all key events - This app will handle all key events
      RegisterForKeys( SampleApp_TaskID );
    
      // By default, all devices start out in Group 1
      SampleApp_Group.ID = 0x0001;
      osal_memcpy( SampleApp_Group.name, "Group 1", 7 );
      aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
    
    #if defined ( LCD_SUPPORTED )
      HalLcdWriteString( "SampleApp", HAL_LCD_LINE_1 );
    #endif
    }
    
    void SampleApp_HandleKeys( uint8 shift, uint8 keys )
    {
      (void)shift;  // Intentionally unreferenced parameter
      
      if ( keys & HAL_KEY_SW_6 )
      {
        SampleApp_SendPeriodicMessage();    //发送数据
      }
    
      if ( keys & HAL_KEY_SW_1 )
      {
        /* The Flashr Command is sent to Group 1.
         * This key toggles this device in and out of group 1.
         * If this device doesn't belong to group 1, this application
         * will not receive the Flash command sent to group 1.
         */
        aps_Group_t *grp;
        grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
        if ( grp )
        {
          // Remove from the group
          aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
        }
        else
        {
          // Add to the flash group
          aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
        }
      }
    }
    
    
    
    
    /*********************************************************************
    *********************************************************************/
    
    /*********************************************************************
     * INCLUDES
     */
    #include "SampleApp.h"
    #include "OSAL.h"
    #include "OSAL_Nv.h"
    #include "ZGlobals.h"
    #include "aps_groups.h"
    #include "ZDApp.h"
    
    #include "OnBoard.h"
    
    uint16 Get_BusAddress(void){
      
      uint16 Results = 0xFFF;     //总线地址,初始化为最大值
      
      return Results;
    }
    
    
    void AddressTable_Init(void){
      
      struct EquPar LocalTempBuf1, InitTempBuf1;
      uint8 InitNVStatus1 = osal_nv_item_init(ZD_NV_START_ADDRESS, sizeof(LocalTempBuf1), NULL);    //初始化本机信息条目
        
      if(InitNVStatus1 != NV_OPER_FAILED){     //判断读取成功
        
        if(InitNVStatus1 == SUCCESS){      //非首次组网
          
          osal_nv_read(ZD_NV_START_ADDRESS, 0, sizeof(LocalTempBuf1), &LocalTempBuf1);    //读取本机信息条目
          
          Local_Fun_Code = LocalTempBuf1.FunCode;
          Local_Address = LocalTempBuf1.Address;
          
        }
        else if(InitNVStatus1 == NV_ITEM_UNINIT){      //首次组网(本代码为网关)
          
          InitTempBuf1.FunCode = 0x0001;
          InitTempBuf1.Address = 0x000;
          
          osal_nv_write(ZD_NV_START_ADDRESS, 0, sizeof(InitTempBuf1), &InitTempBuf1);     //网关信息写入,网关地址永为0x000,网关功能码为0x0001
          
        }
        
      }
      
      struct AddressInfo LocalTempBuf2, InitTempBuf2;
      uint8 InitNVStatus2 = osal_nv_item_init(ZD_NV_START_ADDRESS+1, sizeof(LocalTempBuf2), NULL);      //初始化地址表头条目
        
      if(InitNVStatus2 != NV_OPER_FAILED){      //判断读取成功
        
        if(InitNVStatus2 == SUCCESS){     //非首次组网
          
          osal_nv_read(ZD_NV_START_ADDRESS+1, 0, sizeof(LocalTempBuf2), &LocalTempBuf2);      //读取原地址表头
          
          Gateway_Bus_Address = LocalTempBuf2.BusAddress;
          ZD_NV_OFFSET = LocalTempBuf2.OffsetAddress;
          
        }
        else if(InitNVStatus2 == NV_ITEM_UNINIT){     //首次组网(本代码为网关)
          
          InitTempBuf2.BusAddress = Get_BusAddress();
          InitTempBuf2.OffsetAddress = 2;
          ZD_NV_OFFSET = 2;
          
          osal_nv_write(ZD_NV_START_ADDRESS+1, 0, sizeof(InitTempBuf2), &InitTempBuf2);     //获取子网地址信息,偏移地址为3,并向服务器索取总线地址
        }
        
      }
      
      return;
    }
    
    
    void AddDevice(uint16 Type){
      
      struct EquPar DeviceTempBuf;
      uint8 InitNVStatus1 = osal_nv_item_init(ZD_NV_START_ADDRESS+ZD_NV_OFFSET, sizeof(DeviceTempBuf), NULL);     //新增一条地址表
      
      if(InitNVStatus1 == NV_ITEM_UNINIT){
        
        DeviceTempBuf.FunCode = Type;
        DeviceTempBuf.Address = 0x000 + ZD_NV_OFFSET - 1;
        
        osal_nv_write(ZD_NV_START_ADDRESS+ZD_NV_OFFSET, 0, sizeof(DeviceTempBuf), &DeviceTempBuf);
        //ZigbeeSend();
        ZD_NV_OFFSET++;
        
        struct AddressInfo TempBuf;
        uint8 InitNVStatus2 = osal_nv_item_init(ZD_NV_START_ADDRESS+1, sizeof(TempBuf), NULL);
        
        if(InitNVStatus2 == SUCCESS){
          
          TempBuf.BusAddress = Gateway_Bus_Address;
          TempBuf.OffsetAddress = ZD_NV_OFFSET;
          
          osal_nv_write(ZD_NV_START_ADDRESS+1, 0, sizeof(TempBuf), &TempBuf);
            
        }
      }
      return;
    }
    /**************************************************************************************************
      Filename:       OSAL_SampleApp.c
      Revised:        $Date: 2008-02-07 12:10:00 -0800 (Thu, 07 Feb 2008) $
      Revision:       $Revision: 16360 $
    
      Description:    This file contains all the settings and other functions
                      that the user should set and change.
    
    
      Copyright 2007 Texas Instruments Incorporated. All rights reserved.
    
      IMPORTANT: Your use of this Software is limited to those specific rights
      granted under the terms of a software license agreement between the user
      who downloaded the software, his/her employer (which must be your employer)
      and Texas Instruments Incorporated (the "License").  You may not use this
      Software unless you agree to abide by the terms of the License. The License
      limits your use, and you acknowledge, that the Software may not be modified,
      copied or distributed unless embedded on a Texas Instruments microcontroller
      or used solely and exclusively in conjunction with a Texas Instruments radio
      frequency transceiver, which is integrated into your product.  Other than for
      the foregoing purpose, you may not use, reproduce, copy, prepare derivative
      works of, modify, distribute, perform, display or sell this Software and/or
      its documentation for any purpose.
    
      YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
      PROVIDED 揂S IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
      INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
      NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
      TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
      NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
      LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
      INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
      OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
      OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
      (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
    
      Should you have any questions regarding your right to use this Software,
      contact Texas Instruments Incorporated at www.TI.com.
    **************************************************************************************************/
    
    /*********************************************************************
     * INCLUDES
     */
    
    #include "ZComDef.h"
    #include "hal_drivers.h"
    #include "OSAL.h"
    #include "OSAL_Tasks.h"
    
    #if defined ( MT_TASK )
      #include "MT.h"
      #include "MT_TASK.h"
    #endif
    
    #include "nwk.h"
    #include "APS.h"
    #include "ZDApp.h"
    #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
      #include "ZDNwkMgr.h"
    #endif
    #if defined ( ZIGBEE_FRAGMENTATION )
      #include "aps_frag.h"
    #endif
    
    #include "SampleApp.h"
    
    /*********************************************************************
     * GLOBAL VARIABLES
     */
    
    // The order in this table must be identical to the task initialization calls below in osalInitTask.
    const pTaskEventHandlerFn tasksArr[] = {
      macEventLoop,
      nwk_event_loop,
      Hal_ProcessEvent,
    #if defined( MT_TASK )
      MT_ProcessEvent,
    #endif
      APS_event_loop,
    #if defined ( ZIGBEE_FRAGMENTATION )
      APSF_ProcessEvent,
    #endif
      ZDApp_event_loop,
    #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
      ZDNwkMgr_event_loop,
    #endif
      SampleApp_ProcessEvent
    };
    
    const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] );
    uint16 *tasksEvents;
    
    /*********************************************************************
     * FUNCTIONS
     *********************************************************************/
    
    /*********************************************************************
     * @fn      osalInitTasks
     *
     * @brief   This function invokes the initialization function for each task.
     *
     * @param   void
     *
     * @return  none
     */
    void osalInitTasks( void )
    {
      uint8 taskID = 0;
    
      tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
      osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
    
      macTaskInit( taskID++ );
      nwk_init( taskID++ );
      Hal_Init( taskID++ );
    #if defined( MT_TASK )
      MT_TaskInit( taskID++ );
    #endif
      APS_Init( taskID++ );
    #if defined ( ZIGBEE_FRAGMENTATION )
      APSF_Init( taskID++ );
    #endif
      ZDApp_Init( taskID++ );
    #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
      ZDNwkMgr_Init( taskID++ );
    #endif
      SampleApp_Init( taskID );
    }
    
    /*********************************************************************
    *********************************************************************/
    

  • 8.10是高于7.5、所以不能編譯成功

  • 但是协议栈的原版SmapleApp使用IAR7.5打不开

  • 你有查看ZStack2.3.0-1.4.0安裝目錄下的release note看看IAR該用什麼版本嗎?

  • 显示8.10,并且8.10确实可以编译协议栈原始的SmapleApp

  • 并且8.10确实可以编译协议栈原始的SmapleApp

    如果是這樣的話你的問題是?

  • 问题报错在原文中已给出,报错代码在之前的回复中写到了

  • 使用ZStack2.3.0-1.4.0,IAR版本为8.10,和文档中是完全匹配的

    代码如下:

    /**************************************************************************************************
      Filename:       OSAL_SampleApp.c
      Revised:        $Date: 2008-02-07 12:10:00 -0800 (Thu, 07 Feb 2008) $
      Revision:       $Revision: 16360 $
    
      Description:    This file contains all the settings and other functions
                      that the user should set and change.
    
    
      Copyright 2007 Texas Instruments Incorporated. All rights reserved.
    
      IMPORTANT: Your use of this Software is limited to those specific rights
      granted under the terms of a software license agreement between the user
      who downloaded the software, his/her employer (which must be your employer)
      and Texas Instruments Incorporated (the "License").  You may not use this
      Software unless you agree to abide by the terms of the License. The License
      limits your use, and you acknowledge, that the Software may not be modified,
      copied or distributed unless embedded on a Texas Instruments microcontroller
      or used solely and exclusively in conjunction with a Texas Instruments radio
      frequency transceiver, which is integrated into your product.  Other than for
      the foregoing purpose, you may not use, reproduce, copy, prepare derivative
      works of, modify, distribute, perform, display or sell this Software and/or
      its documentation for any purpose.
    
      YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
      PROVIDED 揂S IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
      INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
      NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
      TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
      NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
      LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
      INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
      OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
      OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
      (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
    
      Should you have any questions regarding your right to use this Software,
      contact Texas Instruments Incorporated at www.TI.com.
    **************************************************************************************************/
    
    /*********************************************************************
     * INCLUDES
     */
    
    #include "ZComDef.h"
    #include "hal_drivers.h"
    #include "OSAL.h"
    #include "OSAL_Tasks.h"
    
    #if defined ( MT_TASK )
      #include "MT.h"
      #include "MT_TASK.h"
    #endif
    
    #include "nwk.h"
    #include "APS.h"
    #include "ZDApp.h"
    #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
      #include "ZDNwkMgr.h"
    #endif
    #if defined ( ZIGBEE_FRAGMENTATION )
      #include "aps_frag.h"
    #endif
    
    #include "SampleApp.h"
    
    /*********************************************************************
     * GLOBAL VARIABLES
     */
    
    // The order in this table must be identical to the task initialization calls below in osalInitTask.
    const pTaskEventHandlerFn tasksArr[] = {
      macEventLoop,
      nwk_event_loop,
      Hal_ProcessEvent,
    #if defined( MT_TASK )
      MT_ProcessEvent,
    #endif
      APS_event_loop,
    #if defined ( ZIGBEE_FRAGMENTATION )
      APSF_ProcessEvent,
    #endif
      ZDApp_event_loop,
    #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
      ZDNwkMgr_event_loop,
    #endif
      SampleApp_ProcessEvent
    };
    
    const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] );
    uint16 *tasksEvents;
    
    /*********************************************************************
     * FUNCTIONS
     *********************************************************************/
    
    /*********************************************************************
     * @fn      osalInitTasks
     *
     * @brief   This function invokes the initialization function for each task.
     *
     * @param   void
     *
     * @return  none
     */
    void osalInitTasks( void )
    {
      uint8 taskID = 0;
    
      tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
      osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
    
      macTaskInit( taskID++ );
      nwk_init( taskID++ );
      Hal_Init( taskID++ );
    #if defined( MT_TASK )
      MT_TaskInit( taskID++ );
    #endif
      APS_Init( taskID++ );
    #if defined ( ZIGBEE_FRAGMENTATION )
      APSF_Init( taskID++ );
    #endif
      ZDApp_Init( taskID++ );
    #if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
      ZDNwkMgr_Init( taskID++ );
    #endif
      SampleApp_Init( taskID );
    }
    
    /*********************************************************************
    *********************************************************************/

    /*********************************************************************
     * INCLUDES
     */
    #include "SampleApp.h"
    #include "OSAL.h"
    #include "OSAL_Nv.h"
    #include "ZGlobals.h"
    #include "aps_groups.h"
    #include "ZDApp.h"
    
    #include "OnBoard.h"
    
    uint16 Get_BusAddress(void){
      
      uint16 Results = 0xFFF;     //总线地址,初始化为最大值
      
      return Results;
    }
    
    
    void AddressTable_Init(void){
      
      struct EquPar LocalTempBuf1, InitTempBuf1;
      uint8 InitNVStatus1 = osal_nv_item_init(ZD_NV_START_ADDRESS, sizeof(LocalTempBuf1), NULL);    //初始化本机信息条目
        
      if(InitNVStatus1 != NV_OPER_FAILED){     //判断读取成功
        
        if(InitNVStatus1 == SUCCESS){      //非首次组网
          
          osal_nv_read(ZD_NV_START_ADDRESS, 0, sizeof(LocalTempBuf1), &LocalTempBuf1);    //读取本机信息条目
          
          Local_Fun_Code = LocalTempBuf1.FunCode;
          Local_Address = LocalTempBuf1.Address;
          
        }
        else if(InitNVStatus1 == NV_ITEM_UNINIT){      //首次组网(本代码为网关)
          
          InitTempBuf1.FunCode = 0x0001;
          InitTempBuf1.Address = 0x000;
          
          osal_nv_write(ZD_NV_START_ADDRESS, 0, sizeof(InitTempBuf1), &InitTempBuf1);     //网关信息写入,网关地址永为0x000,网关功能码为0x0001
          
        }
        
      }
      
      struct AddressInfo LocalTempBuf2, InitTempBuf2;
      uint8 InitNVStatus2 = osal_nv_item_init(ZD_NV_START_ADDRESS+1, sizeof(LocalTempBuf2), NULL);      //初始化地址表头条目
        
      if(InitNVStatus2 != NV_OPER_FAILED){      //判断读取成功
        
        if(InitNVStatus2 == SUCCESS){     //非首次组网
          
          osal_nv_read(ZD_NV_START_ADDRESS+1, 0, sizeof(LocalTempBuf2), &LocalTempBuf2);      //读取原地址表头
          
          Gateway_Bus_Address = LocalTempBuf2.BusAddress;
          ZD_NV_OFFSET = LocalTempBuf2.OffsetAddress;
          
        }
        else if(InitNVStatus2 == NV_ITEM_UNINIT){     //首次组网(本代码为网关)
          
          InitTempBuf2.BusAddress = Get_BusAddress();
          InitTempBuf2.OffsetAddress = 2;
          ZD_NV_OFFSET = 2;
          
          osal_nv_write(ZD_NV_START_ADDRESS+1, 0, sizeof(InitTempBuf2), &InitTempBuf2);     //获取子网地址信息,偏移地址为3,并向服务器索取总线地址
        }
        
      }
      
      return;
    }
    
    
    void AddDevice(uint16 Type){
      
      struct EquPar DeviceTempBuf;
      uint8 InitNVStatus1 = osal_nv_item_init(ZD_NV_START_ADDRESS+ZD_NV_OFFSET, sizeof(DeviceTempBuf), NULL);     //新增一条地址表
      
      if(InitNVStatus1 == NV_ITEM_UNINIT){
        
        DeviceTempBuf.FunCode = Type;
        DeviceTempBuf.Address = 0x000 + ZD_NV_OFFSET - 1;
        
        osal_nv_write(ZD_NV_START_ADDRESS+ZD_NV_OFFSET, 0, sizeof(DeviceTempBuf), &DeviceTempBuf);
        //ZigbeeSend();
        ZD_NV_OFFSET++;
        
        struct AddressInfo TempBuf;
        uint8 InitNVStatus2 = osal_nv_item_init(ZD_NV_START_ADDRESS+1, sizeof(TempBuf), NULL);
        
        if(InitNVStatus2 == SUCCESS){
          
          TempBuf.BusAddress = Gateway_Bus_Address;
          TempBuf.OffsetAddress = ZD_NV_OFFSET;
          
          osal_nv_write(ZD_NV_START_ADDRESS+1, 0, sizeof(TempBuf), &TempBuf);
            
        }
      }
      return;
    }

    /*********************************************************************
     * INCLUDES
     */
    #include "SampleApp.h"
    #include "SampleAppHw.h"
    
    #include "OSAL.h"
    #include "OSAL_Nv.h"
    #include "ZGlobals.h"
    #include "AF.h"
    #include "aps_groups.h"
    #include "ZDApp.h"
    
    #include "OnBoard.h"
    
    /* HAL */
    #include "hal_lcd.h"
    #include "hal_led.h"
    #include "hal_key.h"
    
    
    /*********************************************************************
     * PUBLIC FUNCTIONS
     */
    
    void SampleApp_Init( uint8 task_id )
    {
      SampleApp_TaskID = task_id;
      SampleApp_NwkState = DEV_INIT;
      SampleApp_TransID = 0;
    
      P0SEL &= ~0x10;               //设置P0.4口为普通IO
      P0DIR |= 0x10;                //设置P0.4口为输出
      AddressTable_Init();          //执行地址功能表初始化
      
      // Device hardware initialization can be added here or in main() (Zmain.c).
      // If the hardware is application specific - add it here.
      // If the hardware is other parts of the device add it in main().
    
     #if defined ( BUILD_ALL_DEVICES )
      // The "Demo" target is setup to have BUILD_ALL_DEVICES and HOLD_AUTO_START
      // We are looking at a jumper (defined in SampleAppHw.c) to be jumpered
      // together - if they are - we will start up a coordinator. Otherwise,
      // the device will start as a router.
      if ( readCoordinatorJumper() )
        zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;
      else
        zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;
    #endif // BUILD_ALL_DEVICES
    
    #if defined ( HOLD_AUTO_START )
      // HOLD_AUTO_START is a compile option that will surpress ZDApp
      //  from starting the device and wait for the application to
      //  start the device.
      ZDOInitDevice(0);
    #endif
    
      // Setup for the periodic message's destination address
      // Broadcast to everyone
      SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;
      SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
      SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
    
      // Setup for the flash command's destination address - Group 1
      SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup;
      SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
      SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP; //组号1
      
      // Fill out the endpoint description.
      SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;
      SampleApp_epDesc.task_id = &SampleApp_TaskID;
      SampleApp_epDesc.simpleDesc
                = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
      SampleApp_epDesc.latencyReq = noLatencyReqs;
    
      // Register the endpoint description with the AF
      afRegister( &SampleApp_epDesc );
    
      // Register for all key events - This app will handle all key events
      RegisterForKeys( SampleApp_TaskID );
    
      // By default, all devices start out in Group 1
      SampleApp_Group.ID = 0x0001;
      osal_memcpy( SampleApp_Group.name, "Group 1", 7 );
      aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
    
    #if defined ( LCD_SUPPORTED )
      HalLcdWriteString( "SampleApp", HAL_LCD_LINE_1 );
    #endif
    }
    
    void SampleApp_HandleKeys( uint8 shift, uint8 keys )
    {
      (void)shift;  // Intentionally unreferenced parameter
      
      if ( keys & HAL_KEY_SW_6 )
      {
        SampleApp_SendPeriodicMessage();    //发送数据
      }
    
      if ( keys & HAL_KEY_SW_1 )
      {
        /* The Flashr Command is sent to Group 1.
         * This key toggles this device in and out of group 1.
         * If this device doesn't belong to group 1, this application
         * will not receive the Flash command sent to group 1.
         */
        aps_Group_t *grp;
        grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
        if ( grp )
        {
          // Remove from the group
          aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );
        }
        else
        {
          // Add to the flash group
          aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
        }
      }
    }
    
    
    
    
    /*********************************************************************
    *********************************************************************/

    /*********************************************************************
     * INCLUDES
     */
    #include "SampleAppHw.h"
    
    #include "OSAL.h"
    #include "OSAL_Nv.h"
    #include "ZGlobals.h"
    #include "AF.h"
    #include "aps_groups.h"
    #include "ZDApp.h"
    
    #include "OnBoard.h"
    
    /* HAL */
    #include "hal_lcd.h"
    #include "hal_led.h"
    #include "hal_key.h"
    
    #ifndef SAMPLEAPP_H
    #define SAMPLEAPP_H
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    /*********************************************************************
     * INCLUDES
     */
    #include "ZComDef.h"
    
    /*********************************************************************
     * CONSTANTS
     */
    
    // These constants are only for example and should be changed to the
    // device's needs
    #define SAMPLEAPP_ENDPOINT           20
    
    #define SAMPLEAPP_PROFID             0x0F08
    #define SAMPLEAPP_DEVICEID           0x0001
    #define SAMPLEAPP_DEVICE_VERSION     0
    #define SAMPLEAPP_FLAGS              0
    
    #define SAMPLEAPP_MAX_CLUSTERS       2
    #define SAMPLEAPP_PERIODIC_CLUSTERID 1
    #define SAMPLEAPP_FLASH_CLUSTERID    2
    #define SAMPLEAPP_COM_CLUSTERID      3
    #define SAMPLEAPP_P2P_CLUSTERID      4
      
    #define DATA_PIN P0_4                  //定义P0.5口为继电器的控制端
    
    #define ZD_NV_START_ADDRESS 0x0402     //定义掉电存储起始条目地址
      
    // Send Message Timeout
    #define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT   1000     // Every 1 seconds
    
    // Application Events (OSAL) - These are bit weighted definitions.
    #define SAMPLEAPP_SEND_PERIODIC_MSG_EVT       0x0001
      
    // Group ID for Flash Command
    #define SAMPLEAPP_FLASH_GROUP                 0x0001
      
    // Flash Command Duration - in milliseconds
    #define SAMPLEAPP_FLASH_DURATION              1000
      
    
    // This list should be filled with Application specific Cluster IDs.
    const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
    {
      SAMPLEAPP_PERIODIC_CLUSTERID,
    };
    
    void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
    
    const SimpleDescriptionFormat_t SampleApp_SimpleDesc =
    {
      SAMPLEAPP_ENDPOINT,              //  int Endpoint;
      SAMPLEAPP_PROFID,                //  uint16 AppProfId[2];
      SAMPLEAPP_DEVICEID,              //  uint16 AppDeviceId[2];
      SAMPLEAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
      SAMPLEAPP_FLAGS,                 //  int   AppFlags:4;
      SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
      (cId_t *)SampleApp_ClusterList,  //  uint8 *pAppInClusterList;
      SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
      (cId_t *)SampleApp_ClusterList   //  uint8 *pAppInClusterList;
    };
    
    // This is the Endpoint/Interface description.  It is defined here, but
    // filled-in in SampleApp_Init().  Another way to go would be to fill
    // in the structure here and make it a "const" (in code space).  The
    // way it's defined in this sample app it is define in RAM.
    endPointDesc_t SampleApp_epDesc;
    
    /*********************************************************************
     * LOCAL VARIABLES
     */
    uint8 SampleApp_TaskID;   // Task ID for internal task/event processing
                              // This variable will be received when
                              // SampleApp_Init() is called.
    devStates_t SampleApp_NwkState;
    
    uint8 SampleApp_TransID;  // This is the unique message ID (counter)
    
    afAddrType_t SampleApp_Periodic_DstAddr;
    afAddrType_t SampleApp_Flash_DstAddr;
    
    aps_Group_t SampleApp_Group;
    
    
    uint8 SampleAppPeriodicCounter = 0;
    uint8 SampleAppFlashCounter = 0;
    
    /*********************************************************************
     * GLOBAL VARIABLES
     */
    uint8 LedState = 0;                  //LED状态
    
    uint8 FunState = 0;                  //风扇状态
    
    uint8 Control = 0;                   //开关控制,0为一起,1为灯,2为风扇
    
    uint16 ZD_NV_OFFSET = 0xFFF;         //掉电存储条目偏移,初始化最大
    
    uint16 Local_Fun_Code = 0xFFFF;      //本机功能代码,初始化最大
    
    uint16 Local_Address = 0xFFF;        //本机地址码,初始化最大
    
    uint16 Gateway_Bus_Address = 0xFFF;  //子网总线地址,初始化最大
      
      
    /*********************************************************************
     * STRUCTS
     */
      
    //本机信息
    struct EquPar
    {
      uint16 FunCode;
      uint16 Address;
    };
    
    //地址功能表信息
    struct AddressInfo
    {
      uint16 BusAddress;
      uint16 OffsetAddress;
    };
    
    //数据包
    struct Packet
    {
      uint16 SourceAddress;
      uint16 TargetAddress;
      uint16 Type;
      uint16 Data;
      uint16 Verify;
    };
    
    struct Parket* ParketTempBuf = NULL;
    
    
    extern void SampleApp_Init( uint8 task_id );
    
    void SampleApp_HandleKeys( uint8 shift, uint8 keys );
    
    /*********************************************************************
     * FUNCTIONS
     */
    
    void SampleApp_SendPeriodicMessage( void );
    
    extern UINT16 SampleApp_ProcessEvent( uint8 task_id, uint16 events );
    
    extern void ReceiveData(struct Packet Data);
    
    extern uint8 ZigbeeSend(uint16 Data, uint16 Address, uint16 Type);
    
    
    extern uint16 Get_BusAddress(void);
    
    extern void AddressTable_Init(void);
    
    extern uint8* ConversionToRF(struct Packet Data);
    
    extern void ConversionToData(uint8* Data);
    
    extern void AddDevice(uint16 Type);
    
    
    /*********************************************************************
    *********************************************************************/
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* SAMPLEAPP_H */

  • 我尝试了EW8051 version 7.51A,但是并不能正常编译SmapleApp?而使用EW8051 version8.10却是可以编译SmapleApp的?

  • 你該確認你的ZStack2.3.0-1.4.0是否是TI官方提供的

  • 是的,之前从Ti官网取得的,保存在公用的只读文件服务器上

  • 移除再重新安裝zstack2.3.0-1.4.0後再用EW8051 version 7.51A編譯看看

  • 并且8.10确实可以编译协议栈原始的SmapleApp
    问题报错在原文中已给出,报错代码在之前的回复中写到了

    你先前的描述說8.10确实可以编译协议栈原始的SmapleApp,後來又說报错代码在之前的回复中写到了,所以你是可以用8.10编译协议栈原始的SmapleApp,但是加上你自己的代码就會报错,是嗎?

  • 您还在关注此帖吗?

  • 您好,

    我们仍在持续关注此帖。

  • 既然是8.10编译协议栈原始的SmapleApp沒問題,但是加上你自己的代码就會报错,建議你可以逐行檢查是哪些程序碼造成编译报错