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.

[参考译文] CC3100:由于数据对齐问题、同步模式匹配检查期间 STM32F0硬故障

Guru**** 2577385 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/630159/cc3100-stm32f0-hard-fault-during-sync-pattern-match-check-due-to-data-alignment-issue

器件型号:CC3100

您好!

我正在尝试将 simplelink 驱动程序移植到 stm32f0。  

当 simplelink 驱动程序在 sl_start 中的第一次接收期间检查接收到的 SPI 数据中的同步模式时、它会出现硬故障。 我发现该故障是由于它用于比较数据的方法造成的。 驱动程序会将_u8缓冲区转换为_u32缓冲区、以便一次可以检查4个字节。 请参阅 driver.c 中的以下代码:  

#ifndef sl_if_type_uart
/* 1. 仅在 SPI 模式下工作时、将 CNYS 模式写入 NWP *
NWP_IF_WRITE_CHECK (g_PCB->FD、(_u8 *)&g_H2NCnysPattern.short、SYNC_pattern_LEN);
#endif

(!defined (sl_Tiny)))&&(defined (sl_GetTimestamp)))
_SlDrvStartMeasureTimeout (&TimeoutInfo、SYNC_pattern_timeout_in_msec);
#endif

/* 2. 读取8个字节(协议对齐)-预期为同步模式*/
NWP_IF_READ_CHECK (g_PCB->FD、&pBuf[0]、8);
_sl_DBG_SYNC_LOG (SyncCnt、pBuf);

/*在前4个字节与后4个字节不同时读取*/
while (*(_u32 *)&pBuf[0]=*(_u32 *)&pBuf[4])<--- 一个示例
{
NWP_IF_READ_CHECK (g_PCB->FD、&pBuf[4]、4);
}


/*扫描同步模式直至找到或超时(如果已配置)*/
while (SearchSync && TimeoutState)
{
/*扫描直到我们得到真正的同步模式*/
for (ShiftIdx =0;ShiftIdx <=4;ShiftIdx++)
{//
////找到同步模式,以便完成对齐的4个字节的读取*/
if (N2H_SYNC_pattern_match (&pBuf[ShiftIdx],g_PCc->TxNum---)--> 此处
{
/*将同步模式之后的字节复制到缓冲区起始位置*/
*(_u32 *)&pBuf[0]=*(_u32 *)&pBuf[ShiftIdx + SYNC_pattern_LEN];<--- 此处

//读取字节的其余部分*/
NWP_IF_READ_CHECK (g_PCB->FD、&pBuf[SYNC_pattern_LEN - ShiftIdx]、ShiftIdx);

//此处除了获取操作码+长度或错误加倍同步之外。*/
SearchSync = false;
break;
}
Debug_printf ("iterator:%i\n"、ShiftIdx);
}

我发现该故障是因为使用的 ARM M0处理器没有通过此代码所需的边界访问数据所需的硬件。 这是否是 Simple Link 的已知问题、是否有解决方法?

由于我意识到这是一个问题、我成功地将简单链接移植到 STM32F7。 因此,我很有信心,问题是我所说的。

谢谢

胡  

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

    让我来调查一下、看看我们以前是否遇到过这种情况。

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

    大家好、解决了问题、至少 UDP 套接字示例现在可以正常工作。  

    我将 driver.c 修改为具有 getter 和 setter 函数、该函数将转换替换为32位指针。  

    功能方面、我觉得我没有在这里使用过特别好的 C 型、但是哦、哦、好的:  

    //getter
    #define CAST32 (pBuf)((_u32)( \
    ((*(_u8*) pBuf)<0)| \
    ((*(_u8*)(pBuf+1))<8)|\
    ((*(_u8*)(pBuf+2))<<16)|\
    ((*(_u8*)(pBuf+3))<<24) \
    ))
    //setter
    #define SET32 (pBuf、Data)*((_u8*) pBuf)=(Data & 0x000000ff);\
    *((_u8*)(pBuf+1))=(数据和0x0000ff00)>> 8;\
    *((_u8*)(pBuf+2))=(数据和0x00ff0000)>> 16;\
    *((_u8*)(pBuf+3)=(数据和0xff000000)>> 24. 

    用法:

    #define N2H_SYNC_pattern_match (pBuf、TxSeqNum)\
    (\
    (((CAST32 (pBuf)& N2H_SYNC_MODE_SEQ_NUM_EXISTS)&&(MATCH_ITH_SEQ_NUM (pBuf、TxSeqNum))))||\
    (!(CAST32 (pBuf)& N2H_SYNC_MODE_SEQ_NUM_EXISTS)&(MATCH_WOUT_SEQ_NUM (pBuf)) ))\
    ) 

    此外、在同步模式校验器中(忽略 debug_printfs):  

    静态_SlReturnVal_t _SlDrvRxHdrRead (_u8 * pBuf、_u8 * pAlignSize)
    {
    u32. SyncCnt = 0;
    u8 ShiftIdx;
    u8 TimeoutState = timeout_State_init_VAL;
    u8 SearchSync = true;
    
    
    #if (!defined (sl_Tiny_EXT))&&(defined (sl_GetTimestamp))
    SlTimeoutParams_t TimeoutInfo={0};
    #endif
    
    #ifndef sl_if_type_UART
    /* 1. 仅在 SPI 模式下工作时、将 CNYS 模式写入 NWP *
    NWP_IF_WRITE_CHECK (g_PCB->FD、(_u8 *)&g_H2NCnysPattern.short、SYNC_pattern_LEN);
    #endif
    
    (!defined (sl_Tiny)))&&(defined (sl_GetTimestamp)))
    _SlDrvStartMeasureTimeout (&TimeoutInfo、SYNC_pattern_timeout_in_msec);
    #endif
    
    /* 2. 读取8个字节(协议对齐)-预期为同步模式*/
    NWP_IF_READ_CHECK (g_PCB->FD、&pBuf[0]、8);
    _sl_DBG_SYNC_LOG (SyncCnt、pBuf);
    
    #include <__cross_studio_io.h>//FIXME
    /*在前4个字节与后4个字节不同时读取*/
    int i = 0;
    //debug_printf ("\n while:");
    while (CAST32 (&pBuf[0])=CAST32 (&pBuf[4]))
    {
    NWP_IF_READ_CHECK (g_PCB->FD、&pBuf[4]、4);
    i++;
    }
    //debug_printf ("\n");
    /*扫描同步模式直至找到或超时(如果已配置)*/
    while (SearchSync && TimeoutState)
    {
    /*扫描直到我们获得真正的同步模式*/
    for (ShiftIdx =0;ShiftIdx <=4;ShiftIdx++)
    {//
    ////找到同步模式,以便完成对齐的4个字节的读取*/
    if (N2H_SYNC_pattern_match (&pBuf[ShiftIdx],g_PCc->TxNum)
    
    以启动以下字节的同步模式
    SET32 (&pBuf[0]、CAST32 (&pBuf[ShiftIdx + SYNC_pattern_LEN]);
    /*读取字节的其余部分*/
    NWP_IF_READ_CHECK (g_PCB->FD、&pBuf[SYNC_pattern_LEN - ShiftIdx]、Searchtx
    
    +),但在此
    为 FALSE +同步代码加倍;//同步为 FALSE。
    //debug_printf ("s\n");//FIXME
    break;
    }
    
    //debug_printf ("模式匹配 val:%x\n"、CAST32 (&pBuf[ShiftIdx]));
    }
    
    如果(SearchSync = true)
    {
    //找不到同步将前4个字节移至底部*//
    *(_u32 *)&pBuf[0]=*(_u32 *)&pBuf[4];
    SET32 (&pBuf[0]、CAST32 (&pBuf[4]));
    
    //将更多字节读取到缓冲区顶部*/
    NWP_IF_READ_CHECK (g_PCB->FD、&pBuf[4]、4);
    }