zoukankan      html  css  js  c++  java
  • CC3200作为STA模式连接路由器sl_WlanConnect出现exception occured at:0xa72fcf6

    1. 先看下出错的提示

    2. 出错的代码部分,现在问题是定位不到哪一行代码出问题,反正运行一段时间就进入了

    lRetVal = sl_WlanConnect((signed char*)ssid, strlen(ssid), 0, &secParams, 0);

    出问题之后进入hard fault

    static void
    FaultISR(void)
    {
        while(1) {    }
    }

    3. 现在需要更多的信息来查找原因,既然都是以前的代码都运行正常的,唯一变的就是IAR编译器,是不是优化等级的问题,修改优先级依然无法解决

    4. 比较关注的一个问题,这个应该是IAR的新版本这个是32位的。但是之前编译的库是16位的。重新把库编译一下即可。

    Warning[Lt009]: Inconsistent wchar_t size 
                netcfg.o(simplelink.a) and 27 other objects in 21 different libraries have wchar_t size 16 bits 
                ap_cmd.o and 92 other objects, some of them in dl7M_tln.a and 10 other libraries have wchar_t size 32 bits 

    5. 是不是芯片的硬件版本有升级过?其他工程可以正常运行的。

    6. 是不是电流不够,在VCC和GND之间加一个大的电容测试一下,还是出错

    7. 增加一个电源供电测试一下,问题依然存在

    8. 换了之前的模块,问题依然存在

    9. 修改中断向量表初始地址,原来的默认值是0x20000000

    #define NVIC_VTABLE_BASE        0x20004000  // Vector Table Base

    10. 奇怪的是每次屏蔽一行,出问题的地方就会在下一行,难道是定时器的问题?定时器中断然后出了问题?

    11. 突然注意到一个关键点,这句话的意思是处理器接收到了一个错误的中断,难道是中断向量表没写对?

    This is the code that gets called when the processor receives a fault interrupt.

    接下来测试一下,是不是到一定时间一定会死机。想到一个问题就是目前只有那个1ms切换任务的定时器才会中断,经过测试发现,下面函数如果使用的话,就会死机

    void sys_info_init(void)
    {
        if( 0 == strcmp(g_p_wifi_para_run->wmode, "AP") )
        {
            g_sys_info.wmode = LSD_WIFI_AP;
        }
        else if( 0 == strcmp(g_p_wifi_para_run->wmode, "STA") )
        {
            g_sys_info.wmode = LSD_WIFI_STA;
        }
    
        strcpy(g_sys_info.wsssid, g_p_wifi_para_run->wsssid);
        strcpy(g_sys_info.wskey, g_p_wifi_para_run->wskey.password);
        strcpy(g_sys_info.wsmac, g_p_wifi_para_run->wsmac);
        strcpy(g_sys_info.wamac, g_p_wifi_para_run->wamac);

    继续经过测试发现死机和这个有关,g_sys_info,偶尔注意到一个参数,就是最后一个参数lps,这个是低功耗控制的,难道和它有关,再次联想低功耗是1ms定时器去处理的,所以有可能有关。

    typedef struct sys_info
    {
        uint8_t wmode;  // LSD_WIFI_AP/LSD_WIFI_STA/LSD_WIFI_APSTA
        char wsssid[33];
        char wskey[65];
        char wsmac[13];
        char wamac[13];
        uint8_t debug;
        uint32_t authmode;   // 加密方式
        uint8_t wann_mode;   // DHCP/static
        uint8_t wreconn;    // WIFI reconnect:0/1
        uint8_t wreconn_cnt;    // WIFI reconnect count
        uint8_t wreconn_cnt_2;    // WIFI reconnect count
        uint8_t lps;
    }SYS_INFO;

    修改定时器的钩子函数,屏蔽中间的函数cc_idle_task_pm,发现程序运行正常

    void vApplicationIdleHook( void)
    {
      if(g_sys_info.wmode == LSD_WIFI_STA) 
        if(enter_lps_ok == 1)
        {
            cc_idle_task_pm(); // 先关闭低功耗
        }
    }

    然后再次去分析,发现这个值是初始化为1的

    int enter_lps_ok = 1;

    12. 总结以上信息去再次分析下代码,在设置为STA模式下,进入了低功耗不能继续仿真了。自己两年前写的代码,好不记得了,所以坑了一下。

  • 相关阅读:
    Linux DNS配置
    SqlCommandBuilder 为SqlDataAdapter 提供 update、insert、delete 命令(自己利用select命令自动从数据库元数据推断)
    Dev中GridView——事件
    select 动态赋值 layui重新渲染
    url-loader和file-loader的区别和使用
    Fetch API
    Fetch API
    FormData上传文件
    Buffer、ArrayBuffer互转
    if exists用法(判断对象的用法)
  • 原文地址:https://www.cnblogs.com/429512065qhq/p/8963842.html
Copyright © 2011-2022 走看看